图像特征分析:颜色特征描述,颜色矩,颜色直方图(附matlab代码)

Posted LLLLnannan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像特征分析:颜色特征描述,颜色矩,颜色直方图(附matlab代码)相关的知识,希望对你有一定的参考价值。

图像分析可以看作是一个图像信息提取的过程,从图像中获取需要的有用的数据。图像特征可以分为视觉特征和统计特征,视觉特征主要是指人的视觉直观感受到的自然特征,比如图像的颜色、纹理、形状等,统计特征是指需要通过变换测量才能得到的特征,比如频谱、直方图等。

根据视觉特征的分类,本专题分别开三篇博客对颜色特征、纹理特征、形状特征进行介绍。
本篇主要介绍颜色特征分析及matlab的实现方法。

一. 颜色特征分析

颜色特征属于图像的内部特征,对于图像的尺寸、方向、视角等变化均不敏感,因此被广泛的应用于图像识别中,下面主要介绍两种颜色特征的表示方法:颜色矩和颜色直方图。

1. 颜色矩

1.1 原理解释

颜色矩是以数学方法为基础的,通过计算矩来描述颜色的分布。对于随机变量R,它的概率分布可以由其各阶矩唯一的表示和描述,如果将一张数字图像所有像素点的颜色值看作一个概率分布,那么图像同样可以由其各阶矩表示和描述。
颜色矩通常是在RGB颜色空间计算,常用一阶矩、二阶矩、三阶矩表达图像的颜色分布。
彩色图像有3个通道,每个通道有三个低阶矩,因此彩色图像的颜色矩一共有9个分量。
(1)一阶颜色矩
一阶颜色矩采用一阶原点矩,即均值。反映图像的整体明暗程度。值越大,图像越亮。

(上式中,i是图像的颜色通道数,若为灰度图像,i=1,若为彩色图像,i=3;Pij为第j个像素在第i个颜色通道上的颜色值。)

(2)二阶颜色矩
二阶颜色矩采用的是二阶中心距的平方根,即标准差。反映图像的颜色分布范围,值越大,颜色分布范围越广。

(上式中,Ei是所有像素第i个颜色通道的颜色均值)

(3)三阶颜色矩
三阶颜色矩采用三阶中心距的立方根,即偏差。反映图像颜色分布的对称性。

当Si=0时,图像的颜色分布是对称的;
当Si<0时,颜色分布左偏或负偏;
当Si>0时,颜色分布右偏或正偏;

1.2 matlab代码实现

一阶矩为均值,可调用mean2()函数;二阶矩为标准差,可调用std2()函数或根据公式编写代码;三阶矩为偏差,可根据公式编写代码。
现以lena彩色图为例进行代码及结果展示:

clear;
clc;
I=imread('lena.png');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
figure;
subplot(221);imshow(I);title('原图');
subplot(222);imshow(R);title('R');
subplot(223);imshow(G);title('G');
subplot(224);imshow(B);title('B');
R=double(R);
G=double(G);
B=double(B);
[m,n]=size(R);
%一阶矩(均值)
Rmean=mean2(R);
Gmean=mean2(G);
Bmean=mean2(B);
%二阶矩(标准差)
Rstd=std2(R);
Gstd=std2(G);
Bstd=std2(B);
%三阶矩(偏差)
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(R(i,j)-Rmean)^3;
    end
end
Rske=(sum/(m*n))^(1/3);
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(G(i,j)-Gmean)^3;
    end
end
Gske=(sum/(m*n))^(1/3);
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(B(i,j)-Bmean)^3;
    end
end
Bske=(sum/(m*n))^(1/3);

在求二阶矩标准差时也可以通过下面的公式法求

sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(R(i,j)-Rmean)^2;
    end
end
Rstd=(sum/(m*n))^(1/2);
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(G(i,j)-Gmean)^2;
    end
end
Gstd=(sum/(m*n))^(1/2);
sum=0.0;
for i=1:m
    for j=1:n
        sum=sum+(B(i,j)-Bmean)^2;
    end
end
Bstd=(sum/(m*n))^(1/2);

得到的结果如下:

2. 颜色直方图

颜色直方图描述的是图像不同颜色在整幅图中像中所占的比例,反映了图像颜色分布的统计特性,适用于描述图像中无法自动分割的图像和不需要考虑物体空间位置的图像。常用的颜色空间有RGB颜色空间和HSV颜色空间,下面以同一幅图展示两种颜色空间下的颜色直方图.

matlab代码实现

(1)RGB颜色空间

%RGB颜色空间
I=imread('onion.png');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
figure(1);
subplot(221);imshow(I);  
subplot(222);imshow(R);        
subplot(223);imshow(G);       
subplot(224);imshow(B);         
figure(2);
subplot(131);imhist(R)       
subplot(132);imhist(G)           
subplot(133);imhist(B)



(2)HSV颜色空间

%hsv颜色空间
I=imread('onion.png');
J=rgb2hsv(I);
h=J(:,:,1);
s=J(:,:,2);
v=J(:,:,3);
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(R);title('h直方图');        
subplot(132);imhist(G);title('s直方图');           
subplot(133);imhist(B);title('v直方图'); 


补充
在查阅颜色矩资料的时候,看到有书上和博客上说二阶矩是方差,并且用std(std())可以求图像的方差。这里我有所质疑,在此记录一下。
书上和博客上所给出的二阶矩的定义式都是标准差的定义式,所以应该是标准差为二阶矩,可以理解为书上和博客上写错了,开始我以为std(std())是一种求方差的方法,但是经过验证std(std())无法求出一幅图像(一个矩阵)的方差,下面我来证明:

clc;
clear;
X=[1 2 3
   5 5 5
   7 8 9];
%标准差
b=std2(X);
%方差
f1=var(X(:));
f2=b^2;

%错误方法
f3=std(X);
f4=std(f3);
f5=std(std(X));

设定了一个矩阵X,求得标准差为b,用两种方法求得的方差分别为f1和f2,f1与f2结果相同,用std(std())求得的结果为f5,与f1/f2不同。
std(std())相当于对矩阵的每一列求标准差,得到一行标准差向量,之后对标准差向量再求一次标准差,其结果并不是矩阵的方差。

以上就是对图像颜色特征描述的简单介绍,具体介绍了颜色矩和颜色直方图两种代码实现,并且记录了一个质疑点,希望可以帮助到同样和我在查阅资料时产生疑问的朋友。
如果觉得本篇文章有帮到您,希望可以点赞支持,本人还在学习当中,若有错误和问题,欢迎大家给我留言呀~

以上是关于图像特征分析:颜色特征描述,颜色矩,颜色直方图(附matlab代码)的主要内容,如果未能解决你的问题,请参考以下文章

图像特征分析:颜色特征描述,颜色矩,颜色直方图(附matlab代码)

图像特征分析:颜色特征描述,颜色矩,颜色直方图(附matlab代码)

Python图片颜色特征提取——HSV中心距法(附代码及注释)

颜色矩原理及Python实现

图像的特征提取有哪些算法

基于图像质量失真特征分析的人脸活体检测-02