直方图拉伸

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




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







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值