Opencv 如何在频域中旋转非方形图像

Opencv 如何在频域中旋转非方形图像,opencv,image-processing,fft,Opencv,Image Processing,Fft,我想在频域中旋转图像。受中答案的启发,我设法旋转方形图像。(请参阅以下使用OpenCV的python脚本) 这适用于方形图像。(填充图像可以获得更好的效果) 然而,当仅使用图像的非平方部分时,频域中的旋转显示出某种剪切效应 你知道如何实现这一目标吗?很明显,我可以对图像进行填充,使其成为正方形,但所有这些的最终目的是尽可能快地旋转FFT,以实现迭代图像配准算法,这将略微降低算法的速度。根据@CrisLuengo的建议,我发现需要仿射变换来避免填充图像。显然,这将取决于图像大小和应用程序,但对于我

我想在频域中旋转图像。受中答案的启发,我设法旋转方形图像。(请参阅以下使用OpenCV的python脚本)

这适用于方形图像。(填充图像可以获得更好的效果)

然而,当仅使用图像的非平方部分时,频域中的旋转显示出某种剪切效应


你知道如何实现这一目标吗?很明显,我可以对图像进行填充,使其成为正方形,但所有这些的最终目的是尽可能快地旋转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))

我认为,要使矩形图像正确旋转,你所做的任何事情都会比仅仅使用填充慢。我同意安德烈的观点,填充会容易得多。您需要应用仿射变换。这相当于拉伸一个轴,使纵横比变为1:1,应用旋转,然后再次取消拉伸该轴以返回到原始纵横比。将这三者放在一个操作中会导致仿射变换,这比仅旋转更昂贵。虽然你已经通过应用仿射变换来旋转图像了(为什么??),但一旦你算出变换矩阵,很可能它的计算成本是相同的。@CrisLuengo我明白了。。。我将尝试应用你建议的仿射变换,但是,是的,只是填充听起来更容易。我使用的是warpAffine,据我所知,它是使用opencv旋转图像的方法。
#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))