2012-10-28 160 views
8

如何从图像积分中找到平均值,标准偏差和梯度?给定的图像,例如,如下所示:计算图像积分

summed area table and normal table of numbers

如上图所示,找到了突出部分的总和,sum = C+A-B-D
所以我们有sum = 22

我怎么能在下进行,以便找到:

  • 平均
  • 标准偏差
  • 梯度
+2

我完全不明白你的问题。你能改善它吗? – ArtemStorozhuk

+0

您想查找某个图像部分(ROI)的_mean_,_std dev_和_gradient_? – ArtemStorozhuk

+0

我想找到所有图像的平均值,标准偏差和梯度。 – Mzk

回答

2

C+A-B-D为您提供了灰度等级的总和由界的区域A,B,C,D,所以,为了得到平均值,您只需要将区域划分为区域:

mean = (C+A-B-D)/4 

要获得开发,你必须计算平方米范围表的总和(使用cv::integral你可以传递一个额外的参数,以获得平方的总和)。引用wikipedia时,标准差等于(平均值减去平均值的平方)的平方根。因此,假设A“ B”,C“ d”在你广场面积表中的值:

dev = sqrt((C'+A'-B'-D')/4 - (mean*mean)) 

因此,在计算平均值,并使用积分图像dev为非常快速使用积分图像,特别是如果你想要在随机位置和图像块的随机大小上计算这些数量。

关于渐变,它更复杂。你确定你不想使用sobel运算符吗?

+0

你说,使用积分图像的计算均值和开发速度尤其快速,尤其是随机位置或大小。那么你的意思是应用在整个图像上会慢一些吗? Sobel操作员是否快速? – Mzk

+0

来计算梯度,sobel是快速的,仔细实现(在频域卷积)。如果你必须在每个像素上得到一个固定尺寸的neighbourhood的平均值,那么使用boxFilter可能是一个好主意,也许更快,但我不确定。我认为这将是毫秒级的问题。但是你不会以这种方式获得开发者。当需要速度时,整体图像是一个不错的选择 – remi

+0

@remi你确定公式是正确的吗?至少是平均值?不是(C + A-B-D)/ 4吗? – maximus

3

如果C + A-B-C是区域中的所有灰度级的总和,则平均值不

mean = C+A-B-D/4 

mean = C+A-B-D/K 

其中K是在该区域graylevels的数量。

此外,

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) 

这些方程是不等价的。

+0

不错的一个。谢谢@jmch。 – Mzk

+0

事实上,正如我在答案中所展示的,雷米在正确的轨道上推导出标准偏差公式,他只是偶然找到了平均值。 – xperroni

2

jmch没有说的是,如果sqrt(C'+A'-B'-D'/K - (mean*mean))不是你如何计算积分图像的标准偏差,那么你怎么做呢?

首先,让我切换到Python/numpy的代码,所以我们得到了一点符号一致性和表达式更容易检查。给定样本阵列X,说:

X = array([random() * 10.0 for i in range(0, 9)]) 

Xuncorrected sample standard deviation可以作为被定义为:

std = (sum((X - mean(X)) ** 2)/len(X)) ** 0.5 # 1 

运用binomial theorem(X - mean(X)) ** 2我们得到:

std = (sum(X ** 2 - X * 2 * mean(X) + mean(X) ** 2)/len(X)) ** 0.5 # 2 

鉴于identities的总和操作,我们可以做:

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

这是相当接近方程式雷米了,其实。