gpt4 book ai didi

python - 使用巴特沃斯滤波器去除正弦噪声

转载 作者:太空狗 更新时间:2023-10-29 17:20:01 24 4
gpt4 key购买 nike

我正在尝试消除此图像中的正弦噪声:

enter image description here

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

enter image description here

我已经有一个 Butterworth 滤镜可以应用于此图像。它会消除中频峰值。加载后我会小心地将它从 [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)

编辑

原始源代码中存在错误,其中滤波器虚部被加载为零。这就是导致结果图像看起来比实际更暗的原因。我已修复此问题并评论了相关行。

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

enter image description here

比我开始时的要好,但仍然没有我希望的那么好。有人能打败这个吗?我怀疑放入更多凹口以消除剩余的峰值可能会有一些好处。

编辑 2

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

The problem is that the image used in the experiment was floating point, while the one shown in the book (and the original provided in the downloads) are 8 bits. This is required for printing, etc.

In order to duplicate the experiment, you have to start with the noise-free image and then add your own noise to it.

最佳答案

我试过使用这样修改过的过滤器: enter image description here
我得到的是这个->
enter image description here
我无法完全解释结果,但我最好的猜测是正弦噪声通过与主图像信号相互作用以某种方式产生二次、三次……谐波噪声波。结果也远非理想,似乎这里仍然存在一些噪声谐波......顺便说一句,感谢您提出有趣的问题。

编辑:

我第二次尝试改进过滤器。过滤器:
enter image description here筛选结果:
enter image description here
这次似乎看不到清晰的正弦噪声模式。

关于python - 使用巴特沃斯滤波器去除正弦噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com