2015-04-12 28 views
1

我有一些問題,可能是愚蠢的,由布拉德利實施自適應閾值。我已閱讀關於它http://people.scs.carleton.ca:8008/~roth/iit-publications-iti/docs/gerh-50002.pdf的文件,我有點困惑。主要是對本聲明:布拉德利自適應閾值 - 困惑(問題)

if ((in[i,j]*count) ≤ (sum*(100−t)/100)) then 

讓我們假定我們有這個輸入:

  width, i 
      [0] [1] [2] 
      +---+---+---+ 
height [0] | 1 | 2 | 2 | 
j   +---+---+---+ 
     [1] | 3 | 4 | 3 | 
      +---+---+---+ 
     [2] | 5 | 3 | 2 | 
      +---+---+---+ 

,讓我們說:

s = 2 
s/2 = 1 
t = 15 
i = 1 
j = 1 (we are at the center pixel) 

因此,這意味着我們有一個窗口3x3的,對不對?然後:

x1 = 0, x2 = 2, y1 = 0, y2 = 2 

什麼是計數呢?如果它是窗口中的像素數,那麼根據算法,爲什麼它是2 * 2 = 4而不是3 * 3 = 9?此外,爲什麼像素的原始值乘以計數?

白皮書說,該值與周圍像素的平均值,它爲什麼不

in[i,j] <= (sum/count) * ((100 - t)/100) 

呢?

有人可以向我解釋這個嗎?這可能是非常愚蠢的問題,但我無法弄清楚。

+1

選取標籤時請多加註意。你選擇了「圖像」和「處理」而沒有打擾檢查他們的意思。第一個是關於圖像作爲文件,第二個是編程語言稱爲Processing。你應該改用「圖像處理」 –

+0

爲什麼你說's = 2'?好像你想's = 3'和's/2 = 1.5'。一個非整數的s/2'大概是這類問題的一個問題 - 所以我看到你的關注。其實,也許算法只是假設's'總是偶數,而你的例子不是。在這種情況下,有界區域可能是'(x2,y2)'處像素的*獨佔*。 – nobar

回答

2

在我們開始之前,我們先提出書面在他們的論文算法的僞代碼:

procedure AdaptiveThreshold(in,out,w,h) 
1: for i = 0 to w do 
2:  sum ← 0 
3:  for j = 0 to h do 
4:   sum ← sum+in[i, j] 
5:   if i = 0 then 
6:    intImg[i, j] ← sum 
7:   else 
8:    intImg[i, j] ← intImg[i−1, j] +sum 
9:   end if 
10:  end for 
11: end for 
12: for i = 0 to w do 
13:  for j = 0 to h do 
14:   x1 ← i−s/2 {border checking is not shown} 
15:   x2 ← i+s/2 
16:   y1 ← j −s/2 
17:   y2 ← j +s/2 
18:   count ← (x2−x1)×(y2−y1) 
19:   sum ← intImg[x2,y2]−intImg[x2,y1−1]−intImg[x1−1,y2] +intImg[x1−1,y1−1] 
20:   if (in[i, j]×count) ≤ (sum×(100−t)/100) then 
21:    out[i, j] ← 0 
22:   else 
23:    out[i, j] ← 255 
24:   end if 
25:  end for 
26: end for 

intImg是輸入圖像門檻integral image,假設灰度。


我已經成功實現了這個算法,所以讓我們來談談你的疑惑。

什麼是count呢?如果它是窗口中的像素數,那麼根據算法,爲什麼它是2 * 2 = 4而不是3 * 3 = 9?

在論文中有一個他們不談論的基本假設。的s需求值是奇數,而且窗口應該是:

x1 = i - floor(s/2) 
x2 = i + floor(s/2) 
y1 = j - floor(s/2) 
y2 = j + floor(s/2) 

count肯定是在窗口的像素的總數,但你還需要確保你不出門的界限。在那裏你應該有一個3×3的窗口,所以s = 3,而不是2.現在,如果s = 3,但如果我們選擇i = 0, j = 0,我們將有xy值是。我們不能有這個,因此在這個3×3窗口中的有效像素總數爲i = 0, j = 0爲4,所以count = 4。對於在圖像邊界內的窗口,則count將是9。

此外,爲什麼像素的原始值乘以計數?該文件說,該值與周圍像素的平均值進行比較,爲什麼不是:

in[i,j] <= (sum/count) * ((100 - t)/100) 

那麼呢?

你正在尋找的條件是在算法的第20行:

20: (in[i, j]×count) ≤ (sum×(100−t)/100) 

爲什麼我們一起來看看in[i,j]*count的原因是因爲我們假定in[i,j]距離平均強度s x s窗口。因此,如果我們檢查了s x s窗口並將所有強度相加,則這等於in[i,j] x count。該算法非常巧妙。基本上,我們比較s x s窗口內的假定平均強度(in[i,j] x count),並且如果這是小於t%s x s窗口(sum x ((100-t)/100))內的實際平均的,則該輸出被設定爲黑色。如果它比較大,則輸出設置爲白色。但是,你已經雄辯地指出,它應該是這個:

in[i,j] <= (sum/count) * ((100 - t)/100) 

這是基本相同線20條,但您可以通過count除以等式的兩邊,所以它仍然是同樣的表情。我會說,這明確說明了我上面談到的內容。乘以count當然令人困惑,所以你寫的更有意義。

因此,你只是看到了一種不同的方式,那很好!所以要回答你的問題,你所說的話肯定是正確的,並且等同於在實際算法中看到的表達式。


希望這有助於!

+1

太棒了!非常感謝,我現在明白了。 :) – equinox

+0

@equinox - 我的榮幸:)祝你好運! – rayryeng