我对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)
这意味着我们有一个3x3的窗口,对吗?然后:
x1 = 0, x2 = 2, y1 = 0, y2 = 2
那 算 什么呢?如果是窗口中的像素数,为什么根据算法为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是输入图像到阈值的积分图像,假定为灰度。
intImg
我已经成功实现了该算法,所以让我们谈谈您的疑问。
那是count什么 如果是窗口中的像素数,为什么根据算法为2 * 2 = 4,而不是3 * 3 = 9?
count
他们没有谈论一个基本的假设。的价值s 需求 为奇数,而且窗口应该是:
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,我们将拥有x和y值为 负数 。我们不能拥有它,因此在此3 x 3窗口中,以居中的有效像素总数i = 0, j = 0为4,依此类推count = 4。对于在图像范围内的窗口,则为count9。
s = 3
i = 0, j = 0
x
y
count = 4
此外,为什么像素的原始值乘以计数?该论文说,将该值与周围像素的平均值进行比较,为什么不这样: 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。该算法非常巧妙。基本上,我们比较窗口in[i,j] x count内的假定平均强度()s x s,如果该强度小于该窗口内t%的 实际 平均强度s x s(sum x ((100-t)/100)),则将输出设置为黑色。如果大于,则将输出设置为白色。但是,您雄辩地说,应该改为:
in[i,j]*count
in[i,j]
s x s
in[i,j] x count
t%
sum x ((100-t)/100)
这基本上与第20行相同,但是您将等式的两边都除了count,所以它仍然是相同的表达式。我要说的是,这清楚地表明了我上面所说的内容。乘以count肯定会造成混淆,因此您写的内容更有意义。
因此,您只是以一种不同的方式看到它,那就太好了!因此,要回答您的问题,您所说的肯定是正确的,并且等同于实际算法中看到的表达式。
希望这可以帮助!