OpenCV计算图像的平均值和标准差的函数meanStdDev函数的使用
计算一个矩阵的平均值和标准差,每个通道都是独立的,通过以下输出参数获取返回值:
[
N
=
∑
I
,
mask
(
I
)
≠
0
1
mean
c
=
∑
I
:
mask
(
I
)
≠
0
src
(
I
)
c
N
stddev
c
=
∑
I
:
mask
(
I
)
≠
0
(
src
(
I
)
c
−
mean
c
)
2
N
]
[\begin{array}{l} N = \sum _{I, \texttt{mask} (I) \ne 0} 1 \\ \texttt{mean} _c = \frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \texttt{src} (I)_c}{N} \\ \texttt{stddev} _c = \sqrt{\frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \left ( \texttt{src} (I)_c - \texttt{mean} _c \right )^2}{N}} \end{array}]
[N=∑I,mask(I)=01meanc=N∑I:mask(I)=0src(I)cstddevc=N∑I:mask(I)=0(src(I)c−meanc)2]
当所有的mask元素是0的时候,函数返回mean=stddev=Scalar::all(0).
注意:计算出的标准差只能是完全归一化协方差矩阵,如果需要完整的矩阵,你可以reshape多通道数组M x N到单通道矩阵M*N x mtx.channels() (只有在矩阵是连续的时候才有可能)并且把矩阵传递给calcCovarMatrix
功能:
表示一个图像的明暗变化程度,标准差越大,明暗变化越明显。
原型:
CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,
InputArray mask=noArray());
参数释义:
- 参数 src 输入数组,由1-4个通道组成,能够把结果存储到Scalar里
- 参数 mean 输出参数,计算平均值。
- 参数 stddev 输出参数,计算出的标准差
- 参数 mask 可选参数,操作掩摸,用以标记求取哪些区域。
参考:countNonZero, mean, norm, minMaxLoc, calcCovarMatrix
示例源码:
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
float sample[14] = { 12,12,3,4,7,9,56,12,13,14,12,56,34,14 };
cv::Mat image1 = cv::Mat(4, 3, CV_32FC1, sample); //单通道的矩阵
cv::Mat image2 = cv::Mat(2, 2, CV_32FC2, sample); //多通道的矩阵
cv::Scalar mean1;
cv::Scalar mean2;
cv::Mat stddevMat;
cv::Mat stddevMatM;
cv::meanStdDev(image1, mean1, stddevMat);
cv::meanStdDev(image2, mean2, stddevMatM);
//mean2 = cv::mean(image2);
std::cout << "单通道标准差:" << stddevMat << std::endl;
std::cout << "多通道标准差:" << stddevMatM << std::endl;
return 0;
}
输出结果:
更多推荐
所有评论(0)