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

Algorithm 布拉德利自适应阈值——困惑(问题),algorithm,image-processing,adaptive-threshold,Algorithm,Image Processing,Adaptive Threshold,我有一些问题,可能是愚蠢的,关于布拉德利实施自适应阈值。我读过这篇文章,我有点困惑。主要关于这一说法: if ((in[i,j]*count) ≤ (sum*(100−t)/100)) then 假设我们有以下输入: width, i [0] [1] [2] +---+---+---+ height [0] | 1 | 2 | 2 | j +---+---+---+ [1] | 3 | 4 |

我有一些问题,可能是愚蠢的,关于布拉德利实施自适应阈值。我读过这篇文章,我有点困惑。主要关于这一说法:

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)

在[i,j]开始之前,让我们先介绍一下他们论文中所写算法的伪代码:

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
是输入图像的阈值,假设为灰度


我已经成功地实现了这个算法,所以让我们谈谈你的疑问

那么什么是计数?如果它是窗口中的像素数,为什么根据算法它是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
,我们将得到
x
y
值,它们是负值。我们不能这样做,因此此3 x 3窗口中以
i=0、j=0
为中心的有效像素总数为4,因此
count=4
。对于图像范围内的窗口,
count
将为9

此外,为什么像素的原始值乘以计数?论文说,该值与周围像素的平均值相比较,为什么不是:

   in[i,j] <= (sum/count) * ((100 - t) / 100)
我们之所以研究[i,j]*计数中的
,是因为我们假设[i,j]
中的
s x s
窗口中的平均强度。因此,如果我们检查
sxs
窗口并将所有强度相加,这等于[i,j]x计数中的
。算法相当巧妙。基本上,我们比较
sxs
窗口内[i,j]x计数中的假定平均强度(
),如果这小于
sxs
窗口内实际平均值的
t%
sum x((100-t)/100)
),则输出设置为黑色。如果大于,则输出设置为白色。然而,你雄辩地说,应该是这样:

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

[i,j]中的
请在挑选标签时多加注意。您选择了“图像”和“处理”,而不必检查它们的含义。第一个是关于图像作为文件的,第二个是关于称为处理的编程语言的。你应该用“图像处理”来代替,为什么说
s=2
?似乎您想要
s=3
s/2=1.5
。对于这种类型的问题,非整数
s/2
可能是一个问题——因此我明白您的担忧。实际上,该算法可能只是假设
s
始终是偶数,而您的示例则不是。在这种情况下,有界区域可能不包括
(x2,y2)
处的像素。太棒了!非常感谢,我现在明白了。:)
in[i,j] <= (sum/count) * ((100 - t) / 100)