python opencv入门 几何变换(11)

327 阅读3分钟
内容来自OpenCV-Python Tutorials 自己翻译整理

目标
移动、旋转、仿射变换等等
cv2.getPerspectiveTransform函数

变换
opencv中有cv2.warpAffine函数和 cv2.warpPerspective函数。上述函数可以实现所有类型的变换cv2.warpAffin参数是2*3的变换矩阵,cv2.warpPerspective函数是3*3的变换矩阵

放缩
放缩仅仅改变图像尺寸。opencv提供的函数cv2.resize()可以实现此功能。图片的尺寸可以手动指定,或者指定缩放因子。可以不同的插值运算方法。在缩放时推荐的插值运算方法是 cv2.INTER_AREA,在扩展时推荐使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下改变图像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一种方法改变图像尺寸。

import cv2
import numpy as np

img = cv2.imread('3.jpg')
#None为图像尺寸时,fx和fy参数是缩放因子
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
cv2.imshow('q',res)


#两倍放大
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
cv2.imshow('p',res)
cv2.waitKey(0)
平移

平移就是移动对象位置。如果你知道移动方向(x,y),移动距离是(tx,ty),可以创建如下矩阵。


可以将矩阵放进numpy的数组当中,存为np.float32类型,并将其传入cv2.warpAffine() 函数当中。下面例子移动了(100,50)。

import cv2
import numpy as np

img = cv2.imread('3.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()

第三个参数是输出图像的大小,(宽,高),分别对应列数和行数

旋转
旋转矩阵如下:


在opencv中可以在任意位置旋转,所以矩阵如下

pencv提供了cv2.getRotationMatrix2D函数来实现旋转矩阵

下图对图片旋转90度,没进行放缩(图片略)


import cv2

import numpy as np

img = cv2.imread('6.jpg',0)

rows,cols = img.shape


M=cv2.getRotationMatrix2D((cols/2,rows/2),90,1)

dst = cv2.warpAffine(img,M,(cols,rows))


cv2.imshow('p',dst)

cv2.waitKey(0)

仿射变换

仿射变换中,图中的平行线变换后依然平行。创建仿射变换矩阵需要在图像中找三个点和这三个点在输出图像的位置。使用cv2.getAffineTransform函数创建仿射变换矩阵,矩阵2*3,矩阵会被传递给cv2.warpAffine函数


import cv2

import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('7.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()

透视变换
透视变换需要3*3的矩阵,透视变换后直线还是直线,建立透视矩阵需要在图像上找4个点和在输出图像上的对应位置,四个点任意三个不能共线cv2.getPerspectiveTransform() 构建矩阵,并将矩阵传递到函数cv2.warpPerspective


import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('7.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()

产生近大远小的效果

更多免费技术资料可关注:annalin1203