【OpenCV】像素信息统计

介绍了计算像素均值、方差的API,以及统计像素信息的方法。相关API:

  • minMaxLoc()
  • mean()
  • meanStdDev()

代码:

cpp 复制代码
#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);	//均值API
	printf("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,0
	cout << "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,可以以此来识别纯色图像。

演示:

相关推荐
小超同学你好6 小时前
OpenClaw 深度解析与源代码导读 · 第11篇:子 Agent(Sub-Agent)——隔离执行与“向上汇报“的有限协作
人工智能·语言模型·transformer
code 小楊7 小时前
image-2国内开源平替商汤科技SenseNova-U1模型全面解析
人工智能·科技·开源
龙侠九重天7 小时前
VS Code AI 插件生态全景对比:Tabnine、Codeium、Blackbox 等主流工具深度横评
人工智能·vs code·ai 插件
keineahnung23457 小时前
為什麼這個 Tensor 算 dense?PyTorch _eval_is_non_overlapping_and_dense 深入解析
人工智能·pytorch·python·深度学习
IT_陈寒7 小时前
为什么我的Python multiprocessing总是卡在join()?
前端·人工智能·后端
云天AI实战派7 小时前
ChatGPT/AI 智能体功能异常排查指南:账号安全、权限灰度到审批流卡点的全流程解决方案
人工智能·安全·chatgpt
薛定猫AI7 小时前
【深度解析】Open Code Skills 工作流:用知识图谱、Spec 驱动与 UI 设计系统提升 AI Coding Agent 生产力
人工智能·ui·知识图谱
袋子(PJ)7 小时前
2026年pytorch基础学习(基于jupyter notebook开发)——从原理到落地:PyTorch神经网络架构与工程优化解析
人工智能·pytorch·深度学习·学习·jupyter
落羽的落羽7 小时前
【网络】计算机网络世界的基础概念
linux·服务器·网络·c++·人工智能·计算机网络·机器学习
小挪号底迪滴7 小时前
浅析 AI 实时语音流转译背后的技术架构:从 WebSocket 到流式 LLM
人工智能·websocket·架构