天天看点

数字图像的直方图均衡化(C/C++源代码)

数字图像的直方图均衡化是常用的图像增强方法,因为均衡化是自动完成的,无需人工干预,而且常常得到比较满意的结果。下面的程序是利用OPENCV提供的函数,实现这个功能。需要OPENCVB4.0的支持,在VC6下编译通过。

//

// perform histgram equalization for single channel image

// AssureDigit Sample code

#include "cv.h"

#include "highgui.h"

#defineHDIM   256    // bin ofHIST, default = 256

int main( int argc, char** argv )

{

    IplImage*src = 0, *dst = 0;

    CvHistogram*hist = 0;

    int n =HDIM;    

    doublenn[HDIM];

    ucharT[HDIM];

    CvMat*T_mat;

    int x;

    int sum = 0;// sum of pixels of the source image 图像中象素点的总和

    double val =0;

    if( argc !=2 || (src=cvLoadImage(argv[1], 0)) == NULL)  //force to gray image

       return -1;

   cvNamedWindow( "source", 1 );

   cvNamedWindow( "result", 1 );

    // calculatehistgram 计算直方图

    hist =cvCreateHist( 1, &n, CV_HIST_ARRAY, 0, 1); 

    cvCalcHist(&src, hist, 0, 0 );

    // CreateAccumulative Distribute Function of histgram

    val =0;

    for ( x = 0;x < n; x++)

    {

       val = val + cvGetReal1D (hist->bins, x);

       nn[x] = val;

    }

    //Compute intensity transformation 计算变换函数的离散形式

    sum =src->height * src->width;

    for( x = 0;x < n; x++ )

       T[x] = (uchar) (255 * nn[x] / sum); // range is [0,255]

    // Dointensity transform for source image

    dst =cvCloneImage( src );

    T_mat =cvCreateMatHeader( 1, 256, CV_8UC1 );

    cvSetData(T_mat, T, 0);   

    // directlyuse look-up-table function 直接调用内部函数完成 look-up-table的过程

    cvLUT( src,dst, T_mat );

   cvShowImage( "source", src );

    cvShowImage("result", dst );

   cvWaitKey(0);

   cvDestroyWindow("source");

   cvDestroyWindow("result");

   cvReleaseImage( &src );

   cvReleaseImage( &dst );

   cvReleaseHist ( &hist );

    return0;

}

本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2008/04/11/1586546.html,如需转载请自行联系原作者

继续阅读