版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/anpingbo/article/details/75732640
为了增强图像对比度,通常需要调整图像的灰度级分布,使得亮暗更加分明。如果一幅图像中某些灰度级分布概率过小,就会导致这部分图像不清晰,因此灰度级分布的越平均图像对比度越好。表现在空间上,如果减小分布较大的灰度级的面积,而增加分布较小的灰度级面积,就会突出原来显示不清晰的部分。
调整图像对比度可以看作一个灰度级变换的过程,通过灰度级变换来改变直方图分布。假设原来图像函数为f(r),分布概率密度为p(r)。
现在变换灰度级r,如下:
s=g(r)
直方图均衡要求,每个灰度级概率密度平均,即:
其中L-1为灰度级数。
根据总概率为1可以求出变换函数g(r)。
均衡的灰度级是原有灰度级概率密度的积分,用离散量表示为累加:
接下来看直方图均衡的处理效果,MATLAB程序包含统计灰度分布的grayLevel_ statistic.m和均衡化函数histogram_equal.m。
function f=grayLevel_statistic(gray, level)
[row, col]=size(gray);
f=linspace(0,0,level);
f=double(f);
for i=1:1:row
for j=1:1:col
f(gray(i,j)+1)=f(gray(i,j)+1)+1;
end
end
f=f./(row*col);
function T=histogram_equal(gray, level)
[row,col]=size(gray);
T=zeros(row, col);
p=grayLevel_statistic(gray, level);%get the probability of gray level
p_sum=linspace(0,0,level);
p_sum=double(p_sum);
for k=1:1:level
if k==1
p_sum(k)=p(k);
else
p_sum(k)=p_sum(k-1)+p(k);
end
end
for i=1:1:row
for j=1:1:col
if p_sum(gray(i,j)+1)*(level-1) >= level-1
T(i,j)=level-1;
else
T(i,j)=round(p_sum(gray(i,j)+1)*(level-1));
end
end
end
function histogram_image%filter image function
image=imread('timg.jpeg');
[d1,d2,d3]=size(image);
if d3==3
R=image(:,:,1);
G=image(:,:,2);
B=image(:,:,3);
gray=round((1/3)*(R+G+B));
elseif d3==2
R=image(:,:,1);
G=image(:,:,2);
gray=round((1/2)*(R+G));
else
gray=image;
end
T=histogram_equal(gray,256);
imshow(T, [0, 255]);
经过直方图处理后图像具有较好清晰度,增强了明暗对比。但是全局直方图均衡可能会模糊掉一些原来不突出的地方,掩盖掉细节。采用局部直方图均衡可以让细节更加清晰,通过在一个局部区域使用直方图均衡,然后移动到相邻区域继续进行直方图均衡,替换原来变换的灰度值。MATLAB中增加的局部直方图均衡代码为:
function T=histogram_local_equal(gray,level)
[row,col]=size(gray);
T=zeros(row,col);
%move the 3X3 template
for i=2:1:row-1
for j=2:1:col-1
template=gray(i-1:i+1,j-1:j+1);
%update the gray data using the local histogram data
T(i-1:i+1,j-1:j+1)=histogram_equal(template,level);
end
end
图1 (a)灰度图(b)全局直方图均衡处理(c)局部直方图均衡处理,采用3x3模板
参考文献:
1. 《数字图像处理》,Rafael. C. Gonzalez, Richard. E. woods.
2. 《image processing using matlab》, Rafael. C. Gonzalez.