【发布时间】:2020-03-23 17:19:39
【问题描述】:
我想旋转一行复数(实际上是 Radon 变换的一行的 1D FFT),我在 Matlab 中使用imrotate,但我认为插值没有做它应该做的事情。
目标是使用投影切片定理重现从氡到图像空间的转换。
(图片来自维基百科)
我需要获取每一行的 Radon 变换并根据它的角度旋转它,并将它放在一个 2D 矩阵中的相应角度。完成此操作后,我可以获得 2D ifft2 来恢复图像(理论上)。这是目标。有人可以帮忙吗?
我想使用imrotate,但也许这不是正确的做法?目标是将 Radon 变换的 FFT 行映射到它们在圆圈中的正确位置,如上图所示。
这是旋转和最近邻插值的实际结果。右边的结果应该是通常的 SheppLogan 幻象。
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.data import shepp_logan_phantom
from skimage.transform import radon, rescale
from skimage.transform import iradon
from skimage.transform import rotate
import cv2
x=shepp_logan_phantom()
x=cv2.resize(x, (128,128), interpolation = cv2.INTER_AREA)
theta=np.linspace(0,180,len(x))
R=radon(x,theta)
temp_=np.zeros((128,128)).astype(np.complex128)
fullFft2D=np.zeros((128,128)).astype(np.complex128)
for i in range(len(theta)):
temp_[63,:]=np.fft.fftshift(np.fft.fft(R[:,i])).T
fft_real=rotate(np.real(temp_),theta[i],order=0)
fft_imag=rotate(np.imag(temp_),theta[i],order=0)
fullFft2D += fft_real+1j*fft_real
temp_=np.zeros((128,128)).astype(np.complex128)
plt.imshow(np.fft.fftshift(np.abs(np.fft.ifft2(np.fft.ifftshift(fullFft2D)))))
我已经实现了你(@Luengo)所说的:
res=np.zeros((128,128))
tmp_=np.zeros((128,128)).astype(np.complex128)
for i in range(len(theta)):
kspace_row = np.fft.fftshift(np.fft.fft(R[:,i])).T
tmp_[63,:] = kspace_row
res += rotate(np.abs(np.fft.ifft(np.fft.fftshift(tmp_))),-theta[i])
plt.imshow(res)
但它不起作用(我可能错过了什么?)
【问题讨论】:
-
我认为你应该使用最近邻插值进行旋转,否则你会得到奇怪的伪影。但实际上,无论如何,你都会得到奇怪的文物。理论上,这种方法应该在连续域中工作。但在离散域中,在实践中,这并不是真正可行的。而不是 IFT(sum(rotate(FrequencyDomainLine))),这是您尝试执行的操作,而是计算 sum(rotate(IFT(FrequencyDomainLine))),这与 IFT 与求和和旋转运算符的交换是相同的.后一种计算正是反投影实现的!
-
我确实尝试使用“最近”旋转,但我不工作。我不明白你为什么要加总和?当你说 sum(rotate(IFT(FrequencyDomainLine))) 时?我想放置一条线(以正确的角度)来创建我的 2D fft,然后对其进行 ifft。您的总和正在产生一个标量...请您开发(感谢您的贡献,我很感激!)
-
总和超过各种 1D FrequencyDomainLines。您将每个投影角度的贡献相加。
-
抱歉还是不明白。 sum(.) 产生一个标量? (我看不出我能用这个标量做什么)
-
我需要一个向量(行),我可以将它放在 2D fft 中,如我现在上传的图片所示
标签: python image-processing fft interpolation complex-numbers