Python OpenCV - 文件旋转,但颜色值被覆盖

时间:2014-01-30 00:58:04

标签: python opencv image-processing image-rotation

我正在尝试使用OpenCV和Python的绑定。此代码旨在使用命令行参数值旋转图像。但是,它将保存为输入图像的精确副本,无需任何旋转。

此代码为adapted from this answer

import cv2 as cv

def rotateImage(self, image, angle):
    print "Rotating image to angle: %s" % (angle)

    print type(image) #image is numpy.ndarray
    print type(angle) #angle is float

    center = tuple(np.array(image.shape[0:2])/2)
    matrix = cv.getRotationMatrix2D(center, angle, 1.0)
    rotate = cv.warpAffine(image, matrix, image.shape[0:2], flags=cv.INTER_LINEAR)

    fileList = self.filename.split(".")
    newFile = fileList[0] + "_rotate_%s." % (int(angle)) + fileList[1]

    print "Saving to %s" % (newFile)
    cv.imwrite(newFile, rotate)

我的问题是旋转后保存的图像不是正在输入的图像。

输入图片:enter image description here

输出:enter image description here

鉴于这些输入和输出,我如何改变图像尺寸以允许30度和45度旋转?

1 个答案:

答案 0 :(得分:3)

问题在于,旋转后,图像会延伸到原始形状的边缘之外。解决方案是扩展原始图像然后旋转。这样,重要的部分不会被切断:

import cv2 as cv
import numpy as np

def extend(image):
    nrow, ncol, ncolor = image.shape
    n = int((nrow**2 + ncol**2)**.5//2 + 1)
    new = np.zeros((2*n, 2*n, ncolor))
    a = nrow//2
    b = ncol//2
    new[n-a:n-a+nrow, n-b:n-b+ncol, :] = image
    return new

def rotateImage(fname, angle):
    print "Rotating image to angle: %s" % (angle)

    image = cv.imread(fname, -1)
    print type(image) #image is numpy.ndarray
    print type(angle) #angle is float
    image = extend(image)

    center = tuple(np.array(image.shape[0:2])/2)
    matrix = cv.getRotationMatrix2D(center, angle, 1.0)
    rotate = cv.warpAffine(image, matrix, image.shape[0:2], flags=cv.INTER_LINEAR)

    fileList = fname.split(".")
    newFile = fileList[0] + "_rotate_%s." % (int(angle)) + fileList[1]

    print "Saving to %s" % (newFile)
    cv.imwrite(newFile, rotate)

extend函数创建一个更大的数组(基于原始图像的对角线的大小)并将原始图像放在中心。我用np.zeros创建了更大的图像,这意味着延伸返回的图像有一个大的黑色边框。此扩展需要在图像旋转之前完成。

旋转45度后,您的图像看起来像:

enter image description here