直方图拉伸,就是当图像的灰度级分布不均匀,只集中在某些区域时,把它扩充开来,使其充满整个灰度级:
直方图拉伸步骤(在灰度图上做处理):
1、求灰度图gray的最大和最小值:imax和imin:
①统计每个灰度级出现的像素数量:unsigned char grayArray[i], int i∈[0,255];
②初始化imax = 255, imin = 0
③从grayArray[0]开始往后遍历,同时hist_sum += grayArray[i],当grayArray[i]>minValue 或
者 hist_sum > percent*width*height时,遍历结束, imin = i。其中 minValue 和 percent是事
先设置好的参数,minValue表示灰度的个数小于minValue时,忽略为0;percent表示
grayArray[i]累加到一定百分比时,就可以确定最小值。
④从grayArray[255]开始往前遍历,每次i-- ,情况和计算imin一样,当grayArray[i] >
minValue 或者 hist_sum > percent*width*height时,遍历结束, imax = i。
2、计算拉伸后的图像:
dst = (255/(imax – imin)+0.5)*(src-imin) 并且限制dst属于[0,255]之间。
代码如下:
void HistStrech(unsigned char *src, unsigned char *dst, int width, int height, int minValue, float percent)
{
int hist[256] = {0};
int fpHist[256] = {0};
int eqHistTemp[256] = {0};
int i ,j;
for (i = 0;i < height * width; i++)
{
unsigned char GrayIndex = src[i];
hist[GrayIndex] ++ ;
}
int min = 0;
int max = 255;
int hist_sum = 0;
for(;min< 256;min++)
{
hist_sum += hist[min];
if((hist[min] > minValue) || hist_sum > percent*width*height)
break;
}
hist_sum = 0;
for(;max >= 0; max--)
{
hist_sum += hist[min];
if(hist[min] > minValue || hist_sum > percent*width*height)
break;
}
int a = 0;
for(i = 0; i < height * width; i++)
{
a = (255/(max - min) + 0.5)*(src[i]-min);
if(a < 0) a = 0;
if(a > 255) a = 255;
dst[i] = a;
}
}