2014-10-20 23 views
0

我正試圖實現Sauvola & Pietaksinen方法通過局部閾值在圖像中執行二值化。 (x,y)= mean(x,y)* [1 + k(std(x,y)/ R-1)]的每個像素(x,y)的閾值,如在arcticle「自適應文檔圖像二值化」中。平均值和標準偏差在(x,y)的鄰域內計算。 k和R分別建議爲0.5和128。在Octave中執行局部閾值時出錯

這是我的代碼如下所示:

filtered = colfilt(image, [n n], "sliding", @(x) (mean(x).*(1+0.5*(std(x)/128 - 1)))); 
image(image < filtered) = 0; 
image(image >= filtered) = 255; 

但是,我測試過的所有圖像,結果是一個完全空白的形象,這是顯然是不正確。我認爲我必須濫用colfilt函數中的某些元素,但我在Octave中新手並且直到現在都找不到它。

有人能幫我一下嗎?

在此先感謝。

+0

您是否嘗試過將圖像縮放('imshow(圖像,[])')?我同意@Andy。您不應該覆蓋函數名稱(如圖像)。 – kkuilla 2014-10-20 11:53:17

回答

2

我看不到問題。你真的應該包括你的來源,也許還包括你的輸入圖像和n的參數。順便說一句,你不應該覆蓋函數名稱(如你的情況下的圖像)。

輸入圖像:

Lenna in

pkg load image 
img = imread ("lenna256.jpg"); 
k = 0.5; 
R = 128; 
n = 5; 
filtered = colfilt(img, [n n], "sliding", @(x) (mean(x).*(1+0.5*(std(x)/128 - 1)))); 
img(img < filtered) = 0; 
img(img >= filtered) = 255; 

image (img) 
imwrite (img, "lenna_out.png") 

它創建

Lenna out

+0

感謝您指出!在一天結束時,我認爲這是一個參數值的問題,特別是R.我能夠通過忽略作者的原始建議並嘗試不同的值來改進結果,所以這不是代碼問題。我會把它標記爲固定的。 – gcolucci 2014-10-20 13:28:37