opencv - 如何在频域中旋转非正方形图像

标签 opencv image-processing fft

我想在频域中旋转图像。灵感来自 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))

这适用于方形图像。 (通过填充图像可以获得更好的结果)Squared image rotation

然而,当仅使用图像的非平方部分时,频域中的旋转显示出某种剪切效果。 Non-squared image rotation2

关于如何实现这一目标的任何想法?显然,我可以填充图像使其成为正方形,但所有这些的最终目的是为了迭代图像配准算法尽可能快地旋转 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))

Properly rotated in frequency domain

关于opencv - 如何在频域中旋转非正方形图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64441200/

相关文章:

python - 想要将彩色图像附加到列表中并使用 OpenCV 将该列表转换为灰度

javascript - 在没有 Caman JS 的情况下为 Cropper JS 添加亮度和对比度?

Python:检测和参数化图像矩阵中的简单矩形/高斯条纹图案

fft - 如何将 "zero-phase-adjust"DFT输出?

python - GUI 卡住了其余的 python 代码

python - Opencv:如何在不删除任何其他字符的情况下删除矩形黑框

python - 当我使用opencv将图像的路径传递给显示功能时出现此错误

opencv - 如何调整cvtColor灰度功能,使其保持RGB尺寸

java - 如何从 fft 结果中获取频率?

python - 将excel文件转换为python以频率