一、前言
颜色特征属于图像的内部特征,描述了图像或图像区域所对应景物的表面性质。颜色特征与其他视觉特征相比,它对图像的尺寸、方向、视角等变化不敏感,因此颜色特征被广泛应用于图像识别。根据颜色与空间属性的关系,颜色特征的表示方法可以有颜色矩、颜色直方图、颜色相关等几种方法。
二、颜色矩
1、基本原理
颜色矩是以数字方法为基础的,通过计算矩来描述颜色的分布。颜色矩通常直接在RGB空间计算,由于颜色分布信息主要集中在低阶矩,因此,常采用一阶矩、二阶矩和三阶矩来表达图像的颜色分布。它们的定义分别是:
其中,Pij 是第 j 个像素的第 i 个颜色分量,N是像素数量。一阶矩定义了每个颜色分量的平均强度;二阶矩反映待测区域的颜色方差,即不均匀性;三阶矩定义了颜色分量的偏斜度,即颜色的不对称性。颜色矩不能区分颜色区域的空间分布位置。彩色图像的颜色矩一共有9个分量,每个颜色通道均有3个低阶矩。
在MATLAB中,颜色矩的求解方法既可以调用MATLAB自有函数mean2()和std()实现,也可以根据颜色矩定义编程实现。
2、matlab实现
(1)利用函数mean2()和std()对灰度图像进行一阶矩、二阶矩和三阶矩的计算
close all;
clear all;
clc;
J=imread('sherlock.jpg');
K=imadjust(J,[70/255 160/255],[]);% imadjust函数既可以调节灰度图像的亮度又可以彩色图像的颜色矩阵(灰度级调整将[70 160]的灰度扩展到[0 255]),增强对比度)
subplot(121),imshow(J);
title('原始图像');
subplot(122),imshow(K);
title('对比度增强的图像');
% 计算原始图像的大小
[m,n]=size(J);
mm=round(m/2);
nn=round(n/2);
% 计算对比度增强图像的大小
[p,q]=size(K);
pp=round(p/2);
qq=round(q/2);
J=double(J);
K=double(K);
% 求原始图像和对比度增强的图像的一阶矩即均值
Javg=mean2(J);
Kavg=mean2(K);
% 求原始图像和对比度增强的图像的二阶矩即求两次方差
Jstd=std(std(J));
Kstd=std(std(K));
% 求原始图像和对比度增强的图像的三阶矩,此处根据三阶矩公式循环求解
colorsum1=0.0;
for i=1:mm
for j=1:nn
colorsum1=colorsum1+(J(i,j)-Javg)^3;
end
end
Jske=(colorsum1/(mm*nn)^(1/3));
colorsum2=0.0;
for i=1:pp
for j=1:qq
colorsum2=colorsum2+(K(i,j)-Kavg)^3;
end
end
Kske=(colorsum2/(pp*qq)^(1/3));
% 将各值在命令行窗口输出
disp(Javg);
disp(Kavg);
disp('-----');
disp(Jstd);
disp(Kstd);
disp('-----');
disp(Jske);
disp(Kske);
命令行窗口:
106.1610
119.0766
-----
(:,:,1) =
10.1845
(:,:,2) =
14.0829
(:,:,3) =
17.6792
(:,:,1) =
15.3000
(:,:,2) =
31.1684
(:,:,3) =
38.8424
-----
-3.1918e+08
-1.5278e+09
实现效果:
根据颜色特征值分析,颜色的一阶矩运行结果显示第一幅图的值小于第二幅图的值,即第一幅图比第二幅图灰暗些;颜色二阶矩运行结果显示第一幅图的灰度分布比第二幅图的灰度分布均匀些;颜色三阶矩运行结果显示第一幅图灰度偏暗,第二幅图偏亮,二者灰度值偏斜方向相反。
(2)基于颜色特征识别花朵和叶子
% 基于颜色特征识别花朵和叶子
close all;
clear all;
clc;
I=imread('flower.jpg');
R=I(:,:,1);% 求RGB图像的红色分量
G=I(:,:,2);% 求RGB图像的绿色分量
B=I(:,:,3);% 求RGB图像的蓝色分量
R=double(R);G=double(G);B=double(B);
% 求一阶矩
Ravg1=mean2(R);
Gavg1=mean2(G);
Bavg1=mean2(B);
% 求二阶矩
Rstd1=std(std(R));
Gstd1=std(std(G));
Bstd1=std(std(B));
J=imread('leaf.jpg');
R=J(:,:,1);% 求RGB图像的红色分量
G=J(:,:,2);% 求RGB图像的绿色分量
B=J(:,:,3);% 求RGB图像的蓝色分量
R=double(R);G=double(G);B=double(B);
% 求一阶矩
Ravg2=mean2(R);
Gavg2=mean2(G);
Bavg2=mean2(B);
% 求二阶矩
Rstd2=std(std(R));
Gstd2=std(std(G));
Bstd2=std(std(B));
K=imread('yellowlily.jpg');
subplot(131),imshow(K);
title('原始图像');
subplot(132),imshow(I);
title('花朵图像');
subplot(133),imshow(J);
title('叶子图像');
% 各值在命令行窗口输出
% 花朵的红色分量R占主导地位,且R分量显著高于G和B的值
disp('花朵的一阶矩和二阶矩');
disp(Ravg1);
disp(Gavg1);
disp(Bavg1);
disp(Rstd1);
disp(Gstd1);
disp(Bstd1);
% 叶子以绿色分量G为主,为花朵和叶子的识别提供了很好的依据
disp('叶子的一阶矩和二阶矩');
disp(Ravg2);
disp(Gavg2);
disp(Bavg2);
disp(Rstd2);
disp(Gstd2);
disp(Bstd2);
disp(Ravg1);
disp(Ravg1);
命令行窗口:
花朵的一阶矩和二阶矩
156.4057
129.9509
8.6057
26.7783
23.5673
5.1538
叶子的一阶矩和二阶矩
30.0936
62.5163
13.5108
6.3131
5.0523
4.6988
156.4057
156.4057
实现效果:
程序运行后分别求出花朵和叶子区域的R、G、B分量的颜色特征值,观察可知,在相同光照下,花朵区域以红色分量最大,叶子区域以绿色分量最大,为花朵和叶子的识别提供了很好的依据。
三、颜色直方图
1、基本原理
许多图像识别系统中广泛采用颜色直方图作为图像的颜色特征,它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图反映了图像颜色分布的统计特性,适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。最常用的颜色空间有RGB颜色空间和HSV颜色空间等。
设一幅图像包含M个像素,图像的颜色空间被量化成N个不同颜色。颜色直方图H定义为:
其中,hi 为第 i 种颜色在整幅图像中具有的像素数。颜色直方图归一化为:
由上式可见,颜色直方图所描述的是不同色彩在整幅图像中所占的比例,无法描述图像中的对象或物体。
2、matlab实现
(1)绘制彩色图像的R、G和B分量的直方图
close all;
clear all;
clc;
I=imread('redflower.jpg');
R=I(:,:,1);% 求RGB图像的红色分量
G=I(:,:,2);% 求RGB图像的绿色分量
B=I(:,:,3);% 求RGB图像的蓝色分量
figure(1);
subplot(221),imshow(I);
title('原始图像');
subplot(222),imshow(R);
title('R分量灰度图像');
subplot(223),imshow(G);
title('G分量灰度图像');
subplot(224),imshow(B);
title('B分量灰度图像');
figure(2);
subplot(131),imhist(I(:,:,1));
title('红色分量直方图');
subplot(132),imhist(I(:,:,2));
title('绿色分量直方图');
subplot(133),imhist(I(:,:,3));
title('蓝色分量直方图');
实现效果:
(2)通过函数rgb2hsv()将颜色空间由RGB转换成HSV,求HSV颜色空间下直方图
% 由于RGB颜色空间不符合人对颜色的感知心理,常采用面向视觉感知的HSV颜色模型对HSV空间进行适当量化后再计算其直方图,以减少计算量
close all;
clear all;
clc;
J=imread('redflower.jpg');
hsv=rgb2hsv(J);
h=hsv(:,:,1);
s=hsv(:,:,2);
v=hsv(:,:,3);
havg=mean2(h);
savg=mean2(s);
vavg=mean2(v);
figure(1);
subplot(131),imshow(h);
title('基于色调h的灰度图像');
subplot(132),imshow(s);
title('基于饱和度s的灰度图像');
subplot(133),imshow(v);
title('基于亮度v的灰度图像');
figure(2);
subplot(131),imhist(h);
title('显示色调h的直方图');
subplot(132),imhist(s);
title('显示饱和度s的直方图');
subplot(133),imhist(v);
title('显示亮度v的直方图');
实现效果: