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

本文详细介绍了OpenCV库中用于矩阵操作的几个关键函数,包括cv::max()和cv::min()用于获取矩阵中的最大值和最小值,cv::minMaxIdx()和cv::minMaxLoc()用于查找最大值和最小值的位置,以及cv::mean()计算平均值。此外,还提到了cv::meanStdDev()函数用于同时计算平均值和标准差。这些函数在图像处理和计算机视觉领域中具有广泛应用。
摘要由CSDN通过智能技术生成

目录

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 position
	const 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 position
	const cv::Mat& src1  // input array(second position
);
void cv::max(
	cv::InputArray src1,  // first input array
	cv::InputArray src2,  // second input array
	cv::OutputArray dst  // result array
);

void cv::max(
	const cv::Mat& src1,  // first input array
	const cv::Mat& src2,  // second input array
	cv::Mat& dst  // result array
);
void cv::max(
	const Mat& src1,  // input array
	double value,  // Scalar input
	cv::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 only
	double *minVal,  // min value
	double *maxVal,  // max value
	int* 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 array
	double* minVal,  // min value
	double* maxVal,  // max value
	int* minIdx,  // C-style array,indices of min locs
	int* maxIdx  // C-style array, indices of max locs
);

void cv::minMaxLoc(
	cv::InputArray src,  // input array
	double* minVal,  // min value
	double* maxVal,  // max value
	cv::Point* minLoc,  // loc of min goes here
	cv::Point* maxLoc,  // loc of max goes here
	cv::InputArray mask = cv::noArray()  // search only nonzero values
);
void cv::minMaxLoc(
	const cv::SparseMat& src, // input sparse array
	double* minVal,  // min value
	double* maxVal,  //max value
	cv::Point* minLoc,  // C-style array,indices of min locs
	cv::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()。

### 回答1: OpenCvSharp4是一个基于OpenCV的开源计算机视觉库,它提供了各种功能和算法,用于处理图像和视频。通过使用OpenCvSharp4,我们可以对图像进行各种统计分析,例如计算图像的直方图。 在统计图像方面,可以使用OpenCvSharp4计算图像的直方图。直方图是一种表示图像亮度分布的图形,它将图像中所有像素的亮度值进行统计,然后将统计结果以图形的形式展示出来。通过直方图,我们可以更直观地了解图像的亮度分布情况。 在OpenCvSharp4中,可以使用`Cv2.CalcHist`方法计算图像的直方图。此方法需要指定图像和通道的数量,并将结果存储在一个数组中。例如,以下代码可以计算一张灰度图像的直方图: ```csharp using OpenCvSharp; Mat image = Cv2.ImRead("image.jpg", ImreadModes.Grayscale); Mat[] images = { image }; int[] channels = { 0 }; // 使用0通道(灰度图像只有一个通道) int[] histSize = { 256 }; // 像素值范围为0到255,共256个值 Rangef[] ranges = { new Rangef(0, 256) }; // 像素值的范围 Mat hist = new Mat(); Cv2.CalcHist(images, channels, null, hist, 1, histSize, ranges); ``` 在上述代码中,`Cv2.ImRead`用于读取图像,`Cv2.CalcHist`用于计算直方图。计算完成后,直方图将存储在`hist`矩阵中。 通过分析直方图的结果,我们可以得到图像的一些统计信息,例如图像的亮度分布情况、亮度值的平均值、图像的对比度等。这些统计信息对于图像的后续处理和分析非常有用。 总结来说,OpenCvSharp4提供了方便的功能和方法,用于统计和分析图像。通过计算图像的直方图,我们可以了解图像的亮度分布情况,并得到一些有用的统计信息。 ### 回答2: 在博客园中使用 OpenCvSharp4 统计图像非常简单方便。首先,我们需要安装 OpenCvSharp4 库并导入。然后,我们可以使用该库提供的各种图像处理函数进行图像统计。 常见的图像统计包括计算图像的像素总数、最大值最小值平均值、方差和标准差等。我们可以使用 OpenCvSharp4 中的函数来实现这些统计。 例如,我们可以使用 `Cv2.ImRead` 函数读取图像并将其存储在一个 `Mat` 对象中。然后,我们可以使用 `Mat.Total` 属性获取图像的像素总数,使用 `Mat.Max` 和 `Mat.Min` 方法分别获取图像的最大值最小值。使用 `Mat.Mean` 方法可以计算图像的均值,使用 `Mat.Var` 方法可以计算图像的方差,使用 `Mat.StdDev` 方法可以计算图像的标准差。 除了这些基本的统计之外,OpenCvSharp4 还提供了其他功能强大的图像处理函数,例如直方图统计、灰度图像统计和颜色特征统计等。我们可以根据需求选择合适的函数来进行图像统计。 总的来说,OpenCvSharp4 提供了丰富的图像处理函数,可以方便地进行图像统计。在博客园中使用 OpenCvSharp4 进行图像统计,不仅可以实现基本的统计功能,而且还可以进行更加复杂的图像分析和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值