转载请注明出处:

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

参考网址:

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

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

 #include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv; /*!
* \brief 图像直方图均衡
*
* \param[in] srcImg 输入图像
* \param[in,out] dstImg 输出图像
*
* \return 0 处理成功
*
* \date 2016-1-5 10:03:33
*
*/
int HistEQ(Mat& dstImg, const Mat& srcImg)
{
assert(srcImg.type() == CV_8UC1); if (&srcImg != &dstImg) // 当输入和输出相同时,对输出矩阵不需要重新分配空间
{
dstImg = Mat(srcImg.rows, srcImg.cols, CV_8UC1);
} double p[] = { }, num[] = {}; //计算直方图
for (auto i = ; i < srcImg.rows; i++)
{
for (auto j = ; j < srcImg.cols; j++)
{
uchar val = srcImg.at<uchar>(i, j);
num[val]++;
}
} //计算概率分布
for (auto i = ; i < ; i++)
{
p[i] = num[i] / (srcImg.rows * srcImg.cols);
} //计算累计概率分布
for (auto i = ; i < ; i++)
{
p[i] += p[i-];
} // 直方图变换
for (auto i = ; i < srcImg.rows; i++)
{
for (auto j = ; j < srcImg.cols; j++)
{
uchar val = srcImg.at<uchar>(i, j);
dstImg.at<uchar>(i, j) = static_cast<uchar>(p[val] * + 0.5);
}
} return ;
} /*!
* \brief 图像动态范围拉伸到[0, 255]
*
* \param[in] srcImg 输入图像
* \param[in,out] dstImg 输出图像
*
* \return 0 处理成功
*
* \date 2016-1-5 10:03:33
*
*/
int DynamicStretch(Mat& dstImg, const Mat& srcImg)
{
assert(srcImg.type() == CV_8UC1);
if (&srcImg != &dstImg) // 当输入和输出相同时,对输出矩阵不需要重新分配空间
{
dstImg = Mat(srcImg.rows, srcImg.cols, CV_8UC1);
} double maxVal = -std::numeric_limits<double>::max();
double minVal = ;
// int minIdx[2] = { 0 }, maxIdx[2] = { 0 }; // minMaxIdx函数返回x,y位置,故此处需要声明的数组大小为2 minMaxIdx(srcImg, &minVal, &maxVal/*, minIdx, maxIdx*/); // 寻找图像的最大最小值 for (auto i = ; i < srcImg.rows; i++)
{
for (auto j = ; j < srcImg.cols; j++)
{
uchar val = srcImg.at<uchar>(i, j);
dstImg.at<uchar>(i, j) = static_cast<uchar>( * (val - minVal) * 1.0 / (maxVal - minVal));
}
} return ;
} /// \brief 主程序
int _tmain(int argc, _TCHAR* argv[])
{ Mat img = imread("E:\\01.jpg", );
imshow("img", img); Mat imgEQ;
equalizeHist(img, imgEQ); // opencv自带的直方图均衡的程序
imshow("imgEQ", imgEQ); Mat imgEQ2;
HistEQ(imgEQ2, img); // 调用上面直方图均衡的函数HistEQ
imshow("imgEQ2", imgEQ2); Mat imgStretch;
DynamicStretch(imgStretch, img); // 调用上面动态范围拉伸的函数HistEQ
imshow("imgStretch", imgStretch); waitKey(); return ;
}

(原)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. c++11-bind的用法

    bind函数 在c++11之前,要绑定某个函数.函数对象或者成员函数的不同参数值需要用到不同的转换器,如bind1st.bind2nd.fun_ptr.mem_fun和mem_fun_ref等.在c+ ...

  2. [{},{}]怎么转换成json

    例如:有这样的字符串[{"CityId":18,"CityName":"西安","ProvinceId":27,&quo ...

  3. Jasper_passValue_return value from the subreport to main report

    create a variable In subreport  say returnValue variable class type --> whatever u want calculati ...

  4. 完美解决ListView 与 ScrollView 共存问题

    1:首先设置ListView的高度,在setAdapter之后调用此方法. public static void setListViewHeightBasedOnChildren(ListView l ...

  5. esxi5.5 安装,虚拟机复制

    尝试在vmware workstation上安装hadoop,感觉太慢了. 好在家里的台式机配置还可以,所以就想在它上面虚拟出几台服务器出来. 台式机配置如下: 虚拟出来三个应该没问题了吧. 第一步, ...

  6. Java内存回收(垃圾回收)机制总结

    一.背景: Java程序员编写程序时,对于新建的对象,当不再需要此对象时,不必去释放这个对象所占用的空间,这个工作是由Java虚拟机自己完成的 ,即内存回收或垃圾回收. 二.如何知道一个对象所占用的空 ...

  7. 在O(1)时间内删除单链表结点

    // 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则 ...

  8. 【LeetCode练习题】Remove Duplicates from Sorted List II

    Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...

  9. pyqt显示指定范围的数字

    # -*- coding: cp936 -*- # -*- coding: cp936 -*- import sys from PyQt4 import QtCore, QtGui   #导入模块 a ...

  10. c++之 常量

    const常量 当在类型名前面加上关键字const后,表示它是一个只读的量,不能对其进行修改,因而被称为常量. 下面的例子对常量进行修改: const常量是只读的,可以读取它的值,或者用printf打 ...