限制比自适应直方图均衡化







 

 

 

 

 程序:

/*

pImage:输入图像/输出图像

uiXRes:图像的宽,彩色图像为宽*3

uiYRes:图像高

Min:图像的像素的最小值

Max:图像像素的最大值

uiNrX:最小值大于2,最大值小于16,分割块的宽度

uiNrY:最小值大于2,最大值小于16,分割块的高度

uiNrBins:色阶数

fCliplimit:<=1.0不做剪裁,>1.0剪裁

*/

void CLAHE(uchar* pImage,uint uiXRes,uint uiYRes,uchar Min, 

uchar Max,uint uiNrX,uint uiNrY,uint uiNrBins,float fCliplimit)

{

uint uiX, uiY;

uint uiXSize, uiYSize; //分割块的宽高的数量 

uint uiSubX, uiSubY;  

uint uiXL, uiXR, uiYU, uiYB;//线性插值的变量  

ulong ulClipLimit, ulNrPixels; //剪裁区域和区域的像素数量    

uchar* pImPointer;

uchar aLUT[256];   

ulong* pulHist;//直方图

ulong *pulMapArray; //映射函数   

ulong* pulLU, *pulLB, *pulRU, *pulRB;//线性插值的数据,分别表示左上、左下、右上、右下       

pulMapArray=(ulong *)malloc(sizeof(ulong)*uiNrX*uiNrY*uiNrBins);

uiXSize = uiXRes/uiNrX; 

uiYSize = uiYRes/uiNrY; 

ulNrPixels = (ulong)uiXSize * (ulong)uiYSize;   

if(fCliplimit > 0.0)

{   

//计算实际剪裁

ulClipLimit = (ulong)(fCliplimit*(uiXSize*uiYSize)/uiNrBins);   

ulClipLimit = (ulClipLimit<1UL)?1UL:ulClipLimit;   

}   

else 

{

ulClipLimit = 1UL<<14; 

}  

MakeLut(aLUT,Min,Max,uiNrBins);//生成查找表   

//每个块计算映射   

for (uiY = 0, pImPointer = pImage; uiY < uiNrY; uiY++)    

{   

for (uiX = 0; uiX < uiNrX; uiX++, pImPointer += uiXSize)    

{   

pulHist = &pulMapArray[uiNrBins * (uiY * uiNrX + uiX)];   

MakeHistogram(pImPointer,uiXRes,uiXSize,uiYSize,pulHist,uiNrBins,aLUT);   

ClipHistogram(pulHist, uiNrBins, ulClipLimit);   

MapHistogram(pulHist, Min, Max, uiNrBins, ulNrPixels);   

}   

pImPointer += (uiYSize - 1) * uiXRes;          //skip lines, set pointer    

}   

//插值

for (pImPointer = pImage, uiY = 0; uiY < uiNrY; uiY++)    

{   

uiSubY = uiYSize;

if (uiY == uiNrY-1) 

{                     

uiYU = uiNrY-1;  

uiYB = uiNrY-1;   

}   

else    

{                      

uiYU = uiY ; 

uiYB = uiY + 1;   

}      

for (uiX = 0; uiX < uiNrX; uiX++)    

{   

uiSubX = uiXSize;

if (uiX == uiNrX-1)    

{               

uiXL = uiNrX-1; 

uiXR = uiNrX-1;   

}   

else    

{                      

uiXL = uiX; 

uiXR = uiX + 1;   

}     

pulLU = &pulMapArray[uiNrBins * (uiYU * uiNrX + uiXL)];   

pulRU = &pulMapAr

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值