灰度直方图均衡化(附源码)

1. 直方图均衡化的引入:
  在日常生活中我们经常碰到非常亮或者非常暗的图片,导致整张图片的对比度明显,说的专业一点就是整张灰度图的灰度在低灰度或者高灰度区过于集中。那么怎么解决这个问题呢?我们很自然地可以想到把这个灰度图的灰度区间拉大。对比度不就清晰了嘛~
2. 本质特性
  其实灰度直方图均衡化就是把聚集在一起的各个灰度跨度拉宽,一对一(其实严格来讲是多对一)地把一个灰度映射到一个灰度上。我们并不能说新生成的灰度是真实信息,它只是我们为了增强对比度变化得来的灰度。
3. 映射函数
  那么该怎么选择映射函数呢?
  应当有如下几个特点:
  其一,不应当破坏原有灰度的顺序,不能说原来相对亮的区域变得特别暗了,原来相对暗的区域变得特别亮了。打个比方,你不可以在变换后把天空太阳的灰度图变成“白纸上的黑洞”。
  其二,变换后的灰度图要差不多波及0到255的灰度,这是作为直方图均衡化所要达到最基本的条件。
  借鉴于概率统计的内容,我们可以很自然地想到一个概念:累计分布函数,这个函数是什么样的呢?
  这样:F(x)=P(X<=x),我们来看看他是否满足以上条件,当x=0时,F(x)为0;当x=1时,F(x)为1,且F(x)单调递增,与此同时,由于F(x)遍布0到1,将其值乘以255,则理论上可以遍布0到255的灰度值。
  到目前为止,我们已经选好了映射函数,接下来我们可以正式处理灰度直方图的均衡化问题了。
4. 实际操作
(作业要求对四张图像处理因此可以说是同一段代码复制了四遍)

H= imread('1.Dark.tif'); 

[m,n]=size(H);  

p=zeros(1,256);  

for i=0:255  
   p(i+1)=length(find(H==i))/(m*n);
end  
figure(1);
subplot(3,2,1);  
imshow(H);  
title('原图');  
subplot(3,2,2);  
bar(0:255,p,'b');  
title('原图直方图');  
 
c=zeros(1,256);  
for i=1:256  
     for j=1:i  
         c(i)=p(j)+c(i);                  
     end  
end  

s=round(c*255);  
b=H;  
for i=0:255  
     b(find(H==i))=s(i+1);                
end
  
subplot(3,2,3);  
imshow(b)                            
title('均衡化后图像');  


for i=0:255  
    k = find(s==i)
    GPeq(i+1)= sum(p(k));            
end  
subplot(3,2,4);  
bar(0:255,GPeq,'b'); title('均衡化后的直方图'); 

subplot(3,2,5);
x=0:1:255;
plot(x,s,'b');
axis([0 255 0 255]);

H= imread('2.light.tif'); 

[m,n]=size(H);  

p=zeros(1,256);  

for i=0:255  
   p(i+1)=length(find(H==i))/(m*n);
end  
figure(2);
subplot(3,2,1);  
imshow(H);  
title('原图');  
subplot(3,2,2);  
bar(0:255,p,'b');  
title('原图直方图');  
 
c=zeros(1,256);  
for i=1:256  
     for j=1:i  
         c(i)=p(j)+c(i);                  
     end  
end  

s=round(c*255);  
b=H;  
for i=0:255  
     b(find(H==i))=s(i+1);                
end
  
subplot(3,2,3);  
imshow(b)                            
title('均衡化后图像');  

for i=0:255  
    k = find(s==i)
    GPeq(i+1)= sum(p(k));            
end  
subplot(3,2,4);  
bar(0:255,GPeq,'b'); title('均衡化后的直方图'); 
subplot(3,2,5);
x=0:1:255;
plot(x,s,'b');
axis([0 255 0 255]);


H= imread('3.low contrast.tif'); 

[m,n]=size(H);  

p=zeros(1,256);  

for i=0:255  
   p(i+1)=length(find(H==i))/(m*n);
end  
figure(3);
subplot(3,2,1);  
imshow(H);  
title('原图');  
subplot(3,2,2);  
bar(0:255,p,'b');  
title('原图直方图');  
 
c=zeros(1,256);  
for i=1:256  
     for j=1:i  
         c(i)=p(j)+c(i);                  
     end  
end  

s=round(c*255);  
b=H;  
for i=0:255  
     b(find(H==i))=s(i+1);                
end
  
subplot(3,2,3);  
imshow(b)                            
title('均衡化后图像');  

for i=0:255  
    k = find(s==i)
    GPeq(i+1)= sum(p(k));            
end  
subplot(3,2,4);  
bar(0:255,GPeq,'b'); title('均衡化后的直方图'); 
subplot(3,2,5);
x=0:1:255;
plot(x,s,'b');
axis([0 255 0 255]);

H= imread('4.high contrast.tif'); 

[m,n]=size(H);  

p=zeros(1,256);  

for i=0:255  
   p(i+1)=length(find(H==i))/(m*n);
end  
figure(4);
subplot(3,2,1);  
imshow(H);  
title('原图');  
subplot(3,2,2);  
bar(0:255,p,'b');  
title('原图直方图');  
 
c=zeros(1,256);  
for i=1:256  
     for j=1:i  
         c(i)=p(j)+c(i);                  
     end  
end  

s=round(c*255);  
b=H;  
for i=0:255  
     b(find(H==i))=s(i+1);                
end
  
subplot(3,2,3);  
imshow(b)                            
title('均衡化后图像');  
 
for i=0:255  
    k = find(s==i)
    GPeq(i+1)= sum(p(k));            
end  
subplot(3,2,4);  
bar(0:255,GPeq,'b'); title('均衡化后的直方图'); 

subplot(3,2,5);
x=0:1:255;
plot(x,s,'b');
axis([0 255 0 255]);

5. 效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值