经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++ OpenCV学习之图像像素值统计
来源:jb51  时间:2022/1/24 10:09:42  对本文有异议

opencv知识点:

图像像素最小/最大值 - minMaxLoc

图像像素均值/标准差 - meanStdDev

本课所解决的问题:

如何获取图像像素的最小/最大值?

如何获取图像像素的均值/标准差?

通过图像像素统计值我们能干什么?

1.常用的像素值统计

在图像分析的时候,我们经常需要对单通道图像的像素进行统计,以下4种是比较常用的

最小值(min)

最大值(max)

平均值(mean)

标准差(standard deviation)

要求这4种统计,我们就要用到以下两个API

  • minMaxLoc
  • meanStdDev

这两个API非常有用,日后有很多地方用得到

2.像素值统计计算

接下来,我们来应用两个API,求取4种像素值统计

首先是最小值,最大值

  1. //函数定义
  2. void pixel_statistics_demo(Mat& image);
  3. //函数实现
  4. void QuickDemo::pixel_statistics_demo(Mat& image) {
  5.  
  6. ?? ?double minv, maxv;
  7. ?? ?Point minLoc, maxLoc;
  8.  
  9. ?? ?std::vector<Mat> mvt;
  10. ?? ?split(image, mvt);
  11.  
  12. ?? ?/*
  13. ?? ?minMaxLoc
  14. ?? ??? ?求取单通道图像像素的最小值,最大值
  15. ?? ??? ??? ?共6个参数
  16. ?? ??? ??? ??? ?第1个参数 输入单通道图像
  17. ?? ??? ??? ??? ?第2个参数 输出最小值
  18. ?? ??? ??? ??? ?第3个参数 输出最大值
  19. ?? ??? ??? ??? ?第4个参数 输出最小值点的坐标
  20. ?? ??? ??? ??? ?第5个参数 输出最大值点的坐标
  21. ?? ??? ??? ?
  22. ?? ??? ??? ??? ?第6个参数 输入图像的子数组(有时候我们会求取ROI区域的最小/最大值,就会传入mask图像)
  23. ?? ??? ??? ??? ??? ??? ?(这里的子数组,是一种图像掩模,可以实现加东西/扣东西)?
  24. ?? ?*/
  25. ?? ?for (int i = 0; i < mvt.size(); i++) {
  26. ?? ??? ?minMaxLoc(mvt[i], &minv, &maxv, &minLoc, &maxLoc);
  27. ?? ??? ?std::cout << "通道:" << i << " 最小值:" << minv << " 最大值:" << maxv << std::endl;
  28. ?? ?}
  29.  
  30. }

然后是,平均值和标准差

  1. void QuickDemo::pixel_statistics_demo(Mat& image) {
  2.  
  3. ?? ?Mat mean, stddev;
  4.  
  5. ?? ?meanStdDev(image, mean, stddev);
  6. ?? ?/*
  7. ?? ?meanStdDev
  8. ?? ??? ?求取平均值,标准差
  9. ?? ??? ??? ?共4个参数
  10. ?? ??? ??? ??? ?第1个参数 输入
  11. ?? ??? ??? ??? ?第2个参数 输出图像像素的平均值,每个通道都会输出一个
  12. ?? ??? ??? ??? ?第3个参数 输出图像像素的标准差,每个通道都会输出一个
  13. ?? ??? ??? ??? ?
  14. ?? ??? ??? ??? ?第4个参数 输入图像的子数组(有时候我们会求取ROI区域的平均值/标准差,就会传入mask图像)
  15. ?? ??? ??? ??? ??? ??? ?(这里的子数组,是一种图像掩模,可以实现加东西/扣东西)?
  16. ?? ?*/
  17. ?? ?std::cout << "平均值" << std::endl << mean << std::endl;
  18. ?? ?std::cout << "标准差" << std::endl<<stddev << std::endl;
  19. }

上图中,输出平均值和标准差,是把所有通道的都输出了,那如果怎么输出单通道的呢?

很简单,只要用到Mat::at

  1. //opencv为了保证精度,平均值,标准差矩阵的数据类型是double类型
  2. std::cout<<"平均值"<< mean.at<double>(0, 0)<<std::endl;
  3. std::cout << "标准差" << stddev.at<double>(0, 0) << std::endl;

3.图像统计值分析

这里简单提一下图像分析的事情

图像的平均值和标准差会给我们带来一定的信息

比如:当平均值恒定,标准差很小时,我们可以想到是基本纯色的图片,也就是低对比度的图

在图像分析的时候,我们关注图像的有效信息,也就是ROI区域。

通过图像像素的统计值,我们就可以对图像的有效信息作出判断。

比如,当图像标准差很小时,图像所携带的有效信息会很少,我们就要对图像进行筛选,通过一些手段过滤掉一些东西。

本课所用API查阅

1.minMaxLoc

2.meanStdDev

3.Mat::at

虽然有12种重载,但只有6种传参方式

1.单维度坐标——i0:沿维度 0 的索引

2.双维度坐标——row 沿维度 0 的索引 ;col 沿维度 1 的索引

3.三维度坐标——i0 沿维度 0 的索引;i1 沿维度 1 的索引;i2 沿维度 2 的索引

4.维度数组坐标——int数组

5.维度数组坐标——vector数组

6.点的坐标——point类

以上就是C++ OpenCV学习之图像像素值统计的详细内容,更多关于OpenCV像素值统计的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号