MATLAB-真彩色图像直方图均衡化及分别在RGB与HSI坐标系进行处理
Posted Kaerou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB-真彩色图像直方图均衡化及分别在RGB与HSI坐标系进行处理相关的知识,希望对你有一定的参考价值。
目录
灰度直方图
什么是灰度直方图?
(已知晓的请直接跳转到真彩色图像部分)
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。
不同的灰度分布对应着不同的图像质量。灰度直方图能反映图像的概貌和质量,也是图像增强处理的重要依据
下面这张月亮,其右为对应的灰度直方图
图像上的灰暗区域占了比较多的部分,从直方图看,在0-20灰度值(灰度值范围为0-255)的像素点较多,灰度值较大的像素点属于月球。直接看直方图可以清楚知晓图像概貌
再看看这张mandi,与上图的月亮一样,均为MATLAB图库图片。
mandi这张图分辨率为3039*2014,而月球的分辨率为358*537,观察直方图各灰度值对应y轴的像素个数也能知道其分辨率更大。
灰度直方图的性质
许录平《数字图像处理》(第二版) P65
下面三幅图的灰度直方图是一样的,因为它们黑色格子与白色格子所占面积是一样的,此为直方图与图像的一对多特性。
许录平《数字图像处理》(第二版) P66
如果对直方图的概念还是不太明了,可以看看这篇文章:图像的灰度直方图
在处理真彩色图像之前,我们先看看如何对灰度图像进行直方图均衡化
直方图均衡化处理灰度图像
均衡化步骤
许录平《数字图像处理》(第二版) P69
代码
实现了步骤中的1-6
clear;close all;clc;
%灰度直方图的均衡化
%获取图像基本信息
f=imread('pout.tif'); %读取图像
[m,n,~]=size(f); %读取矩阵行列数
a=zeros(1,256); %提前建立矩阵提高运算速度,灰度值范围是0到255,共有256个灰度级
%统计原图像各灰度级的像素个数
for i=1:m
for o=1:n
a(1,f(i,o)+1)=a(1,f(i,o)+1)+1; %哪个灰度级出现一次就记数一次
end
end
%计算原始图像直方图P(i)
Pi=zeros(1,256);
S=m*n;
for h=1:256
Pi(1,h)=a(1,h)/S;
end
%计算累计直方图P(j)
Pj=zeros(1,256);
Pj(1,1)=Pi(1,1);
for g=2:256
Pj(1,g)=Pj(1,g-1)+Pi(1,g);
end
%计算变换后的亮度值
j=zeros(1,256);
for i=1:256
j(1,i)=round(255*Pj(1,i)+0.5); %四舍五入取整
end
%进行灰度变换
fequ=f;
for q=1:m
for e=1:n
fequ(q,e)=j(1,f(q,e)+1);
end
end
代码分析
我选择了一副整体偏暗,而且灰度级分数集中的图片,就是上面这个小女孩
这个直方图和上面那个比较像,改变的是y轴,一个是像素个数,一个是比例
变换函数曲线即为Pj,从0→1
用imshow对比下原图和处理后的图像,能明显看出不同,对比度增大了许多,图像更加清晰
我们接下来再使用imhist看一下两幅图的灰度直方图
能看出均衡化后的直方图均衡了许多,原本原图像中具有相近灰度且占有大量像素点的区域的灰度范围展宽,使得大区域中微小灰度变化显现出来,使图像更加清晰
我们再单独看一下变换函数,了解一下直方图为何会这样变化
此为上述代码中的累积直方图——Pj,它从0增长到1,其实就是每个像素的所占比例一个一个加起来。在灰度级为70左右开始增加,原图直方图也是在70左右才有像素点,同理在200灰度级处Pj接近于1,原图直方图在200灰度级后的像素点很少。由灰度变换函数公式j(1,i)=round(255*Pj(1,i)+0.5),能判断出:某灰度级对应的Pj越大,它转换后的灰度级也越大。
所以灰度级70左右的像素点展宽到0灰度级附近,灰度级200左右的像素点展宽到255灰度级附近
铺垫了这么多,接下来我们看一下如何使用直方图均衡化处理真彩色图像吧
直方图均衡化处理真彩色图像
许录平《数字图像处理》(第二版) P102
我们要进行的是分别对RGB分量进行均衡化处理,然后在HSI空间单独对I(亮度)进行均衡化,而不对H(色度)与S(饱和度)进行处理,最后比较两种处理方式的结果。
此处不展开讲RGB与HSI俩坐标系的转换关系,代码这里有:MATLAB-RGB和HSI的相互转换
代码
clear;close all;clc;
f=imread('llama.jpg'); %读取图像
f=im2double(f);
R=f(:,:,1); %R基色
G=f(:,:,2); %G基色
B=f(:,:,3); %B基色
R_equ=histogram_equalization(R); %均衡化,此处为上面的代码整合成function文件
G_equ=histogram_equalization(G);
B_equ=histogram_equalization(B);
f_equ=cat(3,R_equ,G_equ,B_equ); %整合
hsi_f=rgb2hsi(f); %转换成HSI彩色空间
H=hsi_f(:,:,1); %色度分量
S=hsi_f(:,:,2); %饱和度分量
I=hsi_f(:,:,3); %亮度分量
I_equ=histogram_equalization(I); %均衡化
hsi_f_equ=cat(3,H,S,I_equ); %整合
fI_equ=hsi2rgb(hsi_f_equ); %转换回RGB空间
subplot(131),imshow(f),title('原图')
subplot(132),imshow(f_equ),title('RGB均衡化')
subplot(133),imshow(fI_equ),title('I均衡化')
代码分析
使用的依旧是MATLAB图库里的图片,一只美洲鸵,首先要做的便是提取RGB的三个分量,我们看一下提取出来的三基色分别长啥样
能看出差别,B基色会偏暗些,RG基色偏亮一些,那我们再看一下这张图的直方图
如直方图展示,B基色整体灰度级偏低一些,视觉上看着便是偏暗一下,255处的R基色像素个数特别多,看上一张图的美洲鸵的身体部分也对应的上。
对RGB三基色分别进行均衡化(使用function),然后再用cat整合成一整幅图像,能看出整体变化较大,红绿蓝三种颜色都比较明显,接下来我们看看单独对I做均衡化的结果
先把RGB坐标系转为HSI坐标系,然后提前分量,再单独对I做均衡化 ,整合后再转回RGB坐标系,是否感觉视觉效果好了不少?那我们再看看直方图的变化
结果非常的amazing啊, 能看出对RGB均衡化后,它们的分布变得散乱起来,某些区域只有一两种基色,从图片也能看出红绿蓝显眼了许多;对I均衡化后,各基色分布比较均匀,图片视觉效果也非常棒。其实原图的各灰度分布已经比较均匀了,I才如此均匀,我选这幅图进行说明便是因为对I处理效果比较好。
我们可以得出结论,对I均衡化效果相较于对RGB均衡化的会更好,其本质原因是直方图均衡化是非线性变化。在HSI空间是单独对I分量进行均衡化,H、S分量不受影响,而在RGB坐标系是分别对R、G、B分量进行均衡化,因此,对I单独均衡化效果自然更好。
得出结论后我们再看看另一组图,MATLAB图库的office_2.jpg,进行同样的处理
单单从视觉效果上看,我是更喜欢对RGB分别均衡化处理的这张图的,所以,我们对不同图片进行增强处理时应该多尝试不同的方式,挑选出更适合我们人眼观察的处理方法。
如果觉得这片文章对你有用的话,能否点个赞再走呢?
以上是关于MATLAB-真彩色图像直方图均衡化及分别在RGB与HSI坐标系进行处理的主要内容,如果未能解决你的问题,请参考以下文章