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. 效果