OpenCV篇5---图像的几何变换

学习目标:

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()

输出:


猜你喜欢

转载自blog.csdn.net/songchunxiao1991/article/details/80226510
今日推荐