摘要:为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的相应位置。代码透视变换对于透视变换,需要一个变换矩阵。
Geometric Transformations of Images
1图像转换OpenCV提供了两个转换函数cv2.warpAffine和cv2.warpPerspective,可以使用它们进行各种转换。 cv2.warpAffine采用2x3变换矩阵,而cv2.warpPerspective采用3x3变换矩阵作为输入。
2图像缩放缩放只是调整图像大小.为此,OpenCV附带了一个函数cv.resize().
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
对shrinking,优选的interpolation方法:cv2.INTER_AREA该方法可以避免波纹的出现
对zooming,优选的interpolation方法:cv2.INTER_CUBIC和cv2.INTER_LINEAR(默认)
方法一
import numpy as np import cv2 img = cv2.imread("messi5.jpg") res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
方法二
import numpy as np import cv2 height, width = img.shape[:2] res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)3图像平移
平移是对象位置的转换。 如果你知道(x,y)方向的偏移,让它为(tx,ty),你可以创建变换矩阵M,如下所示:
$$ M= left[ egin{matrix} 1 & 0 & tx 0 & 1 & ty end{matrix} ight] $$
可以将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数.
应用按(100,50)平移
代码:
import cv2 import numpy as np img = cv2.imread("img.jpg",0) rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow("img",img) cv2.imshow("dst",dst) cv2.waitKey(0) cv2.destroyAllWindows()4图像旋转
通过变换矩阵实现图像旋转角度θ:
$$ M= left[ egin{matrix} cosθ & -sinθ sinθ & cosθ end{matrix} ight] $$
OpenCV提供可调旋转,旋转中心可调,因此可以在任何的位置旋转.修正的变换矩阵由下式给出:
$$ left[ egin{matrix} alpha & eta & (1-alpha) cdot center.x - etacdot center.y -eta & alpha & etacdot center.x + (1-alpha) cdot center.y end{matrix} ight] $$
$ alpha = scale cdot cosθ $
$ eta = scale cdot sinθ $
为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D.
应用将图像相对于中心旋转90度而不进行任何缩放
代码:
import cv2 import numpy as np img = cv2.imread("img.jpg",0) rows,cols = img.shape # cols-1 and rows-1 are the coordinate limits. M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow("img",img) cv2.imshow("dst",dst) cv2.waitKey(0) cv2.destroyAllWindows()5仿射变换
在仿射变换中,原始图像中的所有平行线仍将在输出图像中平行。 为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的相应位置。 然后cv.getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv.warpAffine。
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread("img5.jpg") rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.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()5透视变换
对于透视变换,需要一个3x3变换矩阵。 即使在转换之后,直线仍将保持笔直. 要找到此变换矩阵,输入图像上需要4个点,输出图像上需要相应的点. 在这4个点中,其中3个不应该共线. 然后可以通过函数cv2.getPerspectiveTransform找到变换矩阵. 然后将cv2.warpPerspective应用于此3x3变换矩阵。
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread("img6.jpg") 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 = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(300,300)) plt.subplot(121),plt.imshow(img),plt.title("Input") plt.subplot(122),plt.imshow(dst),plt.title("Output") plt.show()
NOTE:
仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”.
从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面.透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41991.html
阅读 1608·2021-11-23 10:07
阅读 2603·2019-08-30 11:10
阅读 2819·2019-08-29 17:08
阅读 1757·2019-08-29 15:42
阅读 3128·2019-08-29 12:57
阅读 2379·2019-08-28 18:06
阅读 3508·2019-08-27 10:56
阅读 363·2019-08-26 11:33