我有这张图片,我想抑制这张图片中的峰值,这些峰值代表了原始图片中的划痕(但这不是重点)。我想要的只是制作一个算法,自动识别图像中的峰值,然后抑制它们(使其变为 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
最佳答案
2
不要对另一个答案中乱码的噪声图像感到惊慌。那是由于Imagemagick造成的。
FFT 处理确实没有帮助。它可能会消除一些方向性划痕,但那有什么用呢?是的,没什么用。而且它还会引入其他伪影。我的建议:忘掉 FFT。
输入:
带有空白区域的频谱(可视化,不是真实数据):
经过正确的逆FFT之后:
|
为了向您说明 FFT 处理对您没有帮助,我处理了您的图像。如果没有图形叠加,FFT 频谱中就没有任何显著特征。
输入:
频谱(幅度对数):
我手动在水平明亮区域上画了黑线,避开中心。
然后我使用黑化图像和相位图像逆转了该过程。
为了命令的简单和效率,我使用 Imagemagick 来进行处理。
彩色噪声是由于 Imagemagick 处理了输入图像的所有 3 个通道而产生的。我没有将其转换为灰度。
4
-
这也是我想说的,问题中看到的“环”和“线”伪影不是由于划痕造成的,而是由于原始图像中的注释造成的。因此,FFT 中的峰值检测的想法并不是真正基于实际图像的结果
– -
1
@Tino D
这就是为什么我坚持要获得一张没有图形覆盖的图像。我想我们都走在了同一条路上。
– -
1imagemagick 噪声不是由于颜色处理造成的。它可能是某些每个通道的阈值,或者它没有考虑 FFT 往返所需的缩放,而只是剪切了值。
–
-
处理中没有每个通道的阈值。
–
|
–
–
–
–
–
|