gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:04:50 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com