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}]
當所有的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;
}
輸出結果: