2011-03-02 81 views
13

我试图消除这种图像中的正弦噪声:卸下与巴特沃斯正弦噪声滤波器

enter image description here

这里是它的DFT谱(施加日志和任意强度缩放之后):

enter image description here

我已经有一个巴特沃思滤波器适用于此图像。它会敲掉中频峰值。加载完成后,我正在小心地将它从[0..255]缩放到[0..1.0]。这里的过滤器:

enter image description here

的结果是不是很大:

enter image description here

我的问题:

  • 为什么仍噪声中剩余的一个显著量图片?
  • 为什么结果比原始图像更暗?过滤器显然不会触及DC术语,所以我期望平均强度是相同的。
  • 为什么过滤器只取出一些的峰?它来自一本教科书,所以我倾向于认为它是正确的,但是谱中还有其他高峰 - 它们是否也是噪音的一部分?我试图用同心过滤器去除它们,但是它没有做太多的事情,使得图像变得无法识别。

我拍摄了冈萨雷斯和伍兹的书Digital Image Processing的图像(裁剪)和过滤器。在他们的例子中,周期性噪声被滤波完全消除,并且图像的平均强度保持不变。

用于装载图像和滤波器我的源代码,DFT,滤波,IDFT低于:

import cv 

def unshift_crop(comp, width, height): 
    result = cv.CreateImage((width, height), cv.IPL_DEPTH_8U, 1) 
    for x in range(height): 
     for y in range(width): 
      real, _, _, _ = cv.Get2D(comp, x, y) 
      real = int(real) * ((-1)**(x+y)) 
      cv.Set2D(result, x, y, cv.Scalar(real)) 
    return result 

def load_filter(fname): 
    loaded = cv.LoadImage(fname, cv.CV_LOAD_IMAGE_GRAYSCALE) 
    flt = cv.CreateImage(cv.GetSize(loaded), cv.IPL_DEPTH_32F, 2) 
    width, height = cv.GetSize(loaded) 
    for i in range(width*height): 
     px, _, _, _ = cv.Get1D(loaded, i) 
     #cv.Set1D(flt, i, cv.Scalar(px/255.0, 0)) 
     cv.Set1D(flt, i, cv.Scalar(px/255.0, px/255.0)) 
    return flt 

if __name__ == '__main__': 
    import sys 
    fname, filt_name, ofname = sys.argv[1:] 
    img = cv.LoadImage(fname, cv.CV_LOAD_IMAGE_GRAYSCALE) 
    width, height = cv.GetSize(img) 
    src = cv.CreateImage((width*2, height*2), cv.IPL_DEPTH_32F, 2) 
    dst = cv.CreateImage((width*2, height*2), cv.IPL_DEPTH_32F, 2) 
    cv.SetZero(src) 
    for x in range(height): 
     for y in range(width): 
      px, _, _, _ = cv.Get2D(img, x, y) 
      px = float(px) * ((-1) ** (x+y)) 
      cv.Set2D(src, x, y, cv.Scalar(px, 0)) 
    cv.DFT(src, dst, cv.CV_DXT_FORWARD) 
    flt = load_filter(filt_name) 
    cv.Mul(dst, flt, src) 
    cv.DFT(src, dst, cv.CV_DXT_INV_SCALE) 
    result = unshift_crop(dst, width, height) 
    cv.SaveImage(ofname, result) 

EDIT

有在过滤器虚分量是原始源的一个错误加载为零。这是导致结果图像比实际显示更暗的原因。我已经解决了这个问题并评论了相关的一行。

使用固定源和过滤器@提供×69(是的,我知道这是不是一个真正的巴特沃斯滤波器,但在这个阶段,我很高兴地尝试任何事情),这是结果:

enter image description here

比我刚开始时要好,但仍然不如我希望的那么好。任何人都可以打败它吗我怀疑把更多的缺口拿出来,其余的高峰可能会有一些好处。

EDIT 2

我已经联系笔者。这是他们的响应:

的问题是,在 使用的图像的实验浮点, 而在书中示出的一个( 在 下载提供的原始)是8位。这是必需的印刷 等

为了重复实验, 你必须先从无噪声 图像,然后你自己的噪声加到 它。

+3

+1对于一个完全解释好的问题 – macarthy 2011-03-02 12:42:30

+0

为什么不显示过滤图像的dft? – highBandWidth 2011-03-02 21:02:49

+0

@highBandWidth,因为从滤波器和输入图像的DFT(通过乘法)确定它是微不足道的。 – misha 2011-03-02 23:07:05

回答

5

我试图使用这种改进的过滤器: enter image description here
和我所得到的是这个 - >
enter image description here
我不能完全解释的结果,但我最好的猜测是由正弦噪声与主图像信号相互作用以某种方式产生次级,第三,...谐波噪声波。 结果也很不理想,似乎仍然有一些噪音谐波仍然在这里... 顺便说一句,感谢有趣的问题。

编辑:

我对过滤器的改进的第二次尝试。过滤器:
enter image description here 筛选结果:
enter image description here
看来这一次没有明确的正弦噪声模式是可见的。

+0

感谢您在此尝试并制作出更好的过滤器!看到我更新的答案。 – misha 2011-03-03 10:53:02

3

我记得在几年前的图像处理课程中玩过这个图像,我得到了和你一样的结果。

我不知道教科书的作者是如何得到他们在书中显示的图像,但他们必须做更多的事情,然后应用巴特沃思滤镜。正如你所提到的,有更多的峰值,所以他们可能会应用更多的巴特沃斯滤波器来消除这些峰值。

但是,图像的意思确实对我保持不变。你有没有试过计算两幅图像的平均值并进行比较?这可能是因为显示时缩放比例会导致较暗的图像。

+0

感谢您的输入。我开始怀疑还有一些额外的处理。听到有人遇到同样的问题令人放心。至于图片的意思,请参阅我编辑的帖子。 – misha 2011-03-03 10:48:25