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=NI:mask(I)=0src(I)cstddevc=NI:mask(I)=0(src(I)cmeanc)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;
}

输出结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jndingxin/article/details/113605536