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