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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

文艺小青年 2017-05-31 22:48:00 浏览849
展开阅读全文

数字图像的直方图均衡化是常用的图像增强方法,因为均衡化是自动完成的,无需人工干预,而且常常得到比较满意的结果。下面的程序是利用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,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
文艺小青年
+ 关注