CLAHE.docx
- 文档编号:11767459
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:18
- 大小:19.99KB
CLAHE.docx
《CLAHE.docx》由会员分享,可在线阅读,更多相关《CLAHE.docx(18页珍藏版)》请在冰豆网上搜索。
CLAHE
#defineBYTE_IMAGE
#ifdefBYTE_IMAGE
typedefunsignedcharkz_pixel_t;/*for8bit-per-pixelimages*/
#defineuiNR_OF_GREY(256)
//#else
//typedefunsignedshortkz_pixel_t;/*for12bit-per-pixelimages(default)*/
//#defineuiNR_OF_GREY(4096)
#endif
/********PrototypeofCLAHEfunction.Putthisinaseparateincludefile.*****/
intCLAHE(kz_pixel_t*pImage,unsignedintuiXRes,unsignedintuiYRes,kz_pixel_tQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ,
kz_pixel_tMax,unsignedintuiNrX,unsignedintuiNrY,
unsignedintuiNrBins,floatfCliplimit);
/***********************Localprototypes************************/
staticvoidClipHistogram(unsignedlong*,unsignedint,unsignedlong);
staticvoidMakeHistogram(kz_pixel_t*,unsignedint,unsignedint,unsignedint,
unsignedlong*,unsignedint,kz_pixel_t*);
staticvoidMapHistogram(unsignedlong*,kz_pixel_t,kz_pixel_t,
unsignedint,unsignedlong);
staticvoidMakeLut(kz_pixel_t*,kz_pixel_t,kz_pixel_t,unsignedint);
staticvoidInterpolate(kz_pixel_t*,int,unsignedlong*,unsignedlong*,
unsignedlong*,unsignedlong*,unsignedint,unsignedint,kz_pixel_t*);
/**************Startofactualcode**************/
#include
constunsignedintuiMAX_REG_X=16;/*max.#contextualregionsinx-direction*/
constunsignedintuiMAX_REG_Y=16;/*max.#contextualregionsiny-direction*/
/*
*ANSICcodefromthearticle
*"ContrastLimitedAdaptiveHistogramEqualization"
*byKarelZuiderveld,karel@cv.ruu.nl
*in"GraphicsGemsIV",AcademicPress,1994
*
*
*ThesefunctionsimplementContrastLimitedAdaptiveHistogramEqualization.
*Themainroutine(CLAHE)expectsaninputimagethatisstoredcontiguouslyin
*memory;theCLAHEoutputimageoverwritestheoriginalinputimageandhasthe
*sameQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQimumandmaximumvalues(whichmustbeprovidedbytheuser).
*ThisimplementationassumesthattheX-andYimageresolutionsareaninteger
*multipleoftheX-andYsizesofthecontextualregions.Acheckonvariousother
*errorconditionsisperformed.
*
*#definethesymbolBYTE_IMAGEtomakethisimplementationsuitablefor
*8-bitimages.Themaximumnumberofcontextualregionscanberedefined
*bychanginguiMAX_REG_Xand/oruiMAX_REG_Y;theuseofmorethan256
*contextualregionsisnotrecommended.
*
*ThecodeisANSI-CandisalsoC++compliant.
*
*Author:
KarelZuiderveld,ComputerVisionResearchGroup,
*Utrecht,TheNetherlands(karel@cv.ruu.nl)
*/
/*####
IACModification:
IntheoriginalversionoftheClipHistogramfunctionitwaspossibleforaninfiniteloop
togetcreated.Iftherewasmorepixelstoberedistributedthanavailablespacethenthe
finalwhileloopwouldneverend.Thisproblemhasbeenfixedbystoppingtheloopwhenall
pixelshavebeenredistributedORwhennopixelswhereredistributedinthepreviousiteration.
Thischangeallowsverylowclippinglevelstobeused.
####*/
#include"clahe.h"
/**************************mainfunctionCLAHE******************/
intCLAHE(kz_pixel_t*pImage,unsignedintuiXRes,unsignedintuiYRes,
kz_pixel_tQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ,kz_pixel_tMax,unsignedintuiNrX,unsignedintuiNrY,
unsignedintuiNrBins,floatfCliplimit)
/*pImage-Pointertotheinput/outputimage
*uiXRes-ImageresolutionintheXdirection
*uiYRes-ImageresolutionintheYdirection
*QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ-QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQimumgreyvalueofinputimage(alsobecomesQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQimumofoutputimage)
*Max-Maximumgreyvalueofinputimage(alsobecomesmaximumofoutputimage)
*uiNrX-NumberofcontextialregionsintheXdirection(QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ2,maxuiMAX_REG_X)
*uiNrY-NumberofcontextialregionsintheYdirection(QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ2,maxuiMAX_REG_Y)
*uiNrBins-Numberofgreybinsforhistogram("dynamicrange")
*floatfCliplimit-Normalizedcliplimit(highervaluesgivemorecontrast)
*Thenumberof"effective"greylevelsintheoutputimageissetbyuiNrBins;selecting
*asmallvalue(eg.128)speedsupprocessingandstillproduceanoutputimageof
*goodquality.TheoutputimagewillhavethesameQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQimumandmaximumvalueastheinput
*image.Acliplimitsmallerthan1resultsinstandard(non-contrastlimited)AHE.
*/
{
/*
CStringstr;
DWORDdw1,dw2;
floatfTime;
dw1=GetTickCount();*/
unsignedintuiX,uiY;/*counters*/
unsignedintuiXSize,uiYSize,uiSubX,uiSubY;/*sizeofcontext.reg.andsubimages*/
unsignedintuiXL,uiXR,uiYU,uiYB;/*auxiliaryvariablesinterpolationroutine*/
unsignedlongulClipLimit,ulNrPixels;/*cliplimitandregionpixelcount*/
kz_pixel_t*pImPointer;/*pointertoimage*/
kz_pixel_taLUT[uiNR_OF_GREY];/*lookuptableusedforscalingofinputimage*/
unsignedlong*pulHist,*pulMapArray;/*pointertohistogramandmappings*/
unsignedlong*pulLU,*pulLB,*pulRU,*pulRB;/*auxiliarypointersinterpolation*/
if(uiNrX>uiMAX_REG_X)return-1;/*#ofregionsx-directiontoolarge*/
if(uiNrY>uiMAX_REG_Y)return-2;/*#ofregionsy-directiontoolarge*/
//if(uiXRes%uiNrX)return-3;/*x-resolutionnomultipleofuiNrX*/
//if(uiYRes%uiNrY)return-4;/*y-resolutionnomultipleofuiNrY*/
if(Max>=uiNR_OF_GREY)return-5;/*maximumtoolarge*/
if(QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ>=Max)return-6;/*QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQimumequalorlargerthanmaximum*/
if(uiNrX<2||uiNrY<2)return-7;/*atleast4contextualregionsrequired*/
if(fCliplimit==1.0)return0;/*isOK,immediatelyreturnsoriginalimage.*/
if(uiNrBins==0)uiNrBins=128;/*defaultvaluewhennotspecified*/
pulMapArray=(unsignedlong*)malloc(sizeof(unsignedlong)*uiNrX*uiNrY*uiNrBins);
if(pulMapArray==0)return-8;/*Notenoughmemory!
(tryreducinguiNrBins)*/
uiXSize=uiXRes/uiNrX;uiYSize=uiYRes/uiNrY;/*Actualsizeofcontextualregions*/
ulNrPixels=(unsignedlong)uiXSize*(unsignedlong)uiYSize;
if(fCliplimit>0.0){/*Calculateactualcliplimit*/
ulClipLimit=(unsignedlong)(fCliplimit*(uiXSize*uiYSize)/uiNrBins);
ulClipLimit=(ulClipLimit<1UL)?
1UL:
ulClipLimit;
}
elseulClipLimit=1UL<<14;/*Largevalue,donotclip(AHE)*/
MakeLut(aLUT,QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ,Max,uiNrBins);/*Makelookuptableformappingofgreyvalues*/
/*Calculategreylevelmappingsforeachcontextualregion*/
for(uiY=0,pImPointer=pImage;uiY { for(uiX=0;uiX { pulHist=&pulMapArray[uiNrBins*(uiY*uiNrX+uiX)]; MakeHistogram(pImPointer,uiXRes,uiXSize,uiYSize,pulHist,uiNrBins,aLUT); ClipHistogram(pulHist,uiNrBins,ulClipLimit); MapHistogram(pulHist,QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ,Max,uiNrBins,ulNrPixels); } pImPointer+=(uiYSize-1)*uiXRes;/*skiplines,setpointer*/ } /*InterpolategreylevelmappingstogetCLAHEimage*/ for(pImPointer=pImage,uiY=0;uiY<=uiNrY;uiY++) { if(uiY==0) {/*specialcase: toprow*/ uiSubY=uiYSize>>1;uiYU=0;uiYB=0; } else { if(uiY==uiNrY){/*specialcase: bottomrow*/ uiSubY=uiYSize>>1;uiYU=uiNrY-1;uiYB=uiYU; } else {/*defaultvalues*/ uiSubY=uiYSize;uiYU=uiY-1;uiYB=uiYU+1; } } for(uiX=0;uiX<=uiNrX;uiX++) { if(uiX==0) {/*specialcase: leftcolumn*/ uiSubX=uiXSize>>1;uiXL=0;uiXR=0; } else { if(uiX==uiNrX) {/*specialcase: rightcolumn*/ uiSubX=uiXSize>>1;uiXL=uiNrX-1;uiXR=uiXL; } else {/*defaultvalues*/ uiSubX=uiXSize;uiXL=uiX-1;uiXR=uiXL+1; } } pulLU=&pulMapArray[uiNrBins*(uiYU*uiNrX+uiXL)]; pulRU=&pulMapArray[uiNrBins*(uiYU*uiNrX+uiXR)]; pulLB=&pulMapArray[uiNrBins*(uiYB*uiNrX+uiXL)]; pulRB=&pulMapArray[uiNrBins*(uiYB*uiNrX+uiXR)]; Interpolate(pImPointer,uiXRes,pulLU,pulRU,pulLB,pulRB,uiSubX,uiSubY,aLUT); pImPointer+=uiSubX;/*setpointeronnextmatrix*/ } pImPointer+=(uiSubY-1)*uiXRes; } free(pulMapArray);/*freespaceforhistograms*/ /* dw2=GetTickCount(); fTime=float(dw2-dw1); str.Format("CLAHE%f",fTime); AfxMessageBox(str); */ return0;/*returnstatusOK*/ } voidClipHistogram(unsignedlong*pulHistogram,unsignedint uiNrGreylevels,unsignedlongulClipLimit) /*Thisfunctionperformsclippingofthehistogramandredistributionofbins. *Thehistogramisclippedandthenumberofexcesspixelsiscounted.Afterwards *theexcesspixelsareequallyredistributedacrossthewholehistogram(providing *thebincountissmallerthanthecliplimit). */ { unsignedlong*pulBinPointer,*pulEndPointer,*pulHisto; unsignedlongulNrExcess,ulOldNrExcess,ulUpper,ulBinIncr,ulStepSize,i; longlBinExcess; ulNrExcess=0;pulBinPointer=pulHistogram; for(i=0;i {/*calculatetotalnumberofexcesspixels*/ lBinExcess=(long)pulBinPointer[i]-(long)ulClipLimit; if(lBinExcess>0)ulNrExcess+=lBinExcess;/*excessincurrentbin*/ }; /*Secondpart: cliphistogramandredistributeexcesspixelsineachbin*/ ulBinIncr=ulNrExcess/uiNrGreyleve
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CLAHE