9

如何从图像积分中找到均值、标准差和梯度?给定如下图像:

总面积表和普通数字表

如上图所示,要找到高亮部分的总和,sum = C+A-B-D
所以我们有sum = 22.

我接下来如何才能找到:

  • 意思是
  • 标准开发
  • 坡度
4

3 回答 3

3

如果 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 )

这些等式是不等价的。

于 2013-02-20T19:45:18.460 回答
3

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运算符吗?

于 2012-10-28T21:35:01.057 回答
3

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和两个积分图像PP2从计算I(其中P2是平方像素值的积分图像),我们知道,给定四个边缘坐标A = (i0, j0)、和,B = (i0, j1)、和的值可以针对范围计算为:C = (i1, j0)D = (i1, j1)SS2MNI[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

实际上,这与雷米给出的方程式非常接近。

于 2014-01-21T04:09:18.483 回答