函数:cv2.warpAffine()、cv2.getRotationMatrix2D()
说明:此函数可以对图片进行平移和旋转操作。此函数需要和python 自带的numpy库结合使用。
简单例子:
代码如下:
<code>import cv2
import numpy as np
#打开图片
img = cv2.imread('1.png',0)
cv2.imshow('a0',img)
#获取图片的长和宽
rows,cols = img.shape
#平移
#创建一个矩阵,其中100和50分别是向左平移100像素,向下平移50像素
M = np.float32([[1,0,100],[0,1,50]])
a1= cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('a1',a1)
#旋转
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
a2 = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('a2',a2)
#关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()/<code>
原图:
运行代码后:
详解:
rows,cols = img.shape
此函数是获取图片的宽(rows)和长(cols),它只能读取灰度图片的参数,所以要用img = cv2.imread('1.png',0),后面这个0代表灰度,如果改成1或者删掉,则代表彩色
M = np.float32([[1,0,100],[0,1,50]])
这个函数输出结果如下
其中100(向左)和50(向下)代表你要移动的参数
cv2.warpAffine(img,M,(cols,rows))
img是自己导入图片,M 是根据矩阵参数进行图片变化,(cols,rows)这个是代表图片(新窗口大小)
cols,和rows都等于200,如果将改成400,如cv2.warpAffine(img,M,(400,400)),则新窗口大小如下:
难点:
为什么矩阵M前面要有0和1?
其实前面部分是,
[1,0;0,1]代入函数正好算出来θ=0,即不旋转,如果要旋转一定角度,则要算出这个矩阵大小来,这是比较麻烦的,所以要用M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)进行换算。
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
(cols/2,rows/2)这是坐标是图片中心,即旋转中心,可以换成以某个坐标旋转。
90,表示逆时针旋转90°
通过这个函数,可以直接生成旋转90°的矩阵M,然后把M代入cv2.warpAffine(img,M,(cols,rows))即可得到旋转后的图片。
閱讀更多 python的圖像處理 的文章