1.目的
(1)用OpenCV函数 equalizeHist 对图像进行直方图均衡化
2.原理
[1]直方图
直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数。
[2]直方图均衡化
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图。
[3]直方图均衡化实现
均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开。要想实现均衡化的效果, 映射函数应该是一个 累积分布函数 (cdf):
要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布进行归一化. 同上例, 累积分布函数为:
最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:
3.部分代码解释
(1)equalizeHist
/*
gray:输入灰度图像
dst:输出图像
*/
equalizeHist(gray, dst);
4.完整代码
(1)CommonInclude.h
#ifndef COMMON_INCLUDE
#define COMMON_INCLUDE
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
#endif
(2)EqualizeHist.cpp
#include"CommonInclude.h"
int main(int argc, char** argv){
if(argc < 2){
cout << "more parameters are required!!!" << endl;
return(-1);
}
Mat src, gray, dst;
src = imread(argv[1]);
if(!src.data){
cout << "error to read image!!!" << endl;
return(-1);
}
cvtColor(src, gray, CV_BGR2GRAY);
imshow("origin", gray);
/*
gray:输入灰度图像
dst:输出图像
*/
equalizeHist(gray, dst);
imshow("equalizeHist Image", dst);
waitKey(0);
return(0);
}