用FFT去除图像中的直线

2024-09-28 03:13:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想删除图像中的垂直线(一个例子)。我做了一个二维FFT,并试图应用一个遮罩来抑制这条线。尽管如此,这种方法效率不高,因为我丢失了一部分重要的信息。如何改进FFT数据的处理?在FFT中,如何找到行?你知道吗

enter image description here

我的代码:

import numpy as np
import matplotlib.pyplot as plt
from skimage import io
from skimage import data, img_as_float

Path_input = "C:\\Users\\yoyo\\Desktop\\"

imggray = img_as_float(data.astronaut())[:,:,0]*255 #opening image 
imggray[:,254:255] = 0 #force a vertical line
plt.imshow(imggray);plt.show()

imfft = np.fft.fft2(imggray)
mags = np.abs(np.fft.fftshift(imfft))
angles = np.angle(np.fft.fftshift(imfft))
visual = np.log(mags)
visual2 = (visual - visual.min()) / (visual.max() - visual.min())*255
plt.imshow(visual2);plt.show()

mask = io.imread(Path_input + 'mask_astro.png')[:,:,0]
mask = (mask < 100)
visual[mask] = np.mean(visual)

newmagsshift = np.exp(visual)
newffts = newmagsshift * np.exp(1j*angles)
newfft = np.fft.ifftshift(newffts)
imrev = np.fft.ifft2(newfft)
newim2 = np.abs(imrev).astype(np.float32)

plt.imshow(newim2);plt.show()

----以后编辑----

我的“真实”形象:

enter image description here

https://image.noelshack.com/fichiers/2018/36/5/1536312281-test.png


Tags: fromioimportfftasshownpplt
1条回答
网友
1楼 · 发布于 2024-09-28 03:13:51

好像那条线的宽度是1个像素。你知道吗

在这种情况下,您可以使用大小为3的水平中值滤波器去除行(应用于窄列)

编辑 用真实的图片我们可以看到水平缺陷行。你知道吗

首先,您可以使用像Sobel one这样的边缘显示过滤器来确定它们的Y位置。你知道吗

然后只对不好的区域(或者像@SilverMonkey在评论中注意到的那样,采用某种插值)应用具有大部分垂直孔径的中值滤波器。你知道吗

两次应用CV_MEDIAN filter size 11 x 3快速制作的OpenCV治疗示例,其中y=110和y=205附近有两个ROI(感兴趣区域)。注意对第二个缺陷的良好补偿,但是第一个缺陷需要更多的工作。独特之处得以保留。你知道吗

enter image description here

相关问题 更多 >

    热门问题