Matlab:图像直方图背后的原理,你确定真的懂嘛?

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. 遍历公式
s k = j = 0 k n j M N k = 0 , 1...... , L 1 , [ L s k ] s_k=\sum_{j=0}^{k}\frac{n_j}{MN}k=0,1......,L-1,求色阶映射数组[Ls_k]。

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.总结:

直方图均衡主要用于提高图片的对比度,针对于对比度较低,色阶分布集中的图片进行优化。

猜你喜欢

转载自blog.csdn.net/acceptedday/article/details/104929834