如何在频域中旋转非平方图像 [英] How to rotate a non-squared image in frequency domain

查看:7
本文介绍了如何在频域中旋转非平方图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在频域中旋转图像。受到Image rotation and scaling the frequency domain?中答案的启发,我设法旋转了正方形图像。(请参阅以下使用OpenCV的Python脚本)

M = cv2.imread("lenna.png")
M=np.float32(M)
hanning=cv2.createHanningWindow((M.shape[1],M.shape[0]),cv2.CV_32F)
M=hanning*M
sM = fftshift(M)
rotation_center=(M.shape[1]/2,M.shape[0]/2)
rot_matrix=cv2.getRotationMatrix2D(rotation_center,angle,1.0)

FsM = fftshift(cv2.dft(sM,flags = cv2.DFT_COMPLEX_OUTPUT))
rFsM=cv2.warpAffine(FsM,rot_matrix,(FsM.shape[1],FsM.shape[0]),flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
IrFsM = ifftshift(cv2.idft(ifftshift(rFsM),flags=cv2.DFT_REAL_OUTPUT))

这对正方形图像效果很好。(填充图像可以获得更好的效果)

然而,当只使用图像的非平方部分时,在频域中的旋转表现出某种剪切效应。

关于如何实现这一点有什么想法吗?显然,我可以填充图像以使其成为正方形,但所有这些操作的最终目的是为迭代图像配准算法尽可能快地旋转FFT,这会略微减慢算法的速度。

推荐答案

按照@CrisLuengo的建议,我找到了避免填充图像所需的仿射变换。显然,这将取决于图像大小和应用程序,但对于我的情况来说,避免填充是非常有趣的。 修改后的脚本现在如下所示:

#rot_matrix=cv2.getRotationMatrix2D(rotation_center,angle,1.0)
kx=1.0
ky=1.0
if(M.shape[0]>M.shape[1]):
    kx= float(M.shape[0]) / M.shape[1]
else:
    ky=float(M.shape[1])/M.shape[0]

affine_transform = np.zeros([2, 3])
affine_transform[0, 0] = np.cos(angle)
affine_transform[0, 1] = np.sin(angle)*ky/kx
affine_transform[0, 2] = (1-np.cos(angle))*rotation_center[0]-ky/kx*np.sin(angle)*rotation_center[1]
affine_transform[1, 0] = -np.sin(angle)*kx/ky
affine_transform[1, 1] = np.cos(angle)
affine_transform[1, 2] = kx/ky*np.sin(angle)*rotation_center[0]+(1-np.cos(angle))*rotation_center[1]

FsM = fftshift(cv2.dft(sM,flags = cv2.DFT_COMPLEX_OUTPUT))
rFsM=cv2.warpAffine(FsM,affine_transform, (FsM.shape[1],FsM.shape[0]),flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
IrFsM = ifftshift(cv2.idft(ifftshift(rFsM),flags=cv2.DFT_REAL_OUTPUT))

这篇关于如何在频域中旋转非平方图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆