- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经实现了“从非周期对象的傅立叶变换幅度进行相位检索”论文中的方法,可在:https://pdfs.semanticscholar.org/4796/592751aaa5b316aaefbd5eab09ca51fad580.pdf
作者通过过采样重建对象,然后使用 HIO 迭代过程后的幅度。
阅读论文的图形部分指出:“通过过采样从复值对象的傅立叶变换幅度进行图像重建的示例;”
当我仅使用幅度进行重建时,我得到的看起来像空白图像。我这样做正确吗?我是否误解了论文的含义?
import matplotlib.pyplot as plt
import numpy as np
import scipy.ndimage as nd
img = nd.imread("einstein.bmp", flatten=True)
numIters = 500
# Pad image to simulate oversampling
initSize = img.shape
pad_len = 64
padded = np.pad(img, ((pad_len, pad_len), (pad_len, pad_len)), 'constant')
# Get initial magnitude
targetImg = np.fft.fftshift(np.fft.fft2(padded))
F_mag = np.abs(targetImg)
# Save for plotting later
startMag = np.abs(np.fft.ifft2(np.fft.ifftshift(F_mag)))
startPhase = np.angle(targetImg)
# keep track of where the image is vs the padding
mask = np.ones((initSize[0], initSize[1]))
mask = np.pad(mask, ((pad_len, pad_len), (pad_len, pad_len)), 'constant')
# Paper uses random phase for phase, adding noise here
noise = np.random.normal(0,1.5,(initSize[0], initSize[1]))
noise = np.pad(noise, ((pad_len, pad_len), (pad_len, pad_len)), 'constant')
source = F_mag * np.exp(1j * (startPhase + noise))
# Shift first then transform for inverse
imgWithNoise = np.abs(np.fft.ifft2(np.fft.ifftshift(source))) * mask
sourceImg = np.abs(np.fft.ifft2(np.fft.ifftshift(source))) * mask
# Test for proper image
# imgplot = plt.imshow(sourceImg)
# plt.show()
beta=0.8
for i in range(numIters):
print "Progress on: " + str(i) + " Of " + str(numIters)
G_k = np.fft.fftshift(np.fft.fft2(sourceImg))
G_k_phase = np.angle(G_k)
G_k_prime = F_mag * np.exp(1j*G_k_phase)
g_k_prime = np.fft.ifft2(np.fft.ifftshift(G_k_prime))
# In support i.e non negative real and imaginary
real_g_k = np.real(g_k_prime)
imag_g_k = np.imag(g_k_prime)
# x_e_S = np.where(((real_g_k > 0) & (imag_g_k > 0)))
x_e_notS = np.where(((real_g_k <= 0) & (imag_g_k <= 0) & (mask == 1)) | (mask == 0))
tmp = g_k_prime
beta_g_k_prime = beta * g_k_prime[x_e_notS]
tmp[x_e_notS] = sourceImg[x_e_notS] - beta_g_k_prime
sourceImg = tmp
G_k = np.fft.fftshift(np.fft.fft2(sourceImg))
finalMag = np.abs(G_k)
finalMagImg = np.abs(np.fft.ifft2(np.fft.ifftshift(finalMag)))
# Show magnitude plot
plt.subplot(231),plt.imshow(padded)
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(np.abs(imgWithNoise))
plt.title('Image with Noise'), plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(np.abs(sourceImg))
plt.title('Image after HIO'), plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(startMag)
plt.title('Start Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(finalMagImg)
plt.title('End Magnitude Spectrum Img'), plt.xticks([]), plt.yticks([])
plt.subplot(236),plt.imshow(finalMag)
plt.title('End Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
最佳答案
你确实误解了这篇论文。它们仅使用幅度信息来检索相位,这与仅使用幅度信息应用 IDFT 不同。
您的 FinalMagImg 不是空的,它在左上角有一个峰值。应用 fftshift
将其移动到中心,并应用对数映射来查看其余数据。如果相位全部为零,这就是逆 DFT 的样子。
关于python - 仅幅度重建看起来不正确,我的解释正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48486082/
所以,我有一个 Triangle->AABB 碰撞算法,我让它返回 AABB 碰撞的三角形。我希望三角形的 3 个 vector 和运动的方向/幅度能让我确定一个偏转 vector ,这样当你以一个角
我希望我能找到一种方法从 python 中的 mp3 中获取振幅数据。与 audacity 类似,但我不想要视觉效果,一个简单的值数组就可以了。当声音变大时,我希望我的代码在某些时候对声音使用reac
在 OpenCV 中,如何计算 Mat 中的平均梯度强度和平均梯度方向? 我已经通过谷歌搜索找到了以下方法,但我想在继续下一步之前确认我确实在正确地执行此操作。 这是正确的吗? Mat img = i
我想在 java 中为麦克风创建一个音频电平表来检查输入的音量。它应该看起来像操作系统之一。我不是在问 gui。它只是计算 产生的字节流中的音频电平 n = targetDataLine.read(
我正在开发一个应用程序,该应用程序既可以录制音频文件,也可以选择在录制完成后播放该文件。 UI 有一个 EQ 组件,该组件相对于当前录音幅度进行动画处理。我已经通过 MediaRecorder.get
我读过两篇关于从 AudioInputStream 中提取样本并将其转换为 dB 的文章。 https://stackoverflow.com/a/26576548/8428414 https://s
我的目标是在 OpenCV 中获取图像的DFT。 使用 dft 函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) . 我的结果
我的目标是在 OpenCV 中获取图像的DFT。 使用 dft 函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) . 我的结果
我正在从事一个 Python 项目,该项目模拟振动弦产生的声音。如果对于给定的字符串,我已经确定了运动的傅里叶变换,则可以通过简单的操作将这些结果更改为显示每个(音频)频率幅度的数据。 是否可以使用
我使用 apache commons 数学库来转换我的音频样本缓冲区上的 FFt 和 IFFT。 FFT 的输出给了我一组复数。频率在中间镜像。样本缓冲区大小为 4096 个样本,我得到 2048 个
我是一名优秀的程序员,十分优秀!