学习目标:
1、学习对图像应用不同的几何变换,如平移,旋转,仿射变换等;
2、学习函数:cv2.getPerspectiveTransform。
1、转换:
OpenCV提供了两个转换函数,cv2.warpAffine和cv2.warpPerspective,可以进行各种转换。 cv2.warpAffine采用2x3变换矩阵,而cv2.warpPerspective采用3x3变换矩阵作为输入。
2、缩放:
缩放只是调整图像大小。 OpenCV为此提供了函数cv2.resize()。 图像的大小可以手动指定,也可以指定比例因子。 使用不同的插值方法。 优选的插值方法是用于缩小的cv2.INTER_AREA和用于缩放的cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。 默认情况下,对于所有调整大小的目的,使用的插值方法是cv2.INTER_LINEAR。 您可以使用以下方法调整输入图像大小:
范例(放大原始图像的2倍):
#coding:utf8
import cv2
img = cv2.imread('F:/picture.jpg')
print ("原始图像尺寸的大小:", img.shape)
#方法1
res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
print ("方法1缩放之后尺寸的大小:", res.shape)
#方法2
height, width = img.shape[:2]
res = cv2.resize(img, (2*width, 2*height), interpolation=cv2.INTER_CUBIC)
print ("方法2缩放之后尺寸的大小:", res.shape)
输出:
原始图像尺寸的大小: (280, 450, 3)
方法1缩放之后尺寸的大小: (560, 900, 3)
方法2缩放之后尺寸的大小: (560, 900, 3)
3、图像的偏移:
变换矩阵M:
#coding:utf8
import cv2
import numpy as np
img = cv2.imread('F:/picture.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', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
4、旋转:
通过形式的变换矩阵来实现对图像进行θ角度的旋转
但OpenCV提供缩放旋转,旋转中心可调,以便您可以在任何您喜欢的位置旋转。 修改后的变换矩阵由下式给出
为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D。 请检查下面的例子,它将图像相对于中心旋转90度,而不进行任何缩放。
实现代码:
#coding:utf8
import cv2
import numpy as np
img = cv2.imread('F:/picture.jpg', 0)
rows, cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img, M, (cols,rows))
cv2.imshow('original', img)
cv2.imshow('result', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出(注意:这种方法会在旋转之后显示的图像不完整):
5、仿射变换
在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。 为了找到变换矩阵,我们需要输入图像中的三个点以及它们在输出图像中的相应位置。 然后cv2.getAffineTransform将创建一个2x3矩阵,并将其传递给cv2.warpAffine。
实现代码:
#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:/picture.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()
输出:
6、透视转化
对于透视变换,您需要一个3x3变换矩阵。 即使在改造之后,直线仍将保持直线。 要找到这个变换矩阵,您需要输入图像上的4个点和输出图像上的对应点。 在这4点中,其中3个不应该在线。 然后可以通过函数cv2.getPerspectiveTransform找到变换矩阵。 然后将cv2.warpPerspective应用于这个3x3转换矩阵。
实现代码:
#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:/picture.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()
输出: