我想删除图像中的垂直线(一个例子)。我做了一个二维FFT,并试图应用一个遮罩来抑制这条线。尽管如此,这种方法效率不高,因为我丢失了一部分重要的信息。如何改进FFT数据的处理?在FFT中,如何找到行?你知道吗
我的代码:
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()
----以后编辑----
我的“真实”形象:
https://image.noelshack.com/fichiers/2018/36/5/1536312281-test.png
好像那条线的宽度是1个像素。你知道吗
在这种情况下,您可以使用大小为3的水平中值滤波器去除行(应用于窄列)
编辑 用真实的图片我们可以看到水平缺陷行。你知道吗
首先,您可以使用像Sobel one这样的边缘显示过滤器来确定它们的Y位置。你知道吗
然后只对不好的区域(或者像@SilverMonkey在评论中注意到的那样,采用某种插值)应用具有大部分垂直孔径的中值滤波器。你知道吗
两次应用
CV_MEDIAN filter size 11 x 3
快速制作的OpenCV治疗示例,其中y=110和y=205附近有两个ROI(感兴趣区域)。注意对第二个缺陷的良好补偿,但是第一个缺陷需要更多的工作。独特之处得以保留。你知道吗相关问题 更多 >
编程相关推荐