您好,欢迎来到微智科技网。
搜索
您的当前位置:首页基于MATLAB的图像特征提取之LBP图像分类(毕业设计其一)

基于MATLAB的图像特征提取之LBP图像分类(毕业设计其一)

来源:微智科技网
基于MATLAB的图像特征提取之LBP图像分类(毕业设计其

⼀)

临近毕业,毕业设计选题是关于图像处理⽅⾯的问题。所以去了解了很多关于图像处理的知识,在这⾥先实现Matlab的LBP特征提取和分类(暂时拿到的数据集有点不够只有270多张,后续改进)⼀、关于LBP(Local Binary Patterns)局部⼆值模式⽹上看了很多介绍,个⼈理解就是说,LBP是对图像纹理进⾏描述的⼀个算⼦,是从图像中提取出来的特征,对于⼈来说区分物体也是看特征,就像“黄⽪肤”“⽩⽪肤”对应了不同的地区的⼈⼀样,对于计算机来说,图⽚是由⼆进制数组成,⽽LBP特征就是从这些⼆进制数⾥⾯提取的这个图⽚的特征,⽤来表征这张图⽚。1.原始LBP

最开始的时候,对⼀个3*3(9个像素点)区域,LBP值是指中⼼像素点与周围8个像素点的灰度值进⾏⽐较,⼤于等于中⼼像素点灰度值的标记为1,否则为0。

209080

305070

405060

对于上表,进⾏LBP特征提取之后就是下表

011

0501

011

从左上⾓旋转获得该中⼼像素点的LBP值为:(00011111),也就是31这就是原始的LBP特征。2.旋转不变LBP

从原始LBP我们可以看出,原始LBP得到的⼆进制不是⼀成不变的,如果我们将这取得的3*3区域稍微旋转⼀下,相应的原始LBP值也就会随之改变,并且在这个3*3的固定正⽅形邻域提取LBP并不能满⾜不同的图像的纹理要求,所以对原始LBP特征进⾏改进优化。

Ojala等对 LBP 算⼦进⾏了改进,将 3×3邻域扩展到任意邻域,并⽤圆形邻域代替了正⽅形邻域,改进后的 LBP 算⼦允许在半径为 R 的圆形邻域内有任意多个像素点。从⽽得到了诸如半径为R的圆形区域内含有P个采样点的LBP算⼦,称为Extended LBP,也叫CircularLBP。

拿上⾯说的正⽅形区域解释,这⾥为了⽅便起见,还是取8个周围像素点,在这个圆形邻域内,取出来的LBP值和这个正⽅形所取得的LBP⼆进制是⼀样的。为了区别⼀个像素点的LBP值,我们将这个圆形区域旋转,也就是获得8个不同的⼆进制模式,定义其中最⼩值为这个像素点的旋转不便LBP特征,也就是对上⾯取得的(00011111)进⾏循环右移或左移,得到8个⼆进制串,取最⼩值。3.等价模式LBP(uniform LBP)

所谓Uniform LBP,指在LBP⼆进制数中,0到1和1到0的跳变总数不超过两次。如00000000和11111111,并没有0,1跳变,U=0。对于11110000和00001111,则有⼀次跳变,U=1。对于Uniform LBP来说,具备旋转不变性的pattern只有9个。因此,最终结果为统计Uniform LBP pattern的直⽅图,把所谓的nonUniform放⼊直⽅图的另⼀个bin中,得到最终的特征向量。

Uniform LBP在局部纹理描述上取得了较好的描述效果,原因在于,Uniform LBP 的各种模式占据了图像中所有模式的绝⼤部分。不同采样半径和周围像素点个数会不同,但Uniform LBP占据了所有模式的50%~95%。我的Matlab代码主要实现了原始LBP和旋转不变LBP的特征提取。⼆、Matlab代码实现以及思考过程

我的图像集全部都是1024*1024的电镜图像。思考过程:

1)由于1024*1024实在太⼤,我决定将图⽚缩放成256*256的图⽚,会有⼀定的精度丢失,但是问题不⼤。

2)将256*256的像素点(其实是⼀个矩阵,后⾯⽤矩阵代替,化为数学问题)分块⼉,也就是cell,我将它分为16*16个cell,也就是⼀张图⽚总共等分为了256个区域,每个区域也是16*16的矩阵,包含16*16个像素点的灰度值。

3)单独取出⼀个cell,对这个16*16的矩阵进⾏lbp的特征提取,我们⽤统计直⽅图来表⽰lbp特征,对于单个像素点,我们获取的8位⼆进制最多表⽰0-255总共256个数,所以我们通过统计0-255每个数出现的频率来表⽰该图像的lbp特征,256个cell就有256个直⽅图,最后将直⽅图拼接起来。256个256(0-255),也就是该图像的特征向量。4)遍历图像集,对每张图⽚求取LBP特征。

5)因为每张图⽚都有1x65536的特征向量,实在太⼤,影响运⾏速度,⽽我的图像集只有270多张图像,我们采⽤pca主成分分析法,将270多张图⽚的特征向量进⾏处理,通过空间映射(矩阵转换),将维度降低(这⾥有点问题,Matlab⾥的pca函数在空间投影过程中改变了我输⼊的训练图像特征向量的顺序,所以标签和图像特征对应紊乱,暂未解决,暂时不⽤pca降维,学习透彻之后单独开⼀章写PCA主成分分析法)

6)⽤fitcecoc分类器进⾏训练获得训练后的模型进⾏分类。代码如下:

getImageLbpFeature.m

该函数输⼊是图像的地址,返回的是图像的两个lbp特征,维度是1x65536

function [histogram1,histogram2] = getImageLbpFeature(imagedir)

%该函数返回输⼊图⽚的lbp统计直⽅图,histogram1是原始lbp特征,histogram2是旋转不变lbp特征image=imread(imagedir);%通过图像地址读⼊图像,这⾥我的图像结果是1024x1024x3的数组image=imresize(image,[256,256]);%缩放成256*256

[m,n,h]=size(image);%获取⼤⼩,256*256*3,h=3代表RGB图像if h==3

image=rgb2gray(image);%如果是RGB图像,则转化为灰度图像end

%将image的像素数组划分16x16的cells

cells=mat2cell(image,[16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16], ... [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]);%循环处理每个cell,提取lbp直⽅图,开辟个矩阵暂时存放

lbpcyc=zeros(m/-2,n/-2,m/16*n/16);%lbpcyc表⽰循环不变lbp,lbptemp存的是原始lbplbptemp=zeros(m/-2,n/-2,m/16*n/16);%x的cell,因为不含边缘所以是m/-2for i=1:m/16 for j=1:n/16

temp=cells{i,j};%按⾏循环取cell

[row,column]=size(temp);%获取每个cell的⼤⼩,16x16 %循环处理cell,获取该cell的两种lbp值 for k=2:row-1 for t=2:column-1

bintemp=zeros(1,8);%⼆进制数组,存该像素点原始lbp cyctemp=zeros(1,8);%⼆进制数组,存该像素点循环不变lbp if(temp(k-1,t-1)>=temp(k,t)) bintemp(8)=1; end

if(temp(k-1,t)>=temp(k,t)) bintemp(7)=1; end

if(temp(k-1,t+1)>=temp(k,t)) bintemp(6)=1; end

if(temp(k,t+1)>=temp(k,t)) bintemp(5)=1; end

if(temp(k+1,t+1)>=temp(k,t))

if(temp(k+1,t+1)>=temp(k,t)) bintemp(4)=1; end

if(temp(k+1,t)>=temp(k,t)) bintemp(3)=1; end

if(temp(k+1,t-1)>=temp(k,t)) bintemp(2)=1; end

if(temp(k,t-1)>=temp(k,t)) bintemp(1)=1; end

%计算该像素点的原始lbp值 %计算该像素点的旋转不变lbp值

bin=dec2base(lbptemp(k-1,t-1,j+16*(i-1)),2,8);%将像素点变为2进制数 for q=1:8

cyctemp(q)=bin2dec(circshift(bin,q));

lbpcyc(k-1,t-1,j+16*(i-1))=min(cyctemp);%循环不变lbp值,这⾥是对原始lbp做了循环移的操作,之后取最⼩值 end end end endend

%统计x(16x16)cell直⽅图histogram1=zeros(16*16,256);histogram2=zeros(16*16,256);for i=1:256%外循环表⽰16x16个cell for j=1:256%内循环表⽰0-255出现的次数 histogram1(i,j)=sum(sum(lbptemp(:,:,i)==j-1)); histogram2(i,j)=sum(sum(lbpcyc(:,:,i)==j-1)); endend

histogram1=histogram1';%reshape是按列重构,需要先转置

histogram1=reshape(histogram1,[1,256*256]);%重构这个256x256的数组,让它变成1x(256x256)的数组;表⽰了这张图⽚的原始lbp特征⾏向量。histogram2=histogram2';

histogram2=reshape(histogram2,[1,256*256]);

lbptemp(k-1,t-1,j+16*(i-1))=bintemp(1)+bintemp(2)*2+bintemp(3)*4+bintemp(4)*8+bintemp(5)*16+bintemp(6)*32+bintemp(7)*+bintemp(8)*128;%这是⼀

getAllImageslbp.m

输⼊是你的图像集的主⽂件夹类似于 /images,返回的tag包含了这个⽂件夹下所有图⽚所属的标签,以及features1(原始LBP)和features2(旋转不变LBP),以及经过PCA降维之后获得的降维矩阵coeff,降维后的特征矩阵score和贡献程度latent。(PAC稍微有点问题,还未修改)

function [tag]=getAllImagesLbp(maindir)subdir=dir(maindir);features1=[];features2=[];labels={};

for i = 1:length(subdir) %判断是否为⽂件夹

if(isequal(subdir(i).name,'.')||... isequal(subdir(i).name,'..')||... ~subdir(i).isdir) continue; end

subdirpath=fullfile(maindir,subdir(i).name); images=dir(subdirpath); for j = 1:length(images)

if(isequal(images(j).name,'.')|| ... isequal(images(j).name,'..')|| ...

isequal(images(j).name,'.DS_Store'))%这⾥的.DS_Store是苹果⾃带的隐藏⽂件 continue; end

imagepath=fullfile(maindir,subdir(i).name,images(j).name); [lbp,lbpcyc]=getImageLbpFeature(imagepath); features1=[features1;lbp]; features2=[features2;lbpcyc]; labels=[labels;subdir(i).name]; end

%进⾏PCA降维处理end

tag.labels=labels;tag.features1=features1;tag.features2=features2;tag=PCA(tag);save Lbp_tag.mat tag

PAC.m

function [tag]=PCA(tag)

%contribution=cumsum(latent)./sum(latent);%累计贡献率%t=find(contribution>0.95)%K=t(1)

%Feature=score(:,1:k);取前K列

[coeff1,score1,latent1] = pca(tag.features1,'Economy',true); [coeff2,score2,latent2] = pca(tag.features2,'Economy',true); tag.coeff1=coeff1;tag.coeff2=coeff2;tag.score1=score1;tag.score2=score2;tag.latent1=latent1;tag.latent2=latent2;

SVM.m

load Lbp_tag.mat;

X = tag.features1;%这⾥没⽤score,因为PCA打乱了我特征向量的顺序,导致和标签对应不起来,所以还是⽤的原图像特征,并未降维Y = tag.labels;

% 使⽤默认选项训练多类ECOC模型。

% Mdl是ECOC多分类模型,默认情况下,fitcecoc使⽤SVM⼆进制学习器和⼀对⼀编码设计,可以使⽤点表⽰法访问Mdl属性。Mdl = fitcecoc(X,Y);

%imagedir=' 你的测试图像地址';

%[feature1,feature2]=getImageLbpFeature(imagedir);%[test_feature1,test_feature2]=Pretreatment();%label=predict(Mdl,feature1) CVMdl = crossval(Mdl);

oosLoss = kfoldLoss(CVMdl);%交叉验证。

即将毕业的菜鸟记录⼀下⽣活,从毕设开始!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务