我正在尝试使用OpenCV和Python的绑定。此代码旨在使用命令行参数值旋转图像。但是,它将保存为输入图像的精确副本,无需任何旋转。
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)
我的问题是旋转后保存的图像不是正在输入的图像。
输入图片:
输出:
鉴于这些输入和输出,我如何改变图像尺寸以允许30度和45度旋转?
答案 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度后,您的图像看起来像: