用Butterworth滤波器去除正弦噪声

mpe*_*kov 14 python opencv image-processing

我试图去除此图像中的正弦噪声:

在此输入图像描述

这是它的DFT光谱(应用对数和任意强度缩放后):

在此输入图像描述

我已经有一个巴特沃斯滤镜应用于此图像.它将淘汰中频峰值.加载后我正在注意将它从[0..255]缩放到[0..1.0].这是过滤器:

在此输入图像描述

结果不是很好:

在此输入图像描述

我的问题:

  • 为什么图像中仍然存在大量噪音?
  • 为什么结果比原始图像更暗?过滤器显然没有触及DC项,所以我希望平均强度是相同的.
  • 为什么过滤器只取出一些峰值?它来自一本教科书,所以我倾向于认为它是正确的,但在频谱中还有其他峰值 - 它们也是噪声的一部分吗?我尝试使用同心滤镜去除它们,但它没有做太多好事,并使图像变暗无法识别.

我拍摄了图像(裁剪)并从Gonzalez和Woods的数字图像处理书中过滤.在它们的示例中,通过滤波完全去除周期性噪声,并且图像的平均强度保持相同.

我的加载图像和过滤器,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)
Run Code Online (Sandbox Code Playgroud)

编辑

原始源中存在一个错误,其中过滤器虚构组件被加载为零.这就是导致结果图像显得比实际更暗的原因.我修好了这个并评论了相关的一行.

使用@ 0x69提供的固定源和过滤器(是的,我知道它不是真正的巴特沃斯滤波器,但在这个阶段我很乐意尝试任何东西),这是结果:

在此输入图像描述

比我开始时更好,但仍然不如我希望的那么好.谁能打败这个?我怀疑放入更多的凹槽以取出剩余的峰值可能会带来一些好处.

编辑2

我已经联系了作者.这是他们的回应:

问题是实验中使用的图像是浮点数,而书中显示的图像(以及下载中提供的原始图像)是8位.这是打印等所必需的.

为了复制实验,您必须从无噪声图像开始,然后添加自己的噪声.

Agn*_*kas 5

我试过使用这样的修改过滤器: 在此输入图像描述
我得到的是这个 - >
在此输入图像描述
我不能完全解释结果,但我最好的猜测是通过与主图像信号交互产生的正弦噪声会以某种方式产生二次,三次......谐波噪声波.结果也远非理想,似乎仍然有一些噪音谐波仍在这里......顺便说一句,感谢有趣的问题.

编辑:

我的第二次尝试过滤器改进.过滤:
在此输入图像描述 过滤结果:
在此输入图像描述
似乎这次没有明显的正弦噪声模式可见.