布拉德利自适应阈值——困惑(问题)

Bradley Adaptive Thresholding -- Confused (questions)

关于 Bradley 自适应阈值的实现,我有一些问题,可能是愚蠢的。我已经阅读了有关它的论文 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)

所以这意味着我们有一个 window 3x3,对吧?那么:

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

那么count是什么?如果是window中的像素个数,为什么算法是2*2=4,而不是3*3=9?更进一步,为什么像素的原始值乘以计数?

论文里说是和周围像素的平均值比较,为什么不是

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

然后呢?

有人可以给我解释一下吗?这可能是一个非常愚蠢的问题,但我想不通。

在开始之前,让我们展示一下他们论文中写的算法的伪代码:

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,假设是灰度。


这个算法我已经实现成功了,说说你的疑惑吧

What is count then? If it is number of pixels in the window, why it is 2*2=4, instead of 3*3=9 according to the algorithm?

论文中有一个他们没有谈论的潜在假设。 s的值需要为奇数,windowing应该是:

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

count固然是window中的总像素数,但也要保证不越界。你所拥有的肯定应该是 3 x 3 window,所以 s = 3,而不是 2。现在,如果 s = 3,但如果我们选择 i = 0, j = 0,我们将xy 值为 负数 。我们不能这样,因此以 i = 0, j = 0 为中心的 3 x 3 window 中的有效像素总数为 4,因此 count = 4。对于图像范围内的 windows,则 count 将为 9。

Further, why is the original value of the pixel multiplied by the count? The paper says that the value is compared to the average value of surrounding pixels, why it isn't:

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

then?

您正在查看的条件位于算法的第 20 行:

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

我们查看 in[i,j]*count 的原因是因为我们假设 in[i,j] 平均 强度 s x s window。因此,如果我们检查 s x s window 并将所有强度相加,则等于 in[i,j] x count。该算法非常巧妙。基本上,我们比较 s x s window 内假定的平均强度 (in[i,j] x count),如果这小于 实际 t% ] 在此 s x s window (sum x ((100-t)/100)) 内平均,则输出设置为黑色。如果它更大,则输出设置为白色。但是,您雄辩地表示应该改为:

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

这与第 20 行基本相同,但是你将等式两边除以 count,所以它仍然是相同的表达式。我会说这明确说明了我上面谈到的内容。 count 的乘法肯定令人困惑,因此您所写的内容更有意义。

因此,您只是以不同的方式看待它,这完全没问题!所以回答你的问题,你说的肯定是正确的,等同于实际算法中看到的表达式。


希望对您有所帮助!