直方圖均衡化

直方圖均衡化最廣泛的應用是嘗試擴大圖像的動態範圍。

直方圖均衡化後面潛在的數學原理是一個分佈(輸入的亮度直方圖)被映射到另一個分佈(一個更寬,理想統一的亮度值分佈)。

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


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