这张图片代表了我在openCV练习中使用Fourier变换所做的工作。这是一个消除周期性噪音的练习。我正在检测产生噪音的波段,并用一个遮罩将其删除。如您所见,我使用的是dft_shift
中的产品。我假设它的乘积是0,我的问题是:如果这个值是0,为什么那几行是白色的???在
代码:
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT) #calcula la transf. Fourier
dft_shift = np.fft.fftshift(dft) #proyecta los cuadrantes de la imagen
dft_shift = dft_shift*mask2
f_ishift = np.fft.ifftshift(dft_shift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
完成脚本Here
解决方案
如果打印出}的结果是
product
图像数组中的值,您将发现白色带中的所有像素实际上都有一个值-inf
,而不是0
。在代码中,作为创建product
过程的一部分,您可以使用np.log
来重新缩放一些数据。该数据中有0
,而{-inf
。在你可以用几种不同的方法来解决这个问题。最简单的选择是将
product
中的所有-inf
值替换为0
。创建product
之后,如果添加以下行:然后,当您绘制
product
时,它将具有黑色带,如您所预期的:深潜
下面是您在
^{pr2}$product
中得到-inf
的原因。这是代码中创建product
的行:如果我们把它分成两行,我们就可以知道发生了什么:
magnitude
有{原因是Matplotlib在选择颜色时会缩放数据,这样图像数组中最小的值为黑色,最大值为白色。这里的问题是
magnitude
中的最大值远远大于几乎所有其他值。因此,你会得到一些白色的像素(靠近中心),而其他像素几乎都是黑色的。在通过将
vmax=1000
传递给用于绘制图像的imshow
函数,可以使magnitude
的绘图显示更多的底层细节。这将为colormap设置显式的最大数据值:这远不是理想的,因为这意味着图像的很大一部分显示为完全饱和的白色,而不管其潜在的细节。在
实际上,在代码中已经有了更好的解决方法:使用
^{4}$np.log
重新缩放magnitude
中的数据。重新缩放的结果是product
数组的所有值将更加接近。这有利于您在绘制product
时看到图像中的细节。但是,您在这里遇到的问题是0的对数是无穷大的:因此,在}带。Matplotlib处理这些
magnitude
中的0
带成为product
中的{-inf
值,方法是将它们着色为与输入数组中的最大值相同的颜色(例如白色)。这样,您就得到了在绘制的product
图像中看到的白色条纹。在相关问题 更多 >
编程相关推荐