我试图消除这种图像中的正弦噪声:卸下与巴特沃斯正弦噪声滤波器
这里是它的DFT谱(施加日志和任意强度缩放之后):
我已经有一个巴特沃思滤波器适用于此图像。它会敲掉中频峰值。加载完成后,我正在小心地将它从[0..255]缩放到[0..1.0]。这里的过滤器:
的结果是不是很大:
我的问题:
- 为什么仍噪声中剩余的一个显著量图片?
- 为什么结果比原始图像更暗?过滤器显然不会触及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(是的,我知道这是不是一个真正的巴特沃斯滤波器,但在这个阶段,我很高兴地尝试任何事情),这是结果:
比我刚开始时要好,但仍然不如我希望的那么好。任何人都可以打败它吗我怀疑把更多的缺口拿出来,其余的高峰可能会有一些好处。
EDIT 2
我已经联系笔者。这是他们的响应:
的问题是,在 使用的图像的实验浮点, 而在书中示出的一个( 在 下载提供的原始)是8位。这是必需的印刷 等
为了重复实验, 你必须先从无噪声 图像,然后你自己的噪声加到 它。
+1对于一个完全解释好的问题 – macarthy 2011-03-02 12:42:30
为什么不显示过滤图像的dft? – highBandWidth 2011-03-02 21:02:49
@highBandWidth,因为从滤波器和输入图像的DFT(通过乘法)确定它是微不足道的。 – misha 2011-03-02 23:07:05