首页 > 编程笔记 > Python笔记 阅读:2

OpenCV getRotationMatrix2D():实现图像旋转(附带实例)

图像的旋转是数字图像处理中一个非常重要的环节,是图像的几何变换手法之一。

一般图像的旋转是以图像的中心为原点的,将图像上的所有像素都旋转一个相同的角度。图像的旋转变换时图像的位置变换,旋转后图像的大小一般会改变。在图像旋转变换中既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。

可以利用 OpenCV 提供的库函数 getRotationMatrix2D() 来实现图像旋转。该函数用来计算出旋转矩阵,其声明如下:
getRotationMatrix2D(center, angle, scale) -> retval
各个参数的含义如下:
该函数的返回值为一个 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)
在上述代码中,首先抓取图像的尺寸,然后确定中心,接着抓取旋转矩阵、正弦和余弦,再计算图像的新边界尺寸,调整旋转矩阵以考虑平移,最后执行实际旋转并返回图像。

运行工程,结果如下图所示:

相关文章