2011-03-02 86 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