- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
关于 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
count 是什么?如果是窗口的像素数,为什么算法是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
的值需要为奇数,开窗应该为:
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
。对于图像边界内的窗口,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
窗口内的强度。因此,如果我们检查 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)
),则输出设置为黑色的。如果它更大,则输出设置为白色。但是,您 Eloquent 地表示应该改为:
in[i,j] <= (sum/count) * ((100 - t) / 100)
这与第 20 行本质上相同,但是您将等式两边除以 count
,所以它仍然是相同的表达式。我会说这明确说明了我上面谈到的内容。 count
的乘法肯定令人困惑,因此您编写的内容更有意义。
因此,您只是以不同的方式看待它,这完全没问题!所以回答你的问题,你说的肯定是正确的,等同于实际算法中看到的表达式。
希望这对您有所帮助!
关于algorithm - 布拉德利自适应阈值——困惑(问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29593939/
我是一名优秀的程序员,十分优秀!