IDL实现直方图均衡化
发布时间: 2014-01-18
所属分类: 数字图像处理(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
效果图
一些说明
在计算直方图的时候,出于直方图的美观,这里并没有除以总的像素,而是除以了像素中出现次数最多的像素数。
更自带的直方图均衡化做了一个对比
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子
上一篇:IDL实现同态滤波
binary_img = READ_BMP(file)这句运行时出错,看语法是没有什么问题,但是是不是代码转义的问题呢?
不是的,代码没有问题。
我也是相同问题,请问你解决了吗?
一个可能的原因是图片不是8位灰度的。