Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 计算图像积分_Opencv - Fatal编程技术网

Opencv 计算图像积分

Opencv 计算图像积分,opencv,Opencv,如何从图像积分中求出平均值、标准偏差和梯度?给出如下图像: 如上图所示,要查找突出显示部分的总和,sum=C+A-B-D 所以我们有sum=22 我下一步如何才能找到: 卑鄙 标准开发 梯度 C+A-B-D给出了由A、B、C、D分隔的区域中的灰度总和,因此,要获得平均值,只需将其除以该区域的面积即可: mean = (C+A-B-D)/4 要获得dev,必须计算面积表的平方和(使用cv::integral可以传递额外的参数以获得平方和)。引用,标准偏差等于(平方的平均值减去平均值的平方)的

如何从图像积分中求出平均值、标准偏差和梯度?给出如下图像:

如上图所示,要查找突出显示部分的总和,
sum=C+A-B-D

所以我们有
sum=22

我下一步如何才能找到:

  • 卑鄙
  • 标准开发
  • 梯度

C+A-B-D
给出了由A、B、C、D分隔的区域中的灰度总和,因此,要获得平均值,只需将其除以该区域的面积即可:

mean = (C+A-B-D)/4
要获得dev,必须计算面积表的平方和(使用
cv::integral
可以传递额外的参数以获得平方和)。引用,标准偏差等于(平方的平均值减去平均值的平方)的平方根。因此,假设A',B',C',D'平方面积表中的值:

dev = sqrt((C'+A'-B'-D')/4 - (mean*mean))
因此,使用积分图像计算平均值和偏差是非常快速的,特别是如果你想在随机位置和图像块的随机大小上计算这些量


关于梯度,它更复杂。您确定不想使用
sobel
运算符吗

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

mean = C+A-B-D/4
但是

其中K是分区中的灰度级数

而且

不是stdev,因为

dev = sqrt( (1/N)*sum_N ( x_i - u )^2 )
这里的方程等价于

dev = sqrt( (1/N)*sum_N ( (x_i)^2 ) - u^2 )

这些方程是不等价的。

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

首先,让我切换到/code,这样我们可以获得少量的符号一致性,并且表达式更容易检查。给定一个样本数组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-平均值(X))**2
进行应用,我们得到:

std = (sum(X ** 2 - X * 2 * mean(X) + mean(X) ** 2) / len(X)) ** 0.5 # 2
std = ((S2 - 2 * M * S + N * M ** 2) / N) ** 0.5 # 4
考虑到求和运算的复杂性,我们可以:

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 = (sum(X ** 2 - X * 2 * mean(X) + mean(X) ** 2) / len(X)) ** 0.5 # 2
std = ((S2 - 2 * M * S + N * M ** 2) / N) ** 0.5 # 4
现在对于一个图像
I
和两个积分图像
p
P2
(其中
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)进行以下替换和简化:


这与雷米给出的方程式非常接近。

我根本不明白你的问题。你能改进它吗?你想找到一些图像部分(ROI)的平均值、标准偏差和梯度吗?我想找到所有图像的平均值、标准偏差和梯度。当然,你可以从一个整型图像中计算平均值/标准偏差/梯度,但在原始图像中要容易得多。。积分图像的平均值/标准偏差/梯度与原始图像相同。。您只需要“反向计算”每个值(从原始图像中获取值)->实际上没有理由为此使用整数图像。。如果你想在dev/std-dev/gardent中使用“sum=C+a-B-D”这样的简短形式,我想没有了。一开始,我也是这么想的@KoKuToru。但是,我看到一些人说,通过使用积分,速度非常快。所以,我想试试看。你们说用积分图像计算平均值和偏差很快,特别是在随机位置或大小的情况下。那么,您的意思是应用于整个图像的速度较慢吗?Sobel算子快吗?为了计算梯度,Sobel算子通过仔细的实现(频域卷积)很快。如果你必须得到一个固定大小的邻域的每个像素的平均值,使用boxFilter可能是一个好主意,也许更快,但我不确定。在我看来,这将是一个毫秒的问题。但是你不能以这种方式获得dev。速度较低时,积分图像是一个很好的选择required@remi你确定公式正确吗?至少是平均值?是不是(C+A-B-D)/4?不错。谢谢@jmch。事实上,正如我在回答中所说,雷米在推导标准偏差公式方面走的是正确的道路,他只是偶然发现了平均因子。
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