我有这张图片,我想抑制这张图片中的峰值,这些峰值代表了原始图片中的划痕(但这不是重点)。我想要的只是制作一个算法,自动识别图像中的峰值,然后抑制它们(使其变为 0)。

from skimage.draw import disk
import matplotlib.pyplot as plt
original = plt.imread('orginal image.jpg')
plt.figure(figsize=(15,15))
plt.imshow(original)
plt.show()

import math

# Calculate the next power of 2 for both dimensions
next_power_of_2_x = 2 ** math.ceil(math.log2(original.shape[0] + 249))
next_power_of_2_y = 2 ** math.ceil(math.log2(original.shape[1]))

# Pad the array to the next power of 2 in both dimensions
f = np.pad(original, ((0, next_power_of_2_x - original.shape[0]), (0, next_power_of_2_y - original.shape[1]), (0, 0)))

f_hat = fft2(f, axes=(0, 1))
shifted = np.fft.fftshift(f_hat)

# magnitude and phase
mag=np.abs(shifted)
phase=np.unwrap(np.angle(shifted))

plt.figure(figsize=(10,10))
plt.imshow(np.log(1+np.linalg.norm(mag,axis=-1)),cmap='gray')
plt.show()

# strong peaks
mag_norm=np.linalg.norm(mag,axis=-1).copy()

rr,cc=disk((1024,1024),80)
mag_norm[rr, cc]=0
mag_norm[mag_norm<mag_norm.max()*0.01]=0

plt.figure(figsize=(10,10))
plt.imshow(np.log(1+mag_norm),cmap='gray')
plt.show()

# weak peaks
mag_norm=np.linalg.norm(mag,axis=-1).copy()

rr,cc=disk((1024,1024),100)
mag_norm[rr, cc]=0
mag_norm[mag_norm<mag_norm.max()*0.001]=0

plt.figure(figsize=(10,10))
plt.imshow(np.log(1+mag_norm),cmap='gray')
plt.show()

# set periodic patterns to zero
centers_strong=[(1000,1000)]
for r,c in centers_strong:
    for center in [(r,c),(2024-r,c),(r,2024-c),(2024-r,2024-c)]:
        rr,cc=disk(center,20)
        mag[rr, cc]=0

centers_weak=[(1000,1000)]
for r,c in centers_weak:
    for center in [(r,c),(2024-r,c),(r,2024-c),(2024-r,2024-c)]:
        rr,cc=disk(center,10)
        mag[rr, cc]=0

mag[:,1000]=0
mag[:,2024-1000]=0

mag[1000,:]=0
mag[2024-1000,:]=0
plt.figure(figsize=(10,10))
plt.imshow(np.log(1+np.linalg.norm(mag,axis=-1)),cmap='gray')
plt.show()

%%time
# combine modified magnitude and phase, take inverse fft
m=mag*np.exp(1j*phase)
m=np.fft.ifftshift(m)
m=np.real(ifft2(m,axes=(0,1)))[:1150,...]

m/=m.max()
m = np.abs(m)
plt.figure(figsize=(15,15))
#plt.imshow(m, vmin=0, vmax=1)

plt.imshow(1-m, cmap='gray')
plt.show()

这是我编写的代码,通过它我得到了给定的结果。你可以看看这些库,我用 Python 编写了代码。

我想要什么?我希望该算法是 Python 的,它可以自动检测 FFT 峰值(坐标)然后抑制它们。如果有人知道如何实现这一点,我们将非常感谢您的帮助。提前致谢。

32

  • 请告知您想要的山峰。在图片副本中标记它们。


    – 

  • 我已添加图片,并对图片进行了评论。如果您想要原始图片,我也可以添加。


    – 

  • 上下文:


    – 

  • 原始图像可以帮助我们获得可重现的结果?@coldaf_876


    – 

  • 1
    你们花了 28 条评论来弄清楚OP 的意思。我认为是时候停止讨论并投票认为需要详细信息或澄清。或者打开聊天室,以加快讨论速度。


    – 



最佳答案
2

不要对另一个答案中乱码的噪声图像感到惊慌。那是由于Imagemagick造成的。

FFT 处理确实没有帮助。它可能会消除一些方向性划痕,但那有什么用呢?是的,没什么用。而且它还会引入其他伪影。我的建议:忘掉 FFT。

输入:

带有空白区域的频谱(可视化,不是真实数据):

经过正确的逆FFT之后:

为了向您说明 FFT 处理对您没有帮助,我处理了您的图像。如果没有图形叠加,FFT 频谱中就没有任何显著特征。

输入:

频谱(幅度对数):

我手动在水平明亮区域上画了黑线,避开中心。

然后我使用黑化图像和相位图像逆转了该过程。

为了命令的简单和效率,我使用 Imagemagick 来进行处理。

彩色噪声是由于 Imagemagick 处理了输入图像的所有 3 个通道而产生的。我没有将其转换为灰度。

4

  • 这也是我想说的,问题中看到的“环”和“线”伪影不是由于划痕造成的,而是由于原始图像中的注释造成的。因此,FFT 中的峰值检测的想法并不是真正基于实际图像的结果


    – 

  • 1
    @Tino D这就是为什么我坚持要获得一张没有图形覆盖的图像。我想我们都走在了同一条路上。


    – 

  • 1
    imagemagick 噪声不是由于颜色处理造成的。它可能是某些每个通道的阈值,或者它没有考虑 FFT 往返所需的缩放,而只是剪切了值。


    – 


  • 处理中没有每个通道的阈值。


    –