3-2 图像几何变换—OpenCV-Python教程翻译

目标

  • 掌握对图像进行不同的几何变换,例如平移、旋转和仿射变换等
  • 掌握函数: cv2.getPerspectiveTransform等

平移变换

OpenCV提供两个平移函数cv2.warpAffine和cv2.warpPerspective,通过这两个函数可以实现所有的平移变换。cv2.warpAffine使用一个2×3阶变换矩阵,cv2.warpPerspective则使用一个3×3阶变换矩阵。

缩放

缩放就是修改图像尺寸大小,openCV提供函数cv2.resize()实现这个功能。可以手动指定要修改的图像大小尺寸,或者指定缩放因子。另外,提供不同的插值函数可供选择。缩小图像推荐使用cv2.INTER_AREA,方法推荐使用cv2.INTER_CUBIC(速度慢)或者cv2.INTER_LINEAR。通常情况下,默认使用cv2.INTER_LINEAR。下面的代码将展示如何缩放一个图像

import numpy as np
import cv2 as cv
img = cv.imread('lena.jpg')
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
#或者
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

其中的核心代码是cv2.resize()。dst=cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]),其中src是源图像;dst是输出图像,输出图像和源图像的数据格式相同;dsize是输出图像尺寸,如果它等于0,则按照dsize =  Size(round(fx*src.cols), round(fy*src.rows))的形式计算。因此,dsize或者fx、fy必须有一个不等于0;fx是水平轴方向的缩放因子,当fx=0时,按照(double)dsize.width/src.cols的格式计算;fy是垂直轴方向的缩放因子,当fy=0时,按照(double)dsize.height/src.rows的格式计算;interpolation是插值方法。

平移

平移是移动物体的位置,当我们知道要在x、y方向移动多少时,可以用(tx, ty)来表示。可以创建如下格式的平移矩阵M

 可以用Numpy矩阵来创建一个np.float32矩阵,传递给cv2.warpAffine函数。下面的代码将实现将图像平移(100,50)

import numpy as np
import cv2 as cv
img = cv.imread('lena.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))
cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()

 旋转

将图像旋转一个\theta角,将产生一个旋转矩阵

 OpenCV提供了一个可以选择旋转中心位置并缩放图像的旋转方法,我们可以在任何想要的位置旋转图像。因此,旋转矩阵将修改成下面的格式

OpenCV提供函数cv2.getRotationMatrix2D来获得旋转矩阵,下面的代码将相对于中心位置旋转图像90°,同时维持图像大小

img = cv.imread('lena.bmp',0)
rows,cols = img.shape
M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv.warpAffine(img,M,(cols,rows))

 仿射变换

在仿射变换中,原来图像中的平行线在输出图像中仍然是平行线。为了找到变换矩阵,我们需要输入图像上的三个点以及在输出图像上对应位置。然后函数cv2.getAffineTransform将会创建一个2×3矩阵传递给函数cv2.warpAffine。

下面的代码将演示如何进行仿射变换,被选择的三个点用绿色标记了。

img = cv.imread('drawing.png')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

 透视变换

透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。我们需要一个3×3阶的变换矩阵来完成透视变换。在透视变换中,直线仍然是直线。为了获得变换矩阵,我们需要输入图像上的四个点和输出图像上相应的位置。在这四个点中的三个点不能共线。可以通过函数cv2.getPerspectiveTransform获得变换矩阵,将3×3变化矩阵传递给cv2.warpPerspective。

下面的代码将展示函数如何应用

img = cv.imread('sudoku.png')
rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')

 参考资料

"Computer Vision: Algorithms and Applications", Richard Szeliski

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值