我尝试使用opencv来执行后续的图像转换。我有一个图像,我想同时旋转和平移,同时保持整体图像大小不变。我一直使用warpAffine
函数与旋转和平移矩阵来执行转换,但问题是在执行一次转换后,一些图像数据丢失,无法结转到下一次转换。
原件x1c 0d1x
旋转
**平移和旋转。**注意原始图像的角是如何被剪切掉的。
所需输出
我想要的是一个与这里的转换图像非常相似的图像,但没有角被剪掉。我理解这是因为在执行第一次仿射变换后角数据被删除。但是,我真的不知道如何在保留这些数据的同时仍然保持图像相对于其中心的原始大小。我对计算机视觉很陌生,在线性代数或矩阵数学方面没有很强的背景。我设法使工作的大多数代码都是从在线教程中学习的,所以任何和所有可访问的帮助解决这个问题将不胜感激!
下面是用于生成上述图像的代码:
import numpy as np
import cv2
def rotate_image(image, angle):
w, h = (image.shape[1], image.shape[0])
cx, cy = (w//2,h//2)
M = cv2.getRotationMatrix2D((cx,cy), -1*angle, 1.0)
rotated = cv2.warpAffine(image, M, (w,h))
return rotated
def translate_image(image, d_x, d_y):
M = np.float32([
[1,0,d_x],
[0,1,d_y]
])
return cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
path = "dog.jpg"
image = cv2.imread(path)
angle = 30.0
d_x = 200
d_y = 300
rotated = rotate_image(image, angle)
translated = translate_image(rotated, d_x, d_y)
1条答案
按热度按时间a14dhokn1#
链接旋转和平移变换正是您所需要的。
代替一个接一个地应用旋转和平移,我们可以应用具有等效链式变换矩阵的
cv2.warpAffine
。仅使用
cv2.warpAffine
一次,可防止中间图像(仅中间旋转图像,带有切角)导致的切角。链接两个变换矩阵是通过将两个矩阵相乘来完成的。
在OpenCV约定中,第一变换从左侧相乘。
2D仿射变换矩阵的最后一行总是[0,0,1]。
OpenCV转换省略了最后一行,因此
M
为2x3矩阵。链接OpenCV转换
M0
和M1
应用以下阶段:[0, 0, 1]
插入M0
和M1
。[0, 0, 1]
)以匹配OpenCV 2x3约定:高级解决方案应用以下阶段:
代码示例:
输出: