資源簡介
用去圖像增強的一種常用方法,本資源基于論文Gray-level grouping (GLG) an automatic method for optimized image contrast Enhancement-part I the basic method實現(xiàn),c++編程實現(xiàn),需要opencv環(huán)境
代碼片段和文件信息
//GLG,自動實現(xiàn)最優(yōu)化的圖像對比增強
#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(“l(fā)ena.jpg“-1);?
//創(chuàng)建一個灰度圖像
????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?);?//創(chuàng)建窗口
????cvNamedWindow(?“GrayImage“?1?);?//創(chuàng)建窗口
????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[]存放各個灰度級出現(xiàn)的次數(shù)
//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));//把一維數(shù)組Hn全置零
int?height=src->height;//取得圖像尺寸
????int?width=src->width;
????long?wMulh?=?height?*?width;?
//求存放圖象各個灰度級出現(xiàn)的次數(shù)
????//?to?do?use?openmp
//char?*imageData;????????????????????????/*?指向排列的圖像數(shù)據(jù)?*/?
????//int?widthStep;????????????????????????????????/*?排列的圖像行大小,以字節(jié)為單位?*/?
????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的列數(shù)為Hn[k]的非0項個數(shù),Gray的行數(shù),為Hn[k]非0項個數(shù)減19
int?num=0;//用于統(tǒng)計Hn[k]中的非零項個數(shù)
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++;
}
}
//用一般數(shù)組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];
}
//循環(huán)從這開始,由第0行,計算到第num-20行,循環(huán)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的幅值
評論
共有 條評論