如何从图像积分中找到均值、标准差和梯度?给定如下图像:
如上图所示,要找到高亮部分的总和,sum = C+A-B-D
。
所以我们有sum = 22
.
我接下来如何才能找到:
- 意思是
- 标准开发
- 坡度
如何从图像积分中找到均值、标准差和梯度?给定如下图像:
如上图所示,要找到高亮部分的总和,sum = C+A-B-D
。
所以我们有sum = 22
.
我接下来如何才能找到:
如果 C+ABC 是区域内所有灰度的总和,则均值不是
mean = C+A-B-D/4
但
mean = C+A-B-D/K
其中 K 是区域中的灰度级数。
还,
dev = sqrt( C'+A'-B'-D'/4 - (mean*mean) )
不是标准开发,因为
dev = sqrt( (1/N)*sum_N ( x_i - u )^2 )
这里的方程等价于
dev = sqrt( (1/N)*sum_N ( (x_i)^2 ) - u^2 )
这些等式是不等价的。
C+A-B-D
为您提供由 A、B、C、D 分隔的区域中的灰度总和,因此,要获得平均值,您只需按该区域的区域进行潜水:
mean = (C+A-B-D)/4
要获得开发,您必须计算平方面积表的总和(使用cv::integral
您可以传递额外的参数来获得平方和)。引用维基百科,标准偏差等于(平方的平均值减去平均值的平方)的平方根。因此,假设 A',B',C',D'正方形面积表中的值:
dev = sqrt((C'+A'-B'-D')/4 - (mean*mean))
因此,使用积分图像计算平均值和偏差使用积分图像非常快,特别是如果您想在随机位置和图像块的随机大小上计算这些数量。
关于梯度,它更复杂。您确定不想使用sobel
运算符吗?
jmch 没有说的是,如果sqrt( C'+A'-B'-D'/K - (mean*mean) )
不是你如何计算积分图像的标准偏差,那么你是怎么做的?
首先,让我切换到Python / numpy代码,这样我们得到了一点符号一致性,并且表达式更容易检查。给定一个样本数组 X,说:
X = array([random() * 10.0 for i in range(0, 9)])
的未校正样本标准差可以X
定义为:
std = (sum((X - mean(X)) ** 2) / len(X)) ** 0.5 # 1
应用二项式定理我们得到(X - mean(X)) ** 2
:
std = (sum(X ** 2 - X * 2 * mean(X) + mean(X) ** 2) / len(X)) ** 0.5 # 2
给定求和运算的恒等式,我们可以做出:
std = ((sum(X ** 2) - 2 * mean(X) * sum(X) + len(X) * mean(X) ** 2) / len(X)) ** 0.5 # 3
如果我们做S = sum(X)
, S2 = sum(X ** 2)
,我们M = mean(X)
得到N = len(X)
:
std = ((S2 - 2 * M * S + N * M ** 2) / N) ** 0.5 # 4
现在对于一个图像I
和两个积分图像P
并P2
从计算I
(其中P2
是平方像素值的积分图像),我们知道,给定四个边缘坐标A = (i0, j0)
、和,B = (i0, j1)
、和的值可以针对范围计算为:C = (i1, j0)
D = (i1, j1)
S
S2
M
N
I[A:D]
S = P[A] + P[D] - P[B] - P[C]
S2 = P2[A] + P2[D] - P2[B] - P2[C]
N = (i1 - i0) * (j1 - j0)
M = S / N
然后可以将其应用于上面的等式(4),得出范围的标准偏差I[A:D]
。
编辑:这不是完全必要的,但鉴于M = S / N
我们可以对等式(4)应用以下替换和简化:
std = ((S2 - 2 * M * S + N * M ** 2) / N) ** 0.5
std = ((S2 - 2 * (S / N) * S + N * (S / N) ** 2) / N) ** 0.5
std = ((S2 - 2 * ((S ** 2) / N) + (S ** 2 / N)) / N) ** 0.5
std = ((S2 - ((S ** 2) / N)) / N) ** 0.5
std = (S2 / N - (S / N) ** 2) ** 0.5 # 5
实际上,这与雷米给出的方程式非常接近。