1. 程式人生 > 其它 >OpenCV計算影象的平均值和標準差的函式meanStdDev函式的使用

OpenCV計算影象的平均值和標準差的函式meanStdDev函式的使用

技術標籤:OpenCVopencv

計算一個矩陣的平均值和標準差,每個通道都是獨立的,通過以下輸出引數獲取返回值:

[ 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;
}

輸出結果:

在這裡插入圖片描述