正确使用OpenCV和Python旋转图像

使用OpenCV和Python旋转图像

import cv2
import matplotlib.pyplot as plt
import numpy as np

def cv_show(name,img):
    """图像显示函数
    name:字符串,窗口名称
    img:numpy.ndarray,图像
    """
    cv2.namedWindow(name,cv2.WINDOW_NORMAL)
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def img_show(name,img):
    """matplotlib图像显示函数
    name:字符串,图像标题
    img:numpy.ndarray,图像
    """
    if len(img.shape) == 3:
        img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img,'gray')
    #plt.xticks([])
    #plt.yticks([])
    plt.xlabel(name,fontproperties='FangSong',fontsize=12)
    
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))
    
    # 调整旋转矩阵的移动距离(t_{x}, t_{y})
    M[0,2] += (nW/2) - cx
    M[1,2] += (nH/2) - cy
    
    return cv2.warpAffine(image,M,(nW,nH))



if __name__=="__main__":

    img1 = cv2.imread("gooey.jpg")
    img2 = rotate_bound(img1,20)
    #cv_show('rotate15',img2)
    plt.figure(figsize=(12,8),dpi=80)
    plt.subplot(121)
    img_show('原图',img1)
    plt.subplot(122)
    img_show('顺时针旋转20°',img2)
图像旋转20°.png
旋转矩阵.jpg

其中,旋转矩阵中前两列控制旋转,最后一列控制其位置(即平移)

我们先定义了 rotate_bound 函数。

  • 此方法接受输入图像image并以角度angle旋转它。

  • 获取图像宽w、高h,确定旋转中心,将围绕其中心(x,y) 。

  • 调用 cv2 .getRotationMatrix2D 获取我们的旋转矩阵 M。但是,要调整任何图像边框截断问题,我们需要自己的手动计算旋转后的图像的宽高。我们首先从旋转矩阵M中获取余弦值和正弦值 。这使我们能够计算旋转图像的新宽度和高度,确保图像的任何部分都不会被切断。

  • 一旦我们知道了新的宽度和高度,我们就可以通过再次修改旋转矩阵来调整图像的位置 。

  • 最后,调用 cv2.warpAffine函数旋转实际图像,同时确保没有图像被截断。

参考资料
网址:
Opencv中的几何变换
https://www.pyimagesearch.com/2017/01/02/rotate-images-correctly-with-opencv-and-python/

你可能感兴趣的:(正确使用OpenCV和Python旋转图像)