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);
}