直方图增强是调整图像直方图到一个预定的形状,例如,一些图像由于其灰度分布集中在较窄的区间,对比度很弱,图像细节看不清楚,此时,可以采用图像灰度直方图均衡化处理,使得图像的对比度增大,加大图像的动态范围,扩展图像对比度,使得图像清晰,特征明显。
直方图:
图像直方图是用来表达一幅图像灰度级分布情况的统计表,它反映图像整体的灰度值的分布情况,及图像的明暗情况和图像灰度级的动态范围。(在matlab中有imhist函数和hist函数来显示图像直方图,其中imhist函数用来显示数据类型为uint8的图像,hist函数用来显示数据类型为double的图像)
直方图均衡化:
直方图均衡可以将任意分布规律直方图的原始图像变换为具有均匀分布的直方图的图像。所以,直方图均衡化可以增加像素灰度值的动态范围,使每一灰度层次所占的像素个数尽量均等,可以改善图像的整体对比度。(matlab中函数histeq函数可以实现图像的直方图均衡化,简单的调用格式为——H=histeq(I,L),其中I为原始图像;L为灰度级数,其缺省时为64)
直方图均衡的具体算法就不在这里详细叙述啦~
1.根据直方图均衡的原理编写程序,来对图像进行处理:
代码:
function junhenghua(I)
%直方图均衡化
%2019_3_30_Airphace
%I为输入的灰度图像
figure(1);
subplot(1,2,1);
imshow(I);%显示原始灰度图
title('原始图像');
subplot(1,2,2);
imhist(I);%显示原始灰度图的灰度直方图
title('原始灰度直方图');
%统计灰度级
[h,w]=size(I); %确定图片的尺寸,h为行数即图像的宽(height),w为列数即图像的长(width)
n_k=zeros(1,256);%256个灰度级
for i=1:1:h
for j=1:1:w
n_k(I(i,j)+1)=n_k(I(i,j)+1)+1;
end
end
F=h*w;%计算图像总像素点
%计算原始直方图
p_k=zeros(1,256);
for i=1:1:256
p_k(i)=n_k(i)/F;
end
%计算累积直方图
s_k=zeros(1,256);
s_k(1)=p_k(1);
for i=2:1:256
s_k(i)=s_k(i-1)+p_k(i);
end
%计算新的灰度值
t_k=zeros(1,256);
t_k=uint8(255.*s_k); %实现四舍五入
%计算新图像各像素点的灰度
N=zeros(h,w);
for i=1:1:h
for j=1:1:w
N(i,j)=t_k(I(i,j)+1);
end
end
N=uint8(N);
figure(2);
subplot(1,2,1);
imshow(N);
title('直方图均衡化后的图像');
subplot(1,2,2);
imhist(N);
title('直方图均衡化后的图像直方图');
end
运行结果:
均衡化前:
均衡化后:
对比直方图均衡化前后的两个图像,可以清晰的看出,灰度的动态范围展宽,2平缓图像变亮,细节更加清晰,直方图趋于平缓。
2. 调用histeq函数进行直方图均衡:
代码:
I=imread('C:\Users\lenovo\Desktop\jun.png');
I=rgb2gray(I);
H=histeq(I,256);%选择灰度级为256
figure(1);
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imhist(I);
subplot(2,2,3);
imshow(H);
subplot(2,2,4);
imhist(H);
结果展示:
上述两种直方图均衡化的效果相同!