

程序:
/*
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

最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



