直方圖均衡化最廣泛的應用是嘗試擴大圖像的動態範圍。
直方圖均衡化後面潛在的數學原理是一個分佈(輸入的亮度直方圖)被映射到另一個分佈(一個更寬,理想統一的亮度值分佈)。
void cvEqualizeHist(const CvArr * src , CvArr * dst)
該函數能歸一化圖像亮度和增強對比度;
src
輸入的 8-比特 單信道圖像
dst
輸出的圖像與輸入圖像大小與數據類型相同
函數 cvEqualizeHist 採用如下法則對輸入圖像進行直方圖均衡化:
《學習OpenCV》中練習應用:載入一幅圖像,分割爲三個通道,分別對三個通道進行直方圖均衡化操作,之後合併三通道顯示結果
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
/*1、載入一個圖像*/
const char filename[] = "/Users/linwang/Downloads/Lena.jpg";
IplImage * src1 = cvLoadImage(filename);
/*2、拆分圖像通道*/
IplImage * Blue = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
IplImage * Green = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
IplImage * Red = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
cvSplit(src1, Blue, Green, Red, NULL);
/*3、單獨對每個通道使用直方圖均衡化*/
IplImage *IequalizeHist = cvCloneImage(src1);
cvSetZero(IequalizeHist);
cvEqualizeHist(Blue, Blue);
cvEqualizeHist(Green, Green);
cvEqualizeHist(Red, Red);
cvMerge(Blue, Green, Red, NULL, IequalizeHist);
/*4、顯示結果*/
cvShowImage("Src", src1);
cvShowImage("Dst", IequalizeHist);
cvWaitKey(0);
cvReleaseImage(&src1);
cvReleaseImage(&Blue);
cvReleaseImage(&Green);
cvReleaseImage(&Red);
cvReleaseImage(&IequalizeHist);
return 0;
}