直方图均衡化

直方图均衡化最广泛的应用是尝试扩大图像的动态范围。

直方图均衡化后面潜在的数学原理是一个分布(输入的亮度直方图)被映射到另一个分布(一个更宽,理想统一的亮度值分布)。

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章