3.2 图像的几何变换

2019-03-16  本文已影响0人  sumpig

变换

opencv 提供了两个转换函数,cv2.warpAffinecv2.warpPerspective,您可以使用它们进行各种转换。

缩放

缩放就是调整图像的大小。opencv为此提供了一个函数 cv2.resize()。可以手动指定图像的大小,也可以指定比例因子。使用不同的插值方法。最好的插值方法是 cv2.INTER_AREA 用于收缩,cv2.INTER_CUBIC(慢)和 cv2.INTER_LINEAR 用于放大。默认情况下,用于所有调整大小的插值方法都是 cv2.INTER_LINEAR 的。可以通过以下任一方法调整输入图像的大小:

import cv2
import numpy as np

img = cv2.imread('messi5.jpg')

res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

#OR

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

平移

平移是物体位置的移动。假设(x,y)方向的偏移量为(t_x, t_y),您可以创建转换矩阵 M,如下所示:

M=\begin{bmatrix} 1,0,t_x\\ 0,1,t_y \end{bmatrix}

您可以放入一个 np.float32 类型的 numpy 数组中,并将其传递到cv2.warpAffine() 函数中。如需转换(100,50),请参见以下示例:

import cv2
import numpy as np

img = cv2.imread('1.png', 1)
rows, cols, channel = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img, M, (cols,rows))

cv2.imshow('1', img)
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.warpaffine() 函数的第三个参数是输出图像的大小,其形式应为(宽度、高度)。记住 宽度=列数,高度=行数。

旋转

在opencv中提供了 cv2.getRotationMatrix2D() 函数获得变换矩阵。第一参数指定旋转圆点;第二个参数指定旋转角度;第三个参数指定缩放比例。看如下例子:

import cv2
import numpy as np
 
img = cv2.imread('lena.jpg', 1)
rows,cols,channel = img.shape
 
M = cv2.getRotationMatrix2D((cols/2,rows/3),90,0.4)
dst = cv2.warpAffine(img,M,(cols,rows))
 
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

放射变换

仿射变换是一种二维坐标到二维坐标之间的线性变换,并保持二维图形的“平直性”。转换前平行的线,在转换后依然平行。

为了找到变换矩阵,我们需要从输入图像中取三个点及其在输出图像中的对应位置。然后 cv2.getAffineTransform 将创建一个2x3矩阵,该矩阵将传递给 cv2.warpAffine

import cv2
import numpy as np
from matplotlib import pyplot as plt
 
img = cv2.imread('1.png', 1)
rows,cols,channel = 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()
image.png

透视变换

透视变换需要3×3的变换矩阵,直线在变换后还是保持直线。为了构造变换矩阵,你需要输入图像的4个点和对应的要输出图像的4个点;要求这4个点其中3个点不共线。使用cv2.getPerspectiveTransform函数构造透视变换矩阵。代码:

img = cv2.imread('sudokusmall.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 = 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()
image.png
上一篇 下一篇

猜你喜欢

热点阅读