计算机视觉(2) 图形几何变换

封面

图像几何变换

图片变换的本质就是对图片的矩阵进行操作

图片位移

矩阵仿射变换,是一系列变换的基础

图片缩放

图片缩放就是将图片宽高信息进行改变

  • 加载图片
  • 修改大小
  • 放大 缩小 等比例缩放
def resize(img,param):
    height,width,_ = get_img_info(img)
    dstHeight = int(height * param)
    dstWidth = int(height * param)
    dst = cv2.resize(img,(dstWidth,dstHeight))
    return dst

def get_img_info(img):
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    mode = imgInfo[2]
    return height, width, mode
图像缩放
img = cv2.imread('empire.jpeg',1)

dst = utils.resize(img,0.5)
cv2.imshow('resize img',dst)
cv2.waitKey(0)

在 opencv 中提供的有关缩放的方法

  • 最近临域插值
    对于缩放后像素位置 x y 如果是小数,可以按临近进行取整
  • 双线性插值
    当我们进行缩放后得到点的 x y 都是小数,这次在双线插值法不是取最近点,而是按比例进行从周围 4 个点进行取值。根据该点距离其周围 4 点的比例来将周围 4 点像素值作为目标点。
  • 像素关系重采样
  • 立方插值
def resize_nearby(img,scale):
    height,width,_ = get_img_info(img)
    dstHeight = int(height/scale)
    dstWidth = int(height/scale)
    # create empty
    dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8)
    for i in range(0,dstHeight):# row
        for j in range(0,dstWidth):#column
            iNew = int(i*(height*1.0/dstHeight))
            jNew = int(j*(width*1.0)/dstWidth)
            dstImage[i,j] = img[iNew,jNew]
    return dstImage

通过变换矩阵实现图片缩放

def resize_with_mat(img,scale):
    height,width,_ = get_img_info(img)
    # tranform array
    matTransform = np.float32([[scale,0,0],[0,scale,0]]) # 2 * 3
    dst = cv2.warpAffine(img,matTransform,(int(width*scale),int(height*scale)) )
    return dst

图片剪切

其本质是对数据进行操作,x 表示列信息 y 表示行信息。

def img_crop(img,startX,startY,h,w):
    height,width,_ = get_img_info(img)
    print(startX,(startX+h),startY,startY + w)
    dst = img[startX:(startX+w),startY:(startY + h)]
    # dst = img[100:200,100:300]
    return dst
图片裁剪

图片镜像

def img_mirror_v(img):
    height,width,deep = get_img_info(img)
    dstInfo = (height*2,width,deep)
    dst = np.zeros(dstInfo,np.uint8)
    for i in range(0,height):
        for j in range(0,width):
            dst[i,j] = img[i,j]
            # x y 
            dst[height*2-i-1,j] = img[i,j]
    for i in range(0,width):
        dst[height,i] = (0,0,255) #BGR
    return dst
图片镜像

图片位移

了解 opencv 提供有关位移的 API,
这里 matTransform 就是偏移矩阵,由该矩阵来控制图片的位置
\begin{bmatrix} 1 & 0 & 100 \ 0 & 1 & 200 \end{bmatrix}

[1,0,100],[0,1,200] 对该矩阵进行拆分为[1,0],[0,1][100],[200]
xy 为 C 矩阵
AC + B = [[1x + 0y],[0x + 1*y]] + [[100],[200]] = [[x+100],[y+200]]

def img_transform(img):
    height,width,_ = get_img_info(img)
    # tranform array
    matTransform = np.float32([[1,0,100],[0,1,200]]) # 2 * 3
    dst = cv2.warpAffine(img,matTransform,(width,height))
    return dst
图片平移

仿射变换

所谓仿射变换就是线性变换将平移,通过矩阵来控制 2D 图像,

直线变换

  • 变换前是直线的,变换后依然是直线
  • 直线比例保持不变
  • 变换前是原点的,变换后依然是原点

这里通过 左上角、左下角和右上角

def img_transform(img):
    height,width,deep = get_img_info(img)
    matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
    matDst = np.float32([[50,50],[300,height-200],[width-300,100]])
    # combination
    matAffine = cv2.getAffineTransform(matSrc,matDst) # mat
    dst = cv2.warpAffine(img,matAffine,(width,height))
    return dst
图片变换

图片旋转

有关图像旋转这里我们使用 opencv 提供 getRotationMatrix2D 来获得一个矩阵来控制旋转,getRotationMatrix2D 接受三个参数分别为,

  1. 旋转的中心点
  2. 旋转的角度
  3. 缩放的比例
def img_rotate(img):
    height,width,deep = get_img_info(img)

    # mat rotate 1 center 2 angle 3 src
    matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,0.5)
    dst = cv2.warpAffine(img,matRotate,(width,height))
    return dst
图片旋转
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容