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

效果图

一些说明

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

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

IDL实现同态滤波 IDL实现3*3均值滤波和中值滤波

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

已有 2 条评论

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

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

      1. Sailor
        Sailor  · 2015-12-18 12:38

        不是的,代码没有问题。

发表评论