项目场景:MATLAB图像均衡
问题描述:
影响图像的视觉效果的一个重要的因素就是图像的对比度,如果图像的对比度很小,表现在直方图当中就是灰度值偏向一侧,对比度小,就会使得图像看起来要么很暗要么很亮。直方图均衡的本质是灰度值映射。而映射函数可以由分布曲线(累积直方图)得到。提高图像对比度的变换函数f(x)需要满足一下条件:f(x)在0<=x<=L−1上单调递增(不要求严格单调递增),其中L表示灰度级(L=256),f(x)的范围是[0,L−1]。图像直方图完全均匀分布的时候,此时图像的熵是最大的(随机变量每个值的概率都相同时,概率最大),图像对比度是最大的。有一个重要的函数,能够满足上面的条件:
px(x)表示概率密度函数,在离散的图像中,表示直方图的每个灰度级的概率。可以使用求和代替积分,差分代替微分,所以上述的变换函数就是:
例如均衡前后直方图为:
srcImageHit=imread('E:\DigitalImage\直方图\TestImageHit.jpg');%需要均衡处理的图像
subplot(2,3,1);
imshow(srcImageHit);
title('原图');
[MH,NH,CH]=size(srcImageHit);%获取图像参数
frqImage=zeros(3,256);
grayValue=0:1:255;
for rgb=1:3
for i=1:MH
for j=1:NH
for num=1:256
if(srcImageHit(i,j,rgb)==num-1)
frqImage(rgb,num)=frqImage(rgb,num)+1;
break;
end
end
end
end
end
frqImage=frqImage/MH/NH;
subplot(2,3,2);
bar(grayValue,frqImage(1,:));
xlim([0,255]);
title('原图R通道灰度直方图');
subplot(2,3,3);
bar(grayValue,frqImage(2,:));
xlim([0,255]);
title('原图G通道灰度直方图');
subplot(2,3,5);
bar(grayValue,frqImage(3,:));
xlim([0,255]);
title('原图B通道灰度直方图');
figure;
%图像均衡化处理
s = zeros(3,256);
for rgb=1:3
for i = 1:256
for j = 1:i
s(rgb,i) = s(rgb,i)+255*frqImage(rgb,j);
end
end
s(rgb,:) = uint8(s(rgb,:));
for i = 1:MH
for j = 1:NH
for k = 1:256
if srcImageHit(i,j,rgb) == k-1
srcImageHit(i,j,rgb) = s(rgb,k);
break;
end
end
end
end
end
subplot(2,3,1);
imshow(srcImageHit);
title('均衡化后的图像');
imwrite(srcImageHit,'E:\DigitalImage\直方图\JTestImageHit.jpg');
frqImage=zeros(3,256);
grayValue=0:1:255;
for rgb=1:3
for i=1:MH
for j=1:NH
for num=1:256
if(srcImageHit(i,j,rgb)==num-1)
frqImage(rgb,num)=frqImage(rgb,num)+1;
break;
end
end
end
end
end
frqImage=frqImage/MH/NH;
subplot(2,3,2);
bar(grayValue,frqImage(1,:));
xlim([0,255]);
title('均衡图R通道灰度直方图');
subplot(2,3,3);
bar(grayValue,frqImage(2,:));
xlim([0,255]);
title('均衡图G通道灰度直方图');
subplot(2,3,5);
bar(grayValue,frqImage(3,:));
xlim([0,255]);
title('均衡图B通道灰度直方图');
实验结果:
注:本次程序代码中直方图的绘制,图像二值化方法等部分的内容可以调用matlab相关函数,由于该部分代码由我自己编写,所以代码相对冗杂,大家只需要了解其数学算法原理即可。**