转载请注明出处:

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

(原)Opencv中直方图均衡和图像动态范围拉伸的代码相关推荐

  1. OpenCV自适应直方图均衡CLAHE图像和分块大小不能整除的处理

    一.引言 最近一个月来都在研究OpenCV 中CLAHE算法的一些问题,如: 图像横向和纵向分块大小与图像的宽和高不能整除怎么处理? CLIP的剪裁是怎么实施的? 解决棋盘效应的具体插值处理过程怎样? ...

  2. OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换

    OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 目录 OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 1. 图像阈值 1.1 简单阈值 1.2 自适应阈值 1.3 Otsu ...

  3. OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

    OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...

  4. OpenCV中的立体图像创建深度图

    OpenCV中的立体图像创建深度图 1. 效果图 2. 源码 参考 这篇博客将介绍如何从立体图像创建深度图. 1. 效果图 原图 VS 视差图效果如下: 可以看到结果受到高度噪音的污染.通过调整 nu ...

  5. 【Opencv-Tools(一)】OpenCV中使用多线程处理图像

    OpenCV中使用多线程处理图像 引用:https://gist.github.com/yinguobing/7d1318e31f6e3455f30527a39361512a #!/usr/bin/e ...

  6. C语言使用指针处理opencv中的Mat图像数据

    1.在处理图像时,一般直接使用opencv中的imread函数获取图片,但是获取到图片后没有用到opencv中的其他算法时,直接用图片处理就会出现耗时严重的情况,所以需要将图片形式转换成指针数组形式处 ...

  7. 图像识别中距离变换的原理及作用详解,并附用OpenCV中的distanceTransform实现距离变换的代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 距离变换的定义是计算一个图像中非零像素点到最近的 ...

  8. opencv中直方图均衡函数cv::equalizeHist()的使用!!严格用程序进行了验证!

    最近开始学习OPENCV,通过验证书中的例程,从网上寻找别人的例程和解释,我发现人们多半都是不负责的,各种转载!你们有没有真正验证过???????? 先给一个别人关于cv::equalizeHist( ...

  9. 事实证明,OpenCV中对RGB图像数据的存储顺序是BGR,而且Scalar()的顺序也是B,G,R

    验证程序的源码如下(用到的图像下载链接为Red_pic.jpg_免费高速下载|百度网盘-分享无限制): 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料 ...

最新文章

  1. python之父去面试-面试题_个人文章 - SegmentFault 思否
  2. python求向量与x轴的夹角_2020届石家庄高考模拟题,参数方程解决向量问题
  3. Hbase:原理和设计
  4. 大话设计模式--职责连模式 Chain of Resposibility -- C++实现实例
  5. 微博预计要火一阵的SleepSort之Shell及C实现
  6. [MyBatisPlus]入门案例
  7. yapi 接口文档_1分钟docker部署顶尖 API 文档管理系统
  8. 阻止函数源码在控制台输出
  9. 洛谷p1338末日的传说(思维好题,数学)
  10. 批量运行C文件之makefile
  11. HttpRunnerManager(一)--安装
  12. python女朋友_教你用Python感知女朋友的情绪变化!
  13. 《程序员修炼之道》---- 修的是什么
  14. 如何构建config文件
  15. matlab 折线图 标记_matlab画折线图标记线
  16. Gradle入门教程学习笔记
  17. 记录进行Uniprot转化为Entrez ID的过程
  18. android 宽度是多少dp,Android开发中dp、dpi、px的区别
  19. Elasticsearch Query DSL 整理总结(查询)
  20. 绘王两款便携数位屏同时发售,全贴合防眩光屏配硬笔

热门文章

  1. android, 模拟器
  2. SwingUtilities.invokeLater
  3. 搭建本地blast2go
  4. 地理计算 | 计算两个坐标点射线的交点(前方交会)
  5. 单片机ADC0832电压检测程序(充电自动提醒)
  6. python oledb dbf_在Python中打开和搜索dBase III(DBF)数据库
  7. 图书管理系统-GUI Mysql 数据库课程设计-更新版
  8. 引起网络广播风暴的原因
  9. 树莓派存储方案_还在用笨重的NAS存储服务器?你可以自己动手用树莓派DIY一个...
  10. python turtle 小乌龟 编辑动画(24)