opencv实现像素统计的示例代码
在 OpenCV 中,统计图像的像素信息(如像素值分布、最大值、最小值、均值等)是常见的操作。以下是一些常用的方法和函数,用于统计图像的像素信息:
-
统计像素值的基本信息
最大值、最小值、均值、标准差: 使用 cv::minMaxLoc() 和 cv::meanStdDev() 函数可以快速计算图像的最大值、最小值、均值和标准差。
点击查看代码
#include <opencv2/opencv.hpp>
#include <IOStream>
int main() {
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像
if (image.empty()) {
std::cerr << "Error: Could not load image!" << std::endl;
return -1;
}
double minVal, maxVal;
cv::Point minLoc, maxLoc;
cv::minMaxLoc(image, &minVal, &maxVal, &minLoc, &maxLoc);
cv::Scalar mean, stddev;
cv::meanStdDev(image, mean, stddev);
std::cout << "Min value: " << minVal << " at " << minLoc << std::endl;
std::cout << "Max value: " << maxVal << " at " << maxLoc << std::endl;
std::cout << "Mean: " << mean[0] << std::endl;
std::cout << "Stddev: " << stddev[0] << std::endl;
return 0;
}
-
统计像素值的直方图
直方图计算: 使用 cv::calcHist() 函数可以计算图像的直方图,用于分析像素值的分布。
点击查看代码
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像
if (image.empty()) {
std::cerr << "Error: Could not load image!" << std::endl;
return -1;
}
// 定义直方图参数
int histSize = 256; // 直方图的 bin 数量
float range[] = {0, 256}; // 像素值范围
const float* histRange = {range};
bool uniform = true, accumulate = false;
cv::Mat hist;
cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate);
// 打印直方图
for (int i = 0; i < histSize; i++) {
std::cout << "Bin " << i << ": " << hist.at<float>(i) << std::endl;
}
return 0;
}
-
统计像素值的总和
像素值求和: 使用 cv::sum() 函数可以计算图像中所有像素值的总和。
cv::Scalar sum = cv::sum(image); std::cout << "Sum of pixel values: " << sum[0] << std::endl;
-
统计非零像素的数量
非零像素统计: 使用 cv::countNonZero() 函数可以统计图像中非零像素的数量。
int nonZeroCount = cv::countNonZero(image); std::cout << "Non-zero pixel count: " << nonZeroCount << std::endl;
-
统计像素值的分布(分通道)
对于多通道图像(如 RGB 图像),可以分别统计每个通道的像素信息。
点击查看代码
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR); // 读取彩色图像
std::vector<cv::Mat> channels;
cv::split(image, channels); // 分离通道
for (int i = 0; i < channels.size(); i++) {
double minVal, maxVal;
cv::minMaxLoc(channels[i], &minVal, &maxVal);
std::cout << "Channel " << i << " - Min: " << minVal << ", Max: " << maxVal << std::endl;
}
- 统计像素值的百分比
如果需要统计像素值的百分比(如 95% 的像素值小于某个阈值),可以通过直方图计算累积分布函数(CDF )来实现。
点击查看代码
cv::Mat hist;
cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate);
// 计算累积分布函数
for (int i = 1; i < histSize; i++) {
hist.at<float>(i) += hist.at<float>(i - 1);
}
// 归一化
hist /= image.total();
// 查找 95% 的像素值阈值
float threshold = 0.95;
int pixelValueThreshold = 0;
for (int i = 0; i < histSize; i++) {
if (hist.at<float>(i) >= threshold) {
pixelValueThreshold = i;
break;
}
}
std::cout << "95% of pixel values are below: " << pixelValueThreshold << std::endl;
通过以上方法,可以有效地统计和分析 OpenCV 图像的像素信息。这些统计信息对于图像处理、分析和特征提取等任务非常重要。根据具体需求,可以选择合适的方法进行像素统计。
本文来自博客园,作者:Ryan,转载请注明原文链接:https://www.cnblogs.com/Ryan9399/p/18675247
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!