Histogram Equalization (直方圖均衡化)是影像處理領域中利用圖像直方圖對對比度進行調整的方法。
這種方法通常用來增加許多圖像的局部對比度,尤其是當圖像的有用數據的對比度相當接近的時候。透過這種方法,亮度可以更好地分佈在直方圖上。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化透過有效地擴展常用的亮度來實現這種功能。
- 環境設定:Visual Studio 2010 安裝 OpenCV 2.4
- 範例程式:C:\OpenCV2.4.3\samples\cpp\tutorial_code\Histograms_Matching\EqualizeHist_Demo.cpp
程式碼:
/**
Theme: Histogram Equalization
compiler: Visual Studio 2010 with OpenCV 2.4.3
Date: 101/11/12
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
/**
* @function EqualizeHist_Demo.cpp
* @brief Demo code for equalizeHist function
* @author OpenCV team
*/
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
Mat src, dst;
char* source_window = "Source image";
char* equalized_window = "Equalized Image";
/// Load image
src = imread( argv[1], 1 );
if( !src.data )
{ cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
return -1;
}
/// Convert to grayscale
cvtColor( src, src, CV_BGR2GRAY );
/// Apply Histogram Equalization
equalizeHist( src, dst );
/// Display results
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
imshow( equalized_window, dst );
/// Save images
imwrite("source.jpg", src);
imwrite("equalized.jpg", dst);
/// Wait until user exits the program
waitKey(0);
return 0;
}
source.jpg
equalized.jpg
接下來看直方圖的差異。
source histogram

equalized histogram

原理:直方圖均衡化 (Histogram Equalization)是通過灰度變換將一影像轉換為另一影像具有均衡直方圖,即在每個灰度級上都具有相同的像素點數過程。從分佈圖上的理解就是希望原始圖像中y軸的值在新的分佈中能盡可能的展開。變換過程是利用累積分佈函數對原始分佈進行映射,生成新的均勻拉伸的分佈。因此對應每個點的操作是尋找原始分佈中y值在均勻分佈中的位置,如下圖是理想的單純高斯分佈映射的示意圖:

另一程式碼可以均衡化彩色影像,把每個通道分別均衡化,再合併為彩色圖像。
/**
Theme: Histogram Equalization
Compiler: Dev C++ 4.9.9.2
Library: OpenCV 2.0
Date: 101/11/12
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main()
{
IplImage * image= cvLoadImage("night.jpg");
//顯示原圖
cvShowImage("Source",image);
cvSaveImage("Source.jpg",image);
IplImage* eqlimage=cvCreateImage(cvGetSize(image),image->depth,3);
//分別均衡化每個信道
IplImage* redImage=cvCreateImage(cvGetSize(image),image->depth,1);
IplImage* greenImage=cvCreateImage(cvGetSize(image),image->depth,1);
IplImage* blueImage=cvCreateImage(cvGetSize(image),image->depth,1);
cvSplit(image,blueImage,greenImage,redImage,NULL);
cvEqualizeHist(redImage,redImage);
cvEqualizeHist(greenImage,greenImage);
cvEqualizeHist(blueImage,blueImage);
//均衡化後的圖像
cvMerge(blueImage,greenImage,redImage,NULL,eqlimage);
cvShowImage("Equalized",eqlimage);
cvSaveImage("Equalized.jpg",eqlimage);
cvWaitKey(0);
}
source.jpg

equalized.jpg
同樣來看直方圖的差異。
source histogram

equalized histogram

參考:WiKi – 直方圖均衡化、OpenCV v2.4.3 documentation – Histogram Equalization、直方圖應用:直方圖均衡化,直方圖匹配,對比直方圖、baidu – 直方圖均衡化。




隨意留個言吧:)~