opencv实现像素统计的示例代码

 更新时间:2025年01月06日 08:54:43   作者:编码小哥  
本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 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;
}

2. 统计像素值的直方图

  • 直方图计算: 使用 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;
}

3. 统计像素值的总和

  • 像素值求和: 使用 cv::sum() 函数可以计算图像中所有像素值的总和。
cv::Scalar sum = cv::sum(image);
std::cout << "Sum of pixel values: " << sum[0] << std::endl;

4. 统计非零像素的数量

  • 非零像素统计: 使用 cv::countNonZero() 函数可以统计图像中非零像素的数量。
int nonZeroCount = cv::countNonZero(image);
std::cout << "Non-zero pixel count: " << nonZeroCount << std::endl;

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

  • 对于多通道图像(如 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;
}

6. 统计像素值的百分比

如果需要统计像素值的百分比(如 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实现像素统计的示例代码的文章就介绍到这了,更多相关opencv 像素统计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现双向循环链表

    C++实现双向循环链表

    这篇文章主要为大家详细介绍了C++实现双向循环链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C/C++中二进制文件&顺序读写详解及其作用介绍

    C/C++中二进制文件&顺序读写详解及其作用介绍

    这篇文章主要介绍了C/C++中二进制文件&顺序读写详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言实现数组转置的代码详解

    C语言实现数组转置的代码详解

    在现代计算中,数组是最基础且最常用的数据结构之一,无论是对图像像素进行旋转,还是对大规模数值数据做格式转换,都离不开“转置(Transpose)”操作,所以本文将详细介绍C语言实现数组转置的方法,需要的朋友可以参考下
    2025-05-05
  • C++入门指南之贪吃蛇游戏的实现

    C++入门指南之贪吃蛇游戏的实现

    这篇文章主要给大家介绍了关于C++入门指南之贪吃蛇游戏实现的相关资料,文章通过示例代码介绍的非常详细,可以让大家能短时间内写出一个贪吃蛇,需要的朋友可以参考下
    2021-10-10
  • 深入分析C语言存储类型与用户空间内部分布

    深入分析C语言存储类型与用户空间内部分布

    这篇文章主要介绍了C语言存储类型与用户空间内部分布,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • VS2019创建C++工程的的实现步骤

    VS2019创建C++工程的的实现步骤

    本文主要介绍了VS2019创建C++工程步骤,包含新建项目、编辑文件、配置源文件目录、编译链接、输出文件、设置断点调试,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • C++实现LeetCode(22.生成括号)

    C++实现LeetCode(22.生成括号)

    这篇文章主要介绍了C++实现LeetCode(22.生成括号),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Qt实现闹钟小程序

    Qt实现闹钟小程序

    这篇文章主要为大家详细介绍了Qt实现闹钟小程序,利用Qt的designer设计需要的闹钟界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 贪心算法的C语言实现与运用详解

    贪心算法的C语言实现与运用详解

    这篇文章主要介绍了贪心算法的C语言实现与运用详解,运用么,就是文中所附的ACM练习题,哈哈:D需要的朋友可以参考下
    2015-08-08
  • Matlab实现带竖线散点的核密度图的绘制

    Matlab实现带竖线散点的核密度图的绘制

    核密度估计是用于估计随机变量概率密度函数的一种非参数方法。核密度图不失为一种用来观察连续型变量分布的有效方法。本文将用Matlab实现带竖线散点的核密度图的绘制,感兴趣的可以了解一下
    2022-08-08

最新评论