opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换

Geometric Transformations of Images html

1图像转换

OpenCV提供了两个转换函数cv2.warpAffinecv2.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_CUBICcv2.INTER_LINEAR(默认)

方法一spa

import numpy as np
import cv2

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

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

方法二code

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,以下所示:orm

$$ M= \left[ \begin{matrix} 1 & 0 & tx \\ 0 & 1 & ty \end{matrix} \right] \ $$htm

能够将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数.对象

应用

按(100,50)平移
代码blog

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

clipboard.png

clipboard.png

4图像旋转

经过变换矩阵实现图像旋转角度θ:ip

$$ M= \left[ \begin{matrix} cosθ & -sinθ \\ sinθ & cosθ \end{matrix} \right] \ $$

OpenCV提供可调旋转,旋转中心可调,所以能够在任何的位置旋转.修正的变换矩阵由下式给出:

$$ \left[ \begin{matrix} \alpha & \beta & (1-\alpha) \cdot center.x - \beta\cdot center.y \\ -\beta & \alpha & \beta\cdot center.x + (1-\alpha) \cdot center.y \end{matrix} \right] \ $$

$ \alpha = scale \cdot cosθ $
$ \beta = 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()

clipboard.png

clipboard.png

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

clipboard.png

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

clipboard.png

NOTE:仿射变换和透视变换更直观的叫法能够叫作“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”.从另外一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,因此要求解就须要找到3组映射点,三个点恰好肯定一个平面.透视变换的方程组有8个未知数,因此要求解就须要找到4组映射点,四个点就恰好肯定了一个三维空间.

相关文章
相关标签/搜索