直方图均衡化最广泛的应用是尝试扩大图像的动态范围。
直方图均衡化后面潜在的数学原理是一个分布(输入的亮度直方图)被映射到另一个分布(一个更宽,理想统一的亮度值分布)。
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;
}