麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

IDL实现直方图均衡化

关于直方图均衡化

原始直方图变为均匀形式,使图像的熵最大,图像包含的信息量最大。

通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

该方法的缺点是可能会增加信噪比

直方图均衡化算法

P表示每个像素值出现的次数和总数的比例

S是累计密度函数,是均衡化的直方图

T是均衡化以后的图像

直方图均衡化算法实现

;Name: 直方图均衡化
;Time: 2013-12-16
;Author: 尹全超

PRO item_b_3
  
  ;读取图像
  file =  DIALOG_PICKFILE(/READ, FILTER = '*.bmp')
  binary_img = READ_BMP(file)
  img01 = image(binary_img,LAYOUT=[2,2,1],title='Original')
  
  ;计算原始图像直方图
  OrHisImg=intarr(256)
  OrHis=dblarr(256)
  row=N_elements(binary_img[0,*])
  col=N_elements(binary_img[*,0])
  ;统计
  FOR i=0,col-1,1 DO BEGIN
    FOR j=0,row-1,1 DO BEGIN
      OrHisImg[binary_img[i,j]]=OrHisImg[binary_img[i,j]]+1
    ENDFOR
  ENDFOR
  ;归一化
  FOR k=0,255,1 DO BEGIN
    OrHis[k]=OrHisImg[k]/double(max(OrHisImg))
  ENDFOR
  ;显示直方图
  bplot = BARPLOT(OrHis, TITLE='Original Histogram', YRANGE=[0,1], LAYOUT=[2,2,2],/CURRENT)
  
  ;直方图均衡化
  ArHis=ULONARR(256)
  ArHisD=dblarr(256)
  FOR i=0,255,1 DO BEGIN
    FOR j=0,i,1 DO BEGIN
      ArHis[i]=ArHis[i]+OrHisImg[j]
    ENDFOR
  ENDFOR
  ;归一化
  FOR k=0,255,1 DO BEGIN
    ArHisD[k]=ArHis[k]/double(max(ArHis))
  ENDFOR
  ;新图像
  new_image=bytarr(col,row)
  FOR i=0,col-1,1 DO BEGIN
    FOR j=0,row-1,1 DO BEGIN
      new_image[i,j]=byte(ArHisD[binary_img[i,j]]*255)
    ENDFOR
  ENDFOR
  ;显示新图像
  img3 = image(new_image, TITLE='NEW IMAGE', LAYOUT=[2,2,3],/CURRENT)
  
  ;计算新的直方图
  OrHisImg1=intarr(256)
  OrHis1=dblarr(256)
  ;统计
  FOR i=0,col-1,1 DO BEGIN
    FOR j=0,row-1,1 DO BEGIN
      OrHisImg1[new_image[i,j]]=OrHisImg1[new_image[i,j]]+1
    ENDFOR
  ENDFOR
  ;归一化
  FOR k=0,255,1 DO BEGIN
    OrHis1[k]=OrHisImg1[k]/double(max(OrHisImg1))
  ENDFOR
  ;显示直方图
  bplot1 = BARPLOT(OrHis1, TITLE='New Histogram', YRANGE=[0,1], LAYOUT=[2,2,4],/CURRENT)
  
  ;自带直方图
  imgor=image(binary_img,LAYOUT=[2,2,1],title='ZD-Original')
  bplotor = BARPLOT(OrHis, TITLE='ZD-Original Histogram', YRANGE=[0,1], LAYOUT=[2,2,2],/CURRENT)
  newimage=HIST_EQUAL(binary_img)
  imgorhis=image(newimage,LAYOUT=[2,2,3],/CURRENT,title='ZD-NEW')
  ;计算新的直方图
  OrHisImg2=intarr(256)
  OrHis2=dblarr(256)
  ;统计
  FOR i=0,col-1,1 DO BEGIN
    FOR j=0,row-1,1 DO BEGIN
      OrHisImg2[newimage[i,j]]=OrHisImg2[newimage[i,j]]+1
    ENDFOR
  ENDFOR
  ;归一化
  FOR k=0,255,1 DO BEGIN
    OrHis2[k]=OrHisImg2[k]/double(max(OrHisImg2))
  ENDFOR
  ;显示直方图
  bplot1 = BARPLOT(OrHis2, TITLE='ZD-New Histogram', YRANGE=[0,1], LAYOUT=[2,2,4],/CURRENT)
  
END

效果图

一些说明

在计算直方图的时候,出于直方图的美观,这里并没有除以总的像素,而是除以了像素中出现次数最多的像素数。

更自带的直方图均衡化做了一个对比

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

已有 4 条评论

  1. 麻辣GIS-aaaa
    1#
    aaaa  · 2015-12-18 11:55

    binary_img = READ_BMP(file)这句运行时出错,看语法是没有什么问题,但是是不是代码转义的问题呢?

      1. 麻辣GIS-Sailor
        Sailor  · 2015-12-18 12:38

        不是的,代码没有问题。

      2. 麻辣GIS-help
        help  · 2017-12-28 01:07

        我也是相同问题,请问你解决了吗?

          1. 麻辣GIS-Sailor
            Sailor  · 2017-12-28 09:25

            一个可能的原因是图片不是8位灰度的。

留言板(小编看到第一时间回复)