直方图拉伸

直方图拉伸,就是当图像的灰度级分布不均匀,只集中在某些区域时,把它扩充开来,使其充满整个灰度级:

直方图拉伸_第1张图片



直方图拉伸步骤(在灰度图上做处理):
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;
 }
}








你可能感兴趣的:(图像处理)