转载请注明出处:

http://www.cnblogs.com/darkknightzh/p/5102032.html

参考网址:

http://blog.csdn.net/abcjennifer/article/details/7401921

实际上opencv中有自带的直方图均衡的程序。

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include <opencv2/imgproc/imgproc.hpp>
  4. using namespace cv;
  5.  
  6. /*!
  7. * \brief 图像直方图均衡
  8. *
  9. * \param[in] srcImg 输入图像
  10. * \param[in,out] dstImg 输出图像
  11. *
  12. * \return 0 处理成功
  13. *
  14. * \date 2016-1-5 10:03:33
  15. *
  16. */
  17. int HistEQ(Mat& dstImg, const Mat& srcImg)
  18. {
  19. assert(srcImg.type() == CV_8UC1);
  20.  
  21. if (&srcImg != &dstImg) // 当输入和输出相同时,对输出矩阵不需要重新分配空间
  22. {
  23. dstImg = Mat(srcImg.rows, srcImg.cols, CV_8UC1);
  24. }
  25.  
  26. double p[] = { }, num[] = {};
  27.  
  28. //计算直方图
  29. for (auto i = ; i < srcImg.rows; i++)
  30. {
  31. for (auto j = ; j < srcImg.cols; j++)
  32. {
  33. uchar val = srcImg.at<uchar>(i, j);
  34. num[val]++;
  35. }
  36. }
  37.  
  38. //计算概率分布
  39. for (auto i = ; i < ; i++)
  40. {
  41. p[i] = num[i] / (srcImg.rows * srcImg.cols);
  42. }
  43.  
  44. //计算累计概率分布
  45. for (auto i = ; i < ; i++)
  46. {
  47. p[i] += p[i-];
  48. }
  49.  
  50. // 直方图变换
  51. for (auto i = ; i < srcImg.rows; i++)
  52. {
  53. for (auto j = ; j < srcImg.cols; j++)
  54. {
  55. uchar val = srcImg.at<uchar>(i, j);
  56. dstImg.at<uchar>(i, j) = static_cast<uchar>(p[val] * + 0.5);
  57. }
  58. }
  59.  
  60. return ;
  61. }
  62.  
  63. /*!
  64. * \brief 图像动态范围拉伸到[0, 255]
  65. *
  66. * \param[in] srcImg 输入图像
  67. * \param[in,out] dstImg 输出图像
  68. *
  69. * \return 0 处理成功
  70. *
  71. * \date 2016-1-5 10:03:33
  72. *
  73. */
  74. int DynamicStretch(Mat& dstImg, const Mat& srcImg)
  75. {
  76. assert(srcImg.type() == CV_8UC1);
  77. if (&srcImg != &dstImg) // 当输入和输出相同时,对输出矩阵不需要重新分配空间
  78. {
  79. dstImg = Mat(srcImg.rows, srcImg.cols, CV_8UC1);
  80. }
  81.  
  82. double maxVal = -std::numeric_limits<double>::max();
  83. double minVal = ;
  84. // int minIdx[2] = { 0 }, maxIdx[2] = { 0 }; // minMaxIdx函数返回x,y位置,故此处需要声明的数组大小为2
  85.  
  86. minMaxIdx(srcImg, &minVal, &maxVal/*, minIdx, maxIdx*/); // 寻找图像的最大最小值
  87.  
  88. for (auto i = ; i < srcImg.rows; i++)
  89. {
  90. for (auto j = ; j < srcImg.cols; j++)
  91. {
  92. uchar val = srcImg.at<uchar>(i, j);
  93. dstImg.at<uchar>(i, j) = static_cast<uchar>( * (val - minVal) * 1.0 / (maxVal - minVal));
  94. }
  95. }
  96.  
  97. return ;
  98. }
  99.  
  100. /// \brief 主程序
  101. int _tmain(int argc, _TCHAR* argv[])
  102. {
  103.  
  104. Mat img = imread("E:\\01.jpg", );
  105. imshow("img", img);
  106.  
  107. Mat imgEQ;
  108. equalizeHist(img, imgEQ); // opencv自带的直方图均衡的程序
  109. imshow("imgEQ", imgEQ);
  110.  
  111. Mat imgEQ2;
  112. HistEQ(imgEQ2, img); // 调用上面直方图均衡的函数HistEQ
  113. imshow("imgEQ2", imgEQ2);
  114.  
  115. Mat imgStretch;
  116. DynamicStretch(imgStretch, img); // 调用上面动态范围拉伸的函数HistEQ
  117. imshow("imgStretch", imgStretch);
  118.  
  119. waitKey();
  120.  
  121. return ;
  122. }

(原)Opencv中直方图均衡和图像动态范围拉伸的代码的更多相关文章

  1. opencv中的meanshift图像切割

    Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法.Meanshift不仅能够用于图像滤波,视频跟踪,还能够用于图像切割. 通过给出一组多维数据点,其维数是(x,y,r ...

  2. opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓

    阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...

  3. opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓特征和几何矩

    阅读对象:对概率论中的期望有一点了解. 1.图像几何矩 1.1简述 图像的几何矩包括空间矩.中心矩和中心归一化矩.几何矩具有平移.旋转和尺度不变性,一般是用来做大粒度的区分,用来过滤显然不相关的图像. ...

  4. OpenCV学习(39) OpenCV中的LBP图像

    本章我们学习LBP图像的原理和使用,因为接下来教程我们要使用LBP图像的直方图来进行脸部识别. 参考资料: http://docs.opencv.org/modules/contrib/doc/fac ...

  5. 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  6. [OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

    部分 VII摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行修 ...

  7. 跟我一起学opencv 第三课之图像在opencv中的表示-Mat对象

    1.下面第一章图是一位美女图像,和其他数据一样图像在计算机中也是以二进制存储,下面第二张图 2.在摄像头眼里一幅图像就是一个矩阵或者说是二维数组,数组元素是像素值 3.opencv中以Mat对象表示图 ...

  8. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函 ...

  9. 图像滤波与OpenCV中的图像平滑处理

    .About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...

随机推荐

  1. CMS设计-组件化

    原来CMS使用的专题类的页面是 : 事先由前端写好完整页面,再交付给运营使用,这样使用的比较灵活,可以根据市场的不同需求由前端切出不同的页面,有时候一旦需求过多,就耽误切图的时间. 现在M和H5采用组 ...

  2. Lambda表达式 之 C#

    Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托 ...

  3. 爬虫框架YayCrawler

    爬虫框架YayCrawler 各位好!从今天起,我将用几个篇幅的文字向大家介绍一下我的一个开源作品——YayCrawler,其在GitHub上的网址是:https://github.com/liush ...

  4. sort命令总结

    功能:排序 语法:sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--ver ...

  5. FPGA技术的一些基本概念(综合、BlackBox)(转)

    原文:http://blog.sina.com.cn/s/blog_6254a8ca0100i0wr.html 原文也是转的,哈哈,大家多转转,转转更健康.删除了一些Xilinx的东西 前言 综合是将 ...

  6. 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)

    原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...

  7. 【转】【Android】HAL分析

    原文网址:http://www.cnblogs.com/lcw/p/3335505.html HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. An ...

  8. cf446C DZY Loves Fibonacci Numbers

    C. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory limit per test 256 megabytes inp ...

  9. Spiral Matrix II 解答

    Question Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral or ...

  10. the5fire博客对接微信公众平台接口 | the5fire的技术博客

    the5fire博客对接微信公众平台接口 | the5fire的技术博客 the5fire博客对接微信公众平台接口