介绍了计算像素均值、方差的API,以及统计像素信息的方法。相关API:
- minMaxLoc()
- mean()
- meanStdDev()
代码:
#include "iostream"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main(int argc, char *argv)
{//【单通道图像,均值】Mat src = imread("C:/Users/Administrator/Desktop/Zooey.png",IMREAD_GRAYSCALE);if (src.empty()){cout << "could not find image file" << endl;return -1;}imshow("灰度原图", src);//获取图片相关信息,并打印int w = src.cols;int h = src.rows;int ch = src.channels();cout << "w:" << w << " h:" << h << " ch:" << ch << endl;//求最大最小像素值,最大最小像素点double min_value;double max_value;Point minloc;Point maxloc;minMaxLoc(src, &min_value, &max_value, &minloc, &maxloc); //取最小最大API,最后一个参数mask,在这里是限制寻找范围。注:只支持单通道。printf("min_value:%.2f max_value:%.2f\n", min_value, max_value); //像素值cout << "minloc:" << minloc.x << "," << minloc.y << " maxloc:" << maxloc.x << "," << maxloc.y << endl; //像素点//求均值Scalar s = mean(src); //均值APIprintf("mean:%.2f\n", s[0]);//如果是彩色图像,则对应三个通道,s[0]s[1]s[2]。//【三通道彩色图像,均值、方差】Mat src1 = imread("C:/Users/Administrator/Desktop/Zooey.png", IMREAD_COLOR);if (src.empty()){cout << "could not find image file" << endl;return -1;}imshow("彩色原图", src1);Mat mm, mstd;meanStdDev(src1, mm, mstd); //均值、方差API,第一个参数是原图,第二个参数是均值,第三个参数是方差。printf("stddev:%.2f %.2f %.2f\n", mstd.at<double>(0, 0), mstd.at<double>(1, 0), mstd.at<double>(2, 0)); //打印三个通道的方差,单通道只有0,0cout << "mm:" << mm.at<double>(0, 0) << " " << mm.at<double>(1, 0) << " " << mm.at<double>(2, 0) << endl; //打印三个通道的均值,单通道只有0,0//【像素值统计信息,即统计某一像素数值有多少个】vector<int> hist(256); //创建一个vector容器,C++知识for (int i = 0; i < 256; i++){hist[i] = 0;}for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){int pv = src.at<uchar>(row, col);hist[pv]++;}}waitKey(0);destroyAllWindows();return 0;
}
内容都在注释里讲得很清楚了。注意有些API只适用于单通道。
还要注意meanStdDev()返回的对象是Mat类型,以及如何通过这个Mat对象获取我们想要的信息。
第三部分像素统计,是统计某一像素值在一幅图片中有多少个。像素值0-255总共256个,所以创建一个大小为256的vector,将像素值作为下标,其对应的值作为出现次数,没遍历到一个像素值,就在这个值作为下标的位置+1进行累加,最后就可以知道这个像素值总共出现了多少次。
小应用。方差代表波动,纯色图像的方差为0,可以以此来识别纯色图像。
演示: