OpenCV实现图像旋转

作者: 行之与亦安 | 来源:发表于2018-02-01 22:07 被阅读118次

不知道是不是因为太简单,OpenCV不屑于去封装还是怎么回事,OpenCV中并没有一个API是专门用于实现图像任意角度的旋转的。我最近由于想要实现一下带旋转的模板匹配,因而必须对图像进行旋转。因此自己写了一个函数。下面是Python版的实现:

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


def rot_degree(img, degree):
    rows, cols = img.shape
    center = (cols / 2, rows / 2)
    mask = img.copy()
    mask[:, :] = 255
    M = cv2.getRotationMatrix2D(center, degree, 1)
    top_right = np.array((cols - 1, 0)) - np.array(center)
    bottom_right = np.array((cols - 1, rows - 1)) - np.array(center)
    top_right_after_rot = M[0:2, 0:2].dot(top_right)
    bottom_right_after_rot = M[0:2, 0:2].dot(bottom_right)
    new_width = max(int(abs(bottom_right_after_rot[0] * 2) + 0.5), int(abs(top_right_after_rot[0] * 2) + 0.5))
    new_height = max(int(abs(top_right_after_rot[1] * 2) + 0.5), int(abs(bottom_right_after_rot[1] * 2) + 0.5))
    offset_x = (new_width - cols) / 2
    offset_y = (new_height - rows) / 2
    M[0, 2] += offset_x
    M[1, 2] += offset_y
    dst = cv2.warpAffine(img, M, (new_width, new_height))
    mask = cv2.warpAffine(mask, M, (new_width, new_height))
    _, mask = cv2.threshold(mask, 128, 255, cv2.THRESH_BINARY)
    return dst, mask


if __name__ == '__main__':
    img = cv2.imread('messi5.jpg', cv2.IMREAD_GRAYSCALE)
    plt.imshow(img, cmap='gray')
    plt.show()
    dst, mask = rot_degree(img, 30)
    plt.imshow(dst, cmap='gray')
    plt.show()
    plt.imshow(mask, cmap='gray')
    plt.show()

看到代码其实就能了解到,OpenCV其实是可以实现旋转的。最关键的两个OpenCV的函数就是cv2.getRotationMatrix2Dcv2.warpAffine。只是如果要考虑旋转之后画布的大小会发生变化,就还有好多小细节要考虑到。看了代码自然知道,我就不在这里一一说明了。

messi5.png rotated.png mask.png

相关文章

  • OpenCV实现图像旋转

    不知道是不是因为太简单,OpenCV不屑于去封装还是怎么回事,OpenCV中并没有一个API是专门用于实现图像任意...

  • opencv图像旋转矩阵

    在Python opencv中图像旋转矩阵可以用来旋转源图片到目标图片、旋转源坐标点到目标坐标点。根据图像旋转矩阵...

  • 深度学习 数据增强之图片及标注框旋转

    参考:python 简单图像处理(4) 旋转 方法二(使用opencv,旋转后的图片更加清晰)

  • 几何变换之仿射---OpenCV-Python开发指南(12)

    仿射 在OpenCV中,仿射变换是指图像经过一系列的几何变换来实现的平移,旋转等多种操作。该变换能够保持图像的平直...

  • opencv C++ 图片旋转任意角度

    摘要:opencv里面似乎没有直接的旋转图片的接口,这里实现一个旋转任意角度的方法,在旋转的时候调用opencv里...

  • 正确使用OpenCV和Python旋转图像

    使用OpenCV和Python旋转图像 其中,旋转矩阵中前两列控制旋转,最后一列控制其位置(即平移) 我们先定义了...

  • opencv笔记(5): 图像旋转

    生活就像大海,我就像一条咸鱼,在浩瀚的海洋中边浪边学,这是opencv笔记系列中的「图像旋转」。 世间万图,皆可旋...

  • 移动侦测

    OpenCV图像识别、移动侦测、边缘检测实现及 cvCopy和cvCloneImage的区别 opencv,动态目标检测

  • openCV

    Opencv2图像裁剪(子图像提取) opencv之读取图像 #######opencv读取图像的灰度值并显示出来...

  • 基于GAN的face2face实现

    本文实现依赖python2.7、tensorflow、opencv、dlib,训练生成对抗模型(GAN),实现图像...

网友评论

    本文标题:OpenCV实现图像旋转

    本文链接:https://www.haomeiwen.com/subject/rnvjzxtx.html