直方图均衡

Posted zhangqixiang5449

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直方图均衡相关的知识,希望对你有一定的参考价值。

直方图均衡

直方图均衡可均衡大部分像素集中在某一区间的图像,经过处理后可使图像利用大部分灰度值。

openCV直方图均衡化代码:

void histogramBalanced()
    IplImage* im = cvLoadImage("/Users/qixiangzhang/Desktop/openCV/gyy.jpg",CV_LOAD_IMAGE_UNCHANGED);
    IplImage* imOut = cvCreateImage(cvGetSize(im), IPL_DEPTH_8U, 1);

    cvShowImage("Original", im);

    cvEqualizeHist(im, imOut);

    cvShowImage("histogram", imOut);

    cvSaveImage("/Users/qixiangzhang/Desktop/histogram.jpg",imOut);

使用matlab查看直方图统计结果:

>> gyy = imread('gyy.jpg');
>> gyyH = imread('gyyH.jpg');
>> hist_gyy = imhist(gyy);
>> bar(hist_gyy);
>> hist_gyyH = imhist(gyyH);
>> figure();bar(hist_gyyH)


不使用opencv的API计算直方图均衡代码:

//以下代码为求思路清晰,在性能上不做优化
void myEqualizeHist()
    auto im = imread("/Users/qixiangzhang/Desktop/openCV/gyy.jpg");

    long int sta[256] = 0;
    int nl = im.rows;
    int nc = im.cols*im.channels();
    uchar* data;
   //统计     
    for(int j = 0; j<nl; j++)
        data = im.ptr<uchar>(j);
        for(int i = 0; i<nc; i++)
            sta[data[i]%256]++;
        
    
    //概率
    double pro[256] = 0;
    for(int j = 0; j<256; j++)
        pro[j] = sta[j]/double(nl*nc);
    
    //计算结果
    pro[0]*=255;
    for(int j = 1; j<256; j++)
        pro[j] = pro[j]*255+pro[j-1];
    
    int res[256] = 0;
    for(int j = 0; j<256; j++)
        res[j] = pro[j];
        if(pro[j]-int(pro[j])>=0.5) res[j]++;
    
    //替换
    for(int j = 0; j<nl; j++)
        data = im.ptr<uchar>(j);
        for(int i = 0; i<nc; i++)
            data[i] = res[data[i]%256];
        
    

    imshow("a", im);
    IplImage i = IplImage(im);
    cvSaveImage("/Users/qixiangzhang/Desktop/histogram2.jpg", &i);

结果与使用API的结果一致:

以上是关于直方图均衡的主要内容,如果未能解决你的问题,请参考以下文章

matlab全局直方图均衡化和局部直方图均衡化的优缺点

图像直方图均衡化

数字图像处理:直方图均衡化

OpenCV 直方图均衡化

直方图均衡与平台直方图

直方图均衡化