关于布拉德利实现自适应阈值处理,我有一些问题,可能是愚蠢的。我读过有关它的文章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)
然后?
有人可以向我解释一下吗?这可能是一个非常愚蠢的问题,但我无法弄清楚。
答案 0 :(得分:3)
在开始之前,让我们展示他们论文中写的算法的伪代码:
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 x 3窗口,所以s = 3
,而不是2.现在,如果s = 3
,但如果我们选择i = 0, j = 0
,我们将{{1} }}和x
值否定。我们无法做到这一点,因此以y
为中心的此3 x 3窗口中的有效像素总数为4,因此i = 0, j = 0
。对于位于图像范围内的窗口,count = 4
将为9。
此外,为什么像素的原始值乘以计数?该论文称该值与周围像素的平均值进行比较,为什么它不是:
count
然后?
您正在查看的条件位于算法的第20行:
in[i,j] <= (sum/count) * ((100 - t) / 100)
我们查看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
窗口内的假设平均强度(in[i,j] x count
),以及此值{{1}中实际平均值的s x s
是否小于t%
窗口(s x s
),然后输出设置为黑色。如果它更大,则输出设置为白色。但是,你已经雄辩地声明它应该是这样的:
sum x ((100-t)/100)
这与第20行基本相同,但是您将等式的两边除以in[i,j] <= (sum/count) * ((100 - t) / 100)
,因此它仍然是相同的表达式。我会说这明确说明了我上面谈到的内容。乘以count
肯定是令人困惑的,所以你写的更有意义。
因此,您只是以不同的方式看待它,而且完全没问题!所以要回答你的问题,你所说的肯定是正确的,并且等同于实际算法中的表达式。
希望这有帮助!