资源简介

用去图像增强的一种常用方法,本资源基于论文Gray-level grouping (GLG) an automatic method for optimized image contrast Enhancement-part I the basic method实现,c++编程实现,需要opencv环境

资源截图

代码片段和文件信息

//GLG,自动实现最优化的图像对比增强

#include 
#include “cv.h“
#include “highgui.h“
#include  
using namespace std;
int ImageGLG(IplImage *srcIplImage *dst);
int DrawHistogram(IplImage* src);//画src图像的直方图

int _tmain(int argc _TCHAR* argv[])
{
    IplImage * pImg;    
    pImg=cvLoadImage(“lena.jpg“-1); 

//创建一个灰度图像
    IplImage* GrayImage = cvCreateImage(cvGetSize(pImg) IPL_DEPTH_8U 1);
    IplImage* dstGrayImage = cvCreateImage(cvGetSize(pImg) IPL_DEPTH_8U 1);
    cvCvtColor(pImg GrayImage CV_BGR2GRAY);

ImageGLG(GrayImagedstGrayImage); 
DrawHistogram(GrayImage);//画原图像的直方图
DrawHistogram(dstGrayImage);//画GLG后图像的直方图

cvNamedWindow( “dstGrayImage“ 1 ); //创建窗口
    cvNamedWindow( “GrayImage“ 1 ); //创建窗口
    cvShowImage( “dstGrayImage“ dstGrayImage ); //显示图像
    cvShowImage( “GrayImage“ GrayImage ); //显示图像

    cvWaitKey(0); //等待按键 

cvDestroyWindow( “dstGrayImage“ );//销毁窗口
    cvDestroyWindow( “GrayImage“ );//销毁窗口
    cvReleaseImage( &pImg ); //释放图像
    cvReleaseImage( &GrayImage ); //释放图像
    cvReleaseImage( &dstGrayImage ); //释放图像 

return 0;



int ImageGLG(IplImage *srcIplImage *dst)
/*************************************************
  Function:        
  Description:     GLG图像对比增强
  Input:           单通道灰度图像                  
  Output:          同样大小的单通道灰度图像 
  Return:          
  DATE:               2013-10-16
*************************************************/
{
//Hn[]存放各个灰度级出现的次数
//Gray[][]存放非零的灰度级,Gray[0][]表示Hn[]的非零值,Gray[1][]表示G(n-1)(i),以此类推
//L[][]存放左极限,L[0][]表示L(n)(i),L[1][]表示L(n-1)(i),以此类推
//R[][]存放右极限,R[0][]表示R(n)(i),R[1][]表示R(n-1)(i),以此类推
assert(src->width==dst->width);//判断大小,如果输出和输入图像大小不等就报错退出
float Hn[256];
memset(Hn0sizeof(Hn));//把一维数组Hn全置零

int height=src->height;//取得图像尺寸
    int width=src->width;
    long wMulh = height * width; 

//求存放图象各个灰度级出现的次数
    // to do use openmp
//char *imageData;                        /* 指向排列的图像数据 */ 
    //int widthStep;                                /* 排列的图像行大小,以字节为单位 */ 
    for(int x=0;x        for(int y=0;y            uchar k=((uchar*)(src->imageData + src->widthStep*y))[x];
            Hn[k]++;
        }
    } 

//找出Hn[k]中的非0项,并把他赋给Gray[0][],Gray的列数为Hn[k]的非0项个数,Gray的行数,为Hn[k]非0项个数减19
int num=0;//用于统计Hn[k]中的非零项个数
float g[256]l[256]r[256];//暂时存放Gray,L,R第一行的值
for(int k=0;k<256;k++){
if(Hn[k]!=0){
g[num]=Hn[k];
l[num]=k;
r[num]=k;
num++;
}
}

//用一般数组Gray,L,R
float Gray[256][256];
float L[256][256];
float R[256][256];

//把Gray,LR的第0行初始化
for(int i=0;i Gray[0][i]=g[i];
L[0][i]=l[i];
R[0][i]=r[i];
}

//循环从这开始,由第0行,计算到第num-20行,循环num-20次
for(int ii=0;ii //找Gray[ii][]中的最小值a,及其位置ia
int a=Gray[ii][0];
int ia=0;
for(int i=0;i if(Gray[ii][i] a=Gray[ii][i];
ia=i;
}
}
cout<
//计算位置ia的灰度级与旁边较小的灰度级j合并j的幅值

评论

共有 条评论