代码之家  ›  专栏  ›  技术社区  ›  user3601754

用FFT去除图像中的直线

  •  0
  • user3601754  · 技术社区  · 8 年前

    我想删除一个图像的垂直线(一个例子)。我做了一个二维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

    1 回复  |  直到 8 年前
        1
  •  3
  •   Scott Stensland    8 年前

    好像那条线的宽度是1像素。

    在这种情况下,你可以去掉水平线 中值滤波器 尺寸3(适用于窄柱)


    用真实的图片我们可以看到水平的缺陷行。

    首先,你可以确定他们的Y位置,使用像Sobel-one这样的边缘显示过滤器。

    然后,只对坏的区域(或者某种插值,就像@SilverMonkey在评论中注意到的那样)应用带有垂直光圈的中值滤波器。

    使用 CV_MEDIAN filter size 11 x 3 应用两次,在y=110和y=205附近有两个ROI(感兴趣区域)。注意第二个缺陷的良好补偿,但第一个缺陷需要更多的工作。特色得以保留。

    enter image description here