opencv c++ (3):像素操作4

像素的mean,std,min,max以及统计的方法

在OpenCV中,可以使用cv::minMaxLoc函数来计算图像中的最大值和最小值,使用cv::mean函数来计算图像的平均值,使用cv::meanStdDev函数来计算图像的平均值和标准差。
下面是相关代码使用。

//像素基本操作
#include <iostream>
#include<opencv.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

int main()
{


	Mat src = imread("src.jpg");

	if (src.empty())
	{
		printf("open file failed");
		return -1;
	}

	//1. 最大最小值 只支持单通道
	// 分离通道
	vector<Mat> channels;
	split(src, channels);
	imshow("B", channels[0]);
	// 最大最小值
	double min, max;
	// 最大最小值的坐标
	Point minLoc, maxLoc;

	minMaxLoc(channels[0], &min, &max, &minLoc, &maxLoc);
	cout << min << endl << max << endl << minLoc << endl << maxLoc;
	//2. 均值标准差,这个支持3通道
	//mean函数
	Scalar m = mean(src);
	Mat mm, ss;
	meanStdDev(src, mm, ss);
	cout << m << endl << mm << endl << ss;

	//3. 统计像素值
	vector<int>hist(256, 0);
	vector<int>hist2(256, 0);
	auto data = src.data;
	for (int row = 0; row < src.rows; row++)
	{
		uchar* src_row = src.ptr<uchar>(row);
		
		for (int col = 0; col < src.cols; col++)
		{	
			//data指针方式
			int pv = *data++; //B
			hist[pv]++;
			pv = *data++;    //G
			hist[pv]++;
			pv = *data++;   //R
			hist[pv]++;

			//ptr指针方式
			int pv2 = *src_row++;
			hist2[pv2]++;
			pv2 = *src_row++;
			hist2[pv2]++;
			pv2 = *src_row++;
			hist2[pv2]++;

		}
	}
	//data指针和ptr指针遍历结果一样
	cout << endl << "0:" << hist[0] << endl << "255:" << hist[255];
	cout << endl << "0:" << hist2[0] << endl << "255:" << hist2[255];
	waitKey(0);
	destroyAllWindows();
	return 0;
}

这里分别举例了data指针和ptr指针的用法

API 参数说明

minMaxLoc

void cv::minMaxLoc(InputArray src, double* minVal, double* maxVal, Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray())

参数说明:

  • src:输入的图像,可以是单通道或多通道的Mat对象。

  • minVal:指向一个double类型变量的指针,用于存储图像中的最小值。

  • maxVal:指向一个double类型变量的指针,用于存储图像中的最大值。

  • minLoc:指向Point类型变量的指针,用于存储最小值的位置(可选参数)。

  • maxLoc:指向Point类型变量的指针,用于存储最大值的位置(可选参数)。

  • mask:可选参数,用于指定一个掩码图像,只有掩码中对应位置为非零值时才会进行计算。

  • 计算最大值和最小值:

cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
double minVal, maxVal;
cv::Point minLoc, maxLoc;
cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc);
std::cout << "Min value: " << minVal << std::endl;
std::cout << "Max value: " << maxVal << std::endl;

mean

Scalar cv::mean(InputArray src, InputArray mask = noArray())

参数说明:

  • src:输入的图像,可以是单通道或多通道的Mat对象。
  • mask:可选参数,用于指定一个掩码图像,只有掩码中对应位置为非零值时才会进行计算。
  • 计算平均值:
cv::Scalar meanVal = cv::mean(img);
std::cout << "Mean value: " << meanVal[0] << std::endl;

meanStdDev

void cv::meanStdDev(InputArray src, Scalar& mean, Scalar& stddev, InputArray mask = noArray())

参数说明:

  • src:输入的图像,可以是单通道或多通道的Mat对象。
  • mean:用于存储计算得到的平均值的Scalar对象。
  • stddev:用于存储计算得到的标准差的Scalar对象。
  • mask:可选参数,用于指定一个掩码图像,只有掩码中对应位置为非零值时才会进行计算。
  • 计算平均值和标准差:
cv::Scalar mean, stddev;
cv::meanStdDev(img, mean, stddev);
std::cout << "Mean value: " << mean[0] << std::endl;
std::cout << "Standard deviation: " << stddev[0] << std::endl;

这些函数可以帮助你快速计算图像的最大值、最小值、平均值和标准差,从而对图像进行更深入的分析和处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idealmu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值