直方图拉伸

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




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







直方图拉伸是一种图像处理技术,用于增强图像对比度并改善视觉效果。在MATLAB中,直方图拉伸可以有效地将图像的灰度级范围最大化,使得图像的细节更为突出。 ### MATLAB中实现直方图拉伸的步骤: #### 1. 载入图像 首先,你需要读取或生成一张图像。例如,你可以直接使用预设函数加载一幅图像: ```matlab img = imread('example.jpg'); % 加载图像文件 ``` 如果图像为彩色,则需要转换成灰度图以便进行直方图操作: ```matlab grayImg = rgb2gray(img); ``` #### 2. 计算直方图 使用`imhist`函数计算图像的灰度级分布: ```matlab [counts, bins] = imhist(grayImg); ``` #### 3. 确定直方图的范围 找到图像中最小的灰度值(最小灰度)和最大的灰度值(最大灰度)。这将在直方图拉伸过程中作为映射的边界点。 ```matlab minVal = min(grayImg(:)); maxVal = max(grayImg(:)); ``` #### 4. 应用线性变换进行直方图拉伸 应用线性变换公式将原始灰度值映射到新范围内: ```matlab newGrayImg = (grayImg - minVal) * ((maxVal - minVal) / 255 + 1); newGrayImg = uint8(newGrayImg); % 将结果转换回8位整数格式 ``` 在这个公式中,我们将每个像素值缩放到0到255之间的范围,并通过将最小灰度值减去来避免负值,然后将其归一化到新的灰度级别范围。 #### 5. 显示增强后的图像 最后,我们可以显示经过直方图拉伸处理后的图像: ```matlab imshow(newGrayImg); title('Enhanced Image'); ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值