图像几何变换(移动,旋转,仿射变换等)。OpenCV提供了两个变换函数,使用这两个函数可以实现所有类型的变换:
1.cv2.warpAffine() #输入:2x3的变换矩阵
2.cv2.warpPerspective() #输入:3x3的变换矩阵
OpenCV提供函数cv2.resize()来实现图片的缩放功能。可以手动设置缩放的图片大小,或者给定一个缩放的因子,同时可以选用不同的插值方法。
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
import cv2
import numpy as np
img = cv2.imread('1.png')
img1 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_AREA)
img2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
img3 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果已知图像在x、y方向上的位移,则可以生成如下的变换矩阵:
矩阵用一个Numpy的float32的array表示,然后将矩阵作为参数,传给cv2.warpAffine()。
import cv2
import numpy as np
img = cv2.imread('1.png')
rows, cols, channels = img.shape
M = np.float32([[1,0,20], [0,1,50]]) #沿x方向平移20,沿y方向平移50
dst = cv2.warpAffine(img, M, (rows, cols))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.getRotationMatrix2D(center, angle, scale) -> retval
import numpy as np
import cv2
img = cv2.imread('1.png')
rows, cols, channels = img.shape
M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 0.6)
dst = cv2.warpAffine(img, M, (rows, cols))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持了二维图形的“平直性“(即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变)。
cv2.getAffineTransform(src, dst) -> retval
import numpy as np
import cv2
img = cv2.imread('1.png')
rows, cols, channels = img.shape
pts1 = np.float32([[40,50], [200,50], [100,250]])
pts2 = np.float32([[10,50], [220,50], [100,250]])
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (rows, cols))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.getPerspectiveTransform(src, dst) -> retval
import numpy as np
import cv2
img = cv2.imread('1.png')
rows, cols, channels = img.shape
pts1 = np.float32([[34,38], [237,33], [18,248], [251,251]])
pts2 = np.float32([[0,0], [270,0], [0,270], [270,270]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (270,270))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()