OpenCV getRotationMatrix2D():实现图像旋转(附带实例)
图像的旋转是数字图像处理中一个非常重要的环节,是图像的几何变换手法之一。
一般图像的旋转是以图像的中心为原点的,将图像上的所有像素都旋转一个相同的角度。图像的旋转变换时图像的位置变换,旋转后图像的大小一般会改变。在图像旋转变换中既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。
可以利用 OpenCV 提供的库函数 getRotationMatrix2D() 来实现图像旋转。该函数用来计算出旋转矩阵,其声明如下:
该函数的返回值为一个 2×3 的矩阵,其中矩阵前两列代表旋转,最后一列代表平移。
【实例】实现图像的旋转。
【实例】不出现裁剪的旋转。
运行工程,结果如下图所示:
一般图像的旋转是以图像的中心为原点的,将图像上的所有像素都旋转一个相同的角度。图像的旋转变换时图像的位置变换,旋转后图像的大小一般会改变。在图像旋转变换中既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。
可以利用 OpenCV 提供的库函数 getRotationMatrix2D() 来实现图像旋转。该函数用来计算出旋转矩阵,其声明如下:
getRotationMatrix2D(center, angle, scale) -> retval各个参数的含义如下:
- center 表示旋转的中心点;
- angle 表示旋转的角度;
- scale 表示图像缩放因子。
该函数的返回值为一个 2×3 的矩阵,其中矩阵前两列代表旋转,最后一列代表平移。
【实例】实现图像的旋转。
import cv2 import numpy as np img=cv2.imread('test.jpg') rows,cols=img.shape[:2] #第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是旋转后的缩放因子 M=cv2.getRotationMatrix2D((cols/2,rows/2),60,1.2) #第三个参数是输出图像的尺寸中心,图像的宽和高 shuchu=cv2.warpAffine(img,M,(2*cols,rows)) while(1): cv2.imshow('Result',shuchu) if cv2.waitKey(1)&0xFF==27: break cv2.destroyAllWindows()运行工程,结果如下图所示。旋转完成的图片都是原始大小。

【实例】不出现裁剪的旋转。
import cv2 import numpy as np img = cv2.imread('test.jpg') def rotate_bound(image, angle): # 抓取图像的尺寸,然后确定中心 (h, w) = image.shape[:2] (cX, cY) = (w // 2, h // 2) # 抓取旋转矩阵(应用角度的负数顺时针旋转),然后抓取正弦和余弦 # (即矩阵的旋转分量) M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0) cos = np.abs(M[0, 0]) sin = np.abs(M[0, 1]) # 计算图像的新边界尺寸 nW = int((h * sin) + (w * cos)) nH = int((h * cos) + (w * sin)) # 调整旋转矩阵以考虑平移 M[0, 2] += (nW / 2) - cX M[1, 2] += (nH / 2) - cY # 执行实际旋转并返回图像 shuchu = cv2.warpAffine(image, M, (nW, nH)) while (1): cv2.imshow('shuchu', shuchu) if cv2.waitKey(1) & 0xFF == 27: break rotate_bound(img, 45)在上述代码中,首先抓取图像的尺寸,然后确定中心,接着抓取旋转矩阵、正弦和余弦,再计算图像的新边界尺寸,调整旋转矩阵以考虑平移,最后执行实际旋转并返回图像。
运行工程,结果如下图所示:
