在 OpenCV 中,统计图像的像素信息(如像素值分布、最大值、最小值、均值等)是常见的操作。以下是一些常用的方法和函数,用于统计图像的像素信息:

  1. 统计像素值的基本信息

    最大值、最小值、均值、标准差: 使用 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;
}
  1. 统计像素值的直方图

    直方图计算: 使用 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;
}
  1. 统计像素值的总和

    像素值求和: 使用 cv::sum() 函数可以计算图像中所有像素值的总和。

    cv::Scalar sum = cv::sum(image); std::cout << "Sum of pixel values: " << sum[0] << std::endl;

  2. 统计非零像素的数量

    非零像素统计: 使用 cv::countNonZero() 函数可以统计图像中非零像素的数量。

    int nonZeroCount = cv::countNonZero(image); std::cout << "Non-zero pixel count: " << nonZeroCount << std::endl;

  3. 统计像素值的分布(分通道)

    对于多通道图像(如 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;
}
  1. 统计像素值的百分比

如果需要统计像素值的百分比(如 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 图像的像素信息。这些统计信息对于图像处理、分析和特征提取等任务非常重要。根据具体需求,可以选择合适的方法进行像素统计。

opencv实现像素统计的示例代码的更多相关文章

  1. opencv:像素统计信息

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  2. OpenCV漫水填充算法示例代码

    #include<cv.h> #include<highgui.h> int main(int argc, char** argv) { IplImage* img = cvL ...

  3. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

  4. OpenCV亚像素角点cornerSubPixel()源代码分析

    上一篇博客中讲到了goodFeatureToTrack()这个API函数能够获取图像中的强角点.但是获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角 ...

  5. python开源项目及示例代码

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  6. python开源项目及示例代码(转)

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  7. Spark 跑 java 示例代码

    一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...

  8. Hadoop基础-Map端链式编程之MapReduce统计TopN示例

    Hadoop基础-Map端链式编程之MapReduce统计TopN示例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 对“temp.txt”中的数据进行分析,统计出各 ...

  9. opencv图像像素值读取

    说到图像像素,肯定要先认识一下图像中的坐标系长什么样. 1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线:Y轴为图像矩形左边的那条垂直线.该坐标体系在诸如结构体Mat,Rect ...

  10. Redis简单命令(部分示例代码)

    一.redis文件夹下的可执行文件(文章尾部有示例代码) 可执行文件 作用 redis-server 启动redis redis-cli redis命令行工具 redis-benchmark 基准测试 ...

随机推荐

  1. Uninstall or delete MariaDB completely for re-installation

    I am new to this forum so pse forgive me if I am asking a question which already has been answered. ...

  2. 如何在 Ubuntu 20.04 上安装 MySQL

    https://dev.mysql.com/downloads/mysql/ 简介: MySQL是最流行的开源关系数据库管理系统.它速度快,容易使用,容易扩展,并且流行的LAMP和LEMP的一部分. ...

  3. @EnableWebMvc 注解会让Swagger无效访问的问题

    在工作中,通过Swagger2对项目的controller进行配置,以便于用户测试restful服务接口提高开发效率. 但是今天却出现了一个让我匪夷所思的问题就是在配置类里面加上@EnableWebM ...

  4. Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

    随着技术的成熟和 AI 的崛起,很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成.于是乎,单个开发者的能力得到了极大的提升 - 借助各种工具,一个人就可以完成开发.测试.运维等 ...

  5. 在 .NET 9 中使用 Scalar 替代 Swagger

    前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore(一个为ASP.NET Core API提供Swagger工具的项目)从ASP.N ...

  6. 老奶奶看了都会的WSL2连接USB设备教程!

    老奶奶看了都会的WSL2-Ubuntu连接USB设备教程! 作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 参考资料:微软官方文档连接 USB 设备 | Mic ...

  7. 时间序列数据库TSDB InfluxDB介绍

    背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...

  8. API 设计之禅

    API 设计之禅 译者按:本文翻译自 How to design a good API and why it matters.根据笔者经历,很多大厂程序员所写的代码和大厂内部封装的各种中间件.类库,毫 ...

  9. EIP、VIP、RIP的区别

    本文分享自天翼云开发者社区<EIP.VIP.RIP的区别>,作者:魏****猛 EIP.VIP.RIP都是网络中经常使用的术语,但是它们的意义和使用场景是不同的. 首先,EIP(Elast ...

  10. mac环境下配置jdk

    1.如果你是第一次配置环境变量,可以使用"touch .bash_profile" 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用&quo ...