Matlab:图像直方图背后的原理,你确定真的懂嘛?
1.什么是直方图?
直方图(Histogram),又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
而什么是图像直方图呢?图像直方图通常用于统计图像中色阶的分布情况,根据直方图的情况,对过于集中的色阶段进行均衡化处理,提高图片的对比度。
怎么去实现图像直方图呢?
1.使用max()查看图像的最大色阶值。
img=imread('E:/cola1.jpg');%读取图片 [m,n,k]=size(img);%取出img的高+宽+深度 max1=max(img(m,n));%取出最大的k值,即该图片的最大色阶值。
2.定义color_vector色阶数组,统计色阶在图像中的像素个数。
color_vector=zeros(1,300);%这里的设定值可以取300,也可以去其他大于或等于max1的正整数。 for i=1:m for j=1:n k=img(i,j)+1;%取出当前像素的色阶值,防止当色阶等于0时,无对应下标。 color_vector(k)=color_vector(k)+1;%该色阶的统计量+1。 end end subplot(2,1,1),imshow(img);%显示图片以及直方图 subplot(2,1,2),bar(color_vector);
这里需要的注意的是matlab的数组下标都是从1开始的!!!
2.什么是直方图均衡化?
基本思想是把原始图的直方图变换级为均匀分布的形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。
怎样利用直方图均衡化算法来提高图像的对比度?
1. 扫描图像求nk,其中nk是第k个色阶在图像中出现的次数。
img=imread('E:/cola.jpg'); subplot(2,2,1),imshow(img); [m,n,K]=size(img); color_vector=zeros(1,300); for i=1:m for j=1:n k=img(i,j)+1; color_vector(k)=color_vector(k)+1; end end subplot(2,2,2),bar(color_vector);
2. 求pk=nk/MN,其中M和N分别是图像的高度和宽度。
img2=img;%新的图片 p=color_vector./(m*n);%对色阶进行像素的平均化。 s=zeros(1,256);%新的直方图
3. 遍历公式
for k=1:256 if k>1 s(k)=s(k-1)+p(k);%这里采用累加的思想,后来的sk是前面的sk和pk进行累加得来。 else s(k)=p(k);%s1前面不存在s0,所以直接是sk=pk。 end end
4.扫描图像根据色阶映射数组重建图像:将原图像中色阶为k的像素映射成色阶是[Lsk]的像素。
s=s*256;%将s映射到1~256的色阶范围。 for k=1:256 img2(img==k)=uint8(s(k));%用新的色阶数组替代原来的色阶数组。 end subplot(2,2,3),imshow(img2); for i=1:m for j=1:n k=img2(i,j)+1; color_vector(k)=color_vector(k)+1; end end subplot(2,2,4),bar(color_vector);%新的色阶直方图。
3.总结:
直方图均衡主要用于提高图片的对比度,针对于对比度较低,色阶分布集中的图片进行优化。