17_OpenCV获取最大值、最小值、平均值、标准差等

目录

1. 获取最大值或最小值 cv::max()/min()

2. 获取最大值和最小值 cv::minMaxIdx()/minMaxLoc()

3. 获取平均值 cv::mean()

4. 获取平均值和标准差


1. 获取最大值或最小值 cv::max()/min()

cv::max()函数计算矩阵src1和src2中每个对应的像素对的最大值。cv::min()计算两个矩阵的对应元素的最小值。

这两个函数都有两种基本形式:一种是返回一个矩阵表达式,另一种是计算结果并将其放在指定的地方。在第二种情况下,如果其中一个参数是cv::Scalar,与多通道矩阵的比较是以每个通道为基础与cv::Scalar的相应元素进行比较。

// 如下函数名可以是max或min。
cv::MatExpr cv::max(const cv::Mat& src1,  // First input array(first positionconst cv::Mat& src2  // second input array
);cv::MatExpr cv::max(const cv::Mat& src1,  // first input array(first position)double value  // Scalar in second position
);
cv::MatExpr cv::max(double value,  // Scalar in first positionconst cv::Mat& src1  // input array(second position
);
void cv::max(cv::InputArray src1,  // first input arraycv::InputArray src2,  // second input arraycv::OutputArray dst  // result array
);void cv::max(const cv::Mat& src1,  // first input arrayconst cv::Mat& src2,  // second input arraycv::Mat& dst  // result array
);
void cv::max(const Mat& src1,  // input arraydouble value,  // Scalar inputcv::Mat& dst  // result array
);

使用示例:

	float fData1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };float fData2[] = { 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 };cv::Mat src1(1, 10, CV_32FC1, fData1);cv::Mat src2(1, 10, CV_32FC1, fData2);cv::Mat dst;cv::max(src1, src2, dst);std::cout << "src1 = \n " << src1 << std::endl;std::cout << "src2 = \n " << src2 << std::endl;std::cout << "dst = \n " << dst << std::endl;cv::min(src1, 5, dst);std::cout << "dst = \n " << dst << std::endl;

显示结果:

 

2. 获取最大值和最小值 cv::minMaxIdx()/minMaxLoc()

cv::minMaxIdx()和cv::minMaxLoc()两个函数都可以获取到最大值和最小值以及它们在矩阵中所处的位置,这两个函数的原型:

void cv::minMaxIdx(cv::InputArray src,  // input array single channel onlydouble *minVal,  // min valuedouble *maxVal,  // max valueint* minIdx,  // loc of min goes here (if not NULL)int *maxIdx,  // loc of max goes here (if not NULL)cv::InputArray mask = cv::noArray()  // search only nonzero values
);
void cv::minMaxIdx(const cv::SparseMat& src,  // input sparse arraydouble* minVal,  // min valuedouble* maxVal,  // max valueint* minIdx,  // C-style array,indices of min locsint* maxIdx  // C-style array, indices of max locs
);void cv::minMaxLoc(cv::InputArray src,  // input arraydouble* minVal,  // min valuedouble* maxVal,  // max valuecv::Point* minLoc,  // loc of min goes herecv::Point* maxLoc,  // loc of max goes herecv::InputArray mask = cv::noArray()  // search only nonzero values
);
void cv::minMaxLoc(const cv::SparseMat& src, // input sparse arraydouble* minVal,  // min valuedouble* maxVal,  //max valuecv::Point* minLoc,  // C-style array,indices of min locscv::Point* maxLoc  // C-style array,indices of max locs
);

这两个函数都计算矩阵src中的最小值和最大值,并且可以返回它们的位置。最小值和最大值用minVal和maxVal表示,位置用minIdx和maxIdx或minLoc和maxLoc表示。这两个函数的不同点在于:minMaxIdx()函数返回的位置类型是C风格的指针,支持的矩阵可以是任意维数;而minMaxLoc()函数返回的位置类型是cv::Point指针,支持的矩阵只能是二维矩阵。

对于minIdx或maxIdx,如果设置为NULL,表示不返回位置信息;如果minVal或maxVal设置为NULL,表示不计算。

如果处理的是稀疏矩阵(SparseMat),在搜索最大值或最小值时,仅考虑有效元素。

3. 获取平均值 cv::mean()

函数cv::mean()计算输入矩阵src中未被屏蔽的所有像素的平均值。如果src是多通道,则以每个通道为基础计算结果。函数原型:

cv::Scalar cv::mean(cv::InputArray src,cv::InputArray mask = cv::noArray()  // optional, do only where nonzero
);

计算公式:

       

4. 获取平均值和标准差

 cv::meanStdDev()计算输入矩阵src中未被屏蔽的像素的平均值以及它们的标准差。如果src是多通道的,则以每个通道为基础计算平均值和标准差。函数原型:

void cv::meanStdDev(cv::InputArray src,cv::OutputArray mean,cv::OutputArray stddev,cv::InputArray mask = cv::noArray()  // optional do only where nonzero
);

 

需要注意的是这里计算的标准差与协方差矩阵不同,这里的标准差是协方差矩阵的对角元素。如果要计算协方差矩阵,要使用cv::calcCovarMatrix()。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部