当前位置: 代码迷 >> 综合 >> 【十二】特征提取
  详细解决方案

【十二】特征提取

热度:108   发布时间:2023-11-01 00:23:27.0

1 图像特征

特征提取就是从图像中提取有用的数据和信息

图像特征是某类事物区别于其他类的特性或这些特性的集合。

特征向量是特性的组合,如只有一个特性,就是一维特征向量。

待分类的对象也叫样本,其特征向量也就是样本向量。

2 基本统计特征

2.1 常用的简单区域描绘子如下:

周长

面积

致密性

区域的质心

灰度均值

灰度中值

包含区域的最小矩形

最小或最大灰度级

小于或大于均值的像素数

欧拉数(区域中的对象数减去这些对象的孔洞数)

Matlab实现
提取图像中每个区域的面积和质心为特征

I = imread('mouth.BMP');
I1 = im2bw(I);
I2 = bwlabel(I1);%标注连通域
D = regionprops(I2,'area','centroid');%提取面积和质心V1 = [D.Area];%将面积转存为向量
V2 = [D.Centroid];%将质心转存为向量
D.Area
D.Centroid
%fprintf("面积 = %f",D.Area);
%fprintf("质心为 = %f",D.Centroid);

2.2 直方图

用直方图描述图像纹理是一种常用的方法。
直方图的常用统计特征如下:
均值:纹理平均亮度的度量

标准方差:纹理平均对比度的度量

平滑度:纹理亮度的相对平滑度度量

三阶矩:直方图偏斜性的度量

一致性:当区域中所有灰相等时该度量最大并由此处开始减小

:随机数的度量

2.3 灰度共现矩阵

灰度共现矩阵是具有某种空间位置关系的两个像素的联合分布,可以看成是两个像素灰度对的联合直方图。
Matlab实现
grayMat.m函数

function grayMat = grayMat( I, nLevel, x1, y1, x2, y2 )
% 计算图像I的灰度共现矩阵
% I - 输入图像
% nLevel - 要统计的灰度级数目
% x1, y1, x2, y2 - 要统计的空间位置关系
%
% grayMat - 灰度共现矩阵,大小为nLevel*nLevelif nargin < 3x1 = 1;% 默认是+45度的位置关系y1 = -1;x2 = -1;y2 = 1;
end% 对 I 进行灰度级划分
minVal = min(I(:));
maxVal = max(I(:));
[m n] = size(I);if (maxVal - minVal + 1) >= nLevelspan = double(maxVal-minVal) / nLevel;ruler = double(minVal):span:double(maxVal);ind = find(I < ruler(2));
I2 = I; % I2为进行灰度级压缩后的图像,灰度级下标从1开始
I2(ind) = 1;
clear ind;for iLevel = 2:nLevel-1for ii = 1:mfor jj = 1:nif (  (I(ii, jj) >= ruler(iLevel)) && (I(ii, jj) < ruler(iLevel+1))  )I2(ii, jj) = iLevel;endendend
endind = find(I >= ruler(nLevel));
I2(ind) = nLevel;
clear ind;elseerror('hello');
endgrayMat = zeros(nLevel, nLevel);% 计算灰度共现矩阵
for ii = 1:mfor jj = 1:nii2 = ii+y1;jj2 = jj+x1;if( (ii2 >= 1) && (ii2<=m) &&(jj2>=1) &&(jj2<=n) )grayMat(I2(ii, jj), I2(ii2, jj2)) = grayMat(I2(ii, jj), I2(ii2, jj2)) + 1;endii2 = ii+y2;jj2 = jj+x2;if( (ii2 >= 1) && (ii2<=m) &&(jj2>=1) &&(jj2<=n) )grayMat(I2(ii, jj), I2(ii2, jj2)) = grayMat(I2(ii, jj), I2(ii2, jj2)) + 1;endend
end

主程序

I = imread('littleTexture.bmp');
gm = grayMat( I, 3, 1, 0, -1, 0)%计算水平位置关系的空间贡献值矩阵,灰度级为3

3 特征降维

特征维数并不是越多越好,当实际使用的特征数大于特定数时,分类器的性能就会退化,这就是维度灾难。
特征降维有两种方法可以达到降维的目的:特征选择和特征抽取。

特征选择是指选择全部特征的一个子集作为特征向量。

特征抽取是指通过已有特征的组合建立一个新的特征子集(如PCA)。

3.1 PCA

通过寻找最具有代表性的一些特征向量,达到降维目的
Matlab实现

X = [1,2;3,3;3,5;5,4;5,6;6,5;8,7;9,8];%样本矩阵,每行一个样本向量
[COEFF,SCORE,latent] = pca(X);%主成分分析
COEFF
SCORE
latent

运行时运算时间较长,故一般采用快速PCA

3.2 快速PAC

这里用一个跟散布矩阵相同的非零本征值的矩阵来计算本征向量,达到加速的效果
Matlab实现
fastPCA.m函数

function [pcaA V] = fastPCA( A, k )
% 快速PCA
%
% 输入:A --- 样本矩阵,每行为一个样本
%      k --- 降维至 k 维
%
% 输出:pcaA --- 降维后的 k 维样本特征向量组成的矩阵,每行一个样本,列数 k 为降维后的样本特征维数
%      V --- 主成分向量[r c] = size(A);% 样本均值
meanVec = mean(A);% 计算协方差矩阵的转置 covMatT
Z = (A-repmat(meanVec, r, 1));
covMatT = Z * Z';% 计算 covMatT 的前 k 个本征值和本征向量
[V D] = eigs(covMatT, k);% 得到协方差矩阵 (covMatT)' 的本征向量
V = Z' * V;% 本征向量归一化为单位本征向量
for i=1:kV(:,i)=V(:,i)/norm(V(:,i));
end% 线性变换(投影)降维至 k 维
pcaA = Z * V;% 保存变换矩阵 V 和变换原点 meanVec
save('Mat/PCA.mat', 'V', 'meanVec');

主程序

X = [1,2;3,3;3,5;5,4;5,6;6,5;8,7;9,8];%样本矩阵,每行一个样本向量
[pcaA V] = fastPCA(X,3);%快速PCA降至3维
pcaA
V

4 综合应用——基于PCA的人脸特征抽取

这部分代码函数太多,这里略过

5 局部二进制模式(LBP)

LBP在一个模板内,以中心像素对邻域进行阈值计算,然后进行二进制编码,对图像上的像素逐个扫描后,得到一个LBP响应图像,其直方图被称为LBP直方图,常作为LBP特征使用。LBP对线性光照鲁棒性强。
常用的LBP算子如下:

圆形邻域的LBP算子

统一化LBP算子

MB-LBP算子

除了LBP直方图外,还有分区LBP提取特征。