2011-06-08 92 views
6

我在Dicrete餘弦變換(DCT)域中抑制圖像中幾個(不相等)塊的低DC頻率。之後,進行逆DCT以僅留下高頻部分來恢復圖像。如何在低頻抑制圖像後獲得清晰圖像?

cvConvertScale(img , img_32); //8bit to 32bit conversion 
cvMinMaxLoc(img_32, &Min, &Max); 
cvScale(img_32 , img_32 , 1.0/Max); //quantization for 32bit 

cvDCT(img_32 , img_dct , CV_DXT_FORWARD); //DCT 
//display(img_dct, "DCT"); 

cvSet2D(img_dct, 0, 0, cvScalar(0)); //suppress constant background 

//cvConvertScale(img_dct, img_dct, -1, 255); //invert colors 

cvDCT(img_dct , img_out , CV_DXT_INVERSE); //IDCT 
//display(img_out, "IDCT"); 

enter image description here enter image description here enter image description here

的目的是識別和隔離元件,其是存在於從圖像中先前曾檢測到的區域的高頻率。然而,在幾種情況下,文字非常薄弱(低對比度)。在這些情況下,IDCT提供的圖像太暗以至於即使高頻部分變得太弱以至於不能進一步分析工作。

有什麼操作讓我們可以在背景抑制後從IDCT獲得更清晰的圖像? CvEqualizeHist()給出了太多的噪音。

編輯:

Whole picture這裏上傳的貝利薩留問道。低頻抑制不是在整個圖像上進行,而是在文本/低頻部分周圍設置爲最小邊界矩形的小ROI上進行。

+1

那些是驗證碼? – 2011-06-08 07:04:47

+1

將DCT係數'(0,0)'設置爲零不會消除任何噪音。它將只用一個常量(這是原始圖像的平均灰度級)減去整個圖像的灰度級。新圖像將包含與原始圖像一樣多的高頻噪聲。 – rwong 2011-06-08 07:10:50

+2

在截圖中的三個測試樣本中,我認爲一個簡單的閾值應該能夠將文本與背景分開。你可能想看看二進制閾值算法。 – rwong 2011-06-08 07:15:29

回答

4

根據您的示例圖像,讓我們從一個可能的策略開始分離文本。

該代碼在Mathematica中。

(* Import your image*) 
i1 = Import["http://i.stack.imgur.com/hYwx8.jpg"]; 
i = [email protected]; 

(*Get the red channel*) 
j = i[[All, All, 1]] 
(*Perform the DCT*) 
t = FourierDCT[j]; 
(*Define a high pass filter*) 
truncate[data_, f_] := 
    Module[{i, j}, 
    {i, j} = Floor[Dimensions[data]/Sqrt[f]]; 
    PadRight[Take[data, -i, -j], Dimensions[data], 0.] 
    ]; 

(*Apply the HP filter, and do the reverse DCT*) 
k = Image[FourierDCT[truncate[t, 4], 3]] // ImageAdjust 

enter image description here

(*Appy a Gradient Filter and a Dilation*) 
l = Dilation[GradientFilter[k, 1] // ImageAdjust, 5] 

enter image description here

(*Apply a MinFilter and Binarize*) 
m = Binarize[MinFilter[l, 10], .045] 

enter image description here

(*Perform a Dilation and delete small components to get a mask*) 
mask = [email protected][m, 10] 

enter image description here

(*Finally apply the mask*) 
ImageMultiply[mask, [email protected]] 

enter image description here

待續...

編輯

回答問題中評論:

GradientFilter描述是在這裏「更多的信息」:http://reference.wolfram.com/mathematica/ref/GradientFilter.html

MinFilter介紹下 「更多信息」 在這裏:http://reference.wolfram.com/mathematica/ref/MinFilter.html

+0

看起來像這樣。還有幾個問題:Gradient Filter與OpenCV中的形態學漸變函數相同嗎?其次,什麼是MinFilter(對不起,這些東西可能會略微區別OpenCV等價物)。 – AruniRC 2011-06-13 05:29:21

+0

@AruniRC對不起,沒有OpenCV在這裏,但我更新了與使用的操作符的描述文章。 – 2011-06-13 12:02:09

+0

謝謝,現在的東西很清楚。目的不是要將整個圖像中的高頻部分隔離起來,而是要「清理」我在幾個簡單過濾器(如「筆畫寬度」)後獲得的區域。 – AruniRC 2011-06-13 17:46:45

3

通過在應用離散餘弦變換之前或在IDCT之後應用簡單的正冪律變換,可以提高對比度。這將使灰色的陰影分開。試試這個:

cvPow(img, img_hicontrast, 1.75); // Adjust the exponent to your needs 
cvConvertScale(img_highcontrast, img_32); 
+0

這看起來很有希望。一些更好的結果,但它可以工作。 – AruniRC 2011-06-09 06:25:50

+0

指數修補匠。或者在逆DCT之後嘗試放置cvPow。 – susmits 2011-06-09 07:31:04

+0

在反DCT之後放置它並沒有太大的區別。我認爲這些價值如此之低,以至於即便是權力也沒有把他們分開。 – AruniRC 2011-06-10 00:52:32

3

如果一個簡單的閾值(+也許有些形態開)是不夠的,我會建議使用擴散過濾器嘗試:它平滑無邊緣區域的噪點,但保留的邊緣非常好。之後,分割應該變得更容易。

如果在頻域過濾後邊緣變得太暗,在過濾之前用cvCanny()的結果覆蓋它們可能會有很大幫助,特別是如果您設法找到合適的平滑級別,則只能獲得有用的邊緣。