您的位置:首页 > 其它

基于图像的室内装修风格分类系统(三)---提取纹理特征

2016-08-08 11:23 459 查看
(一)先记下一些当时看的利用灰度共生矩阵提取纹理特征的文章

http://wlb321xy.blog.163.com/blog/static/6767777201210293455085/
//一个简单的灰度共生矩阵计算实例,非常容易理解
 http://blog.csdn.net/xw20084898/article/details/20528997 //灰度共生矩阵(GLCM)理解
 http://www.ilovematlab.cn/thread-267321-1-1.html //matlaB中用灰度共生矩阵提取纹理特征的程序讲解,有代码


(二)附上提取纹理特征的代码:veinFeature.m

%%
clc;
clear
%提取了所有训练集图片的纹理特征,vein:70*8 将能量、熵、惯性矩、相关的均值和标准差作为最终8维纹理特征
%后面也是另外将vein变量存储在veinData.mat文件里面,利用save函数
% 循环读入图像
A=dir('F:\文件\dataset\家装图片集\所有图片\*.jpg');  %批量读取文件
vein=zeros(70,8);
for k=1:size(A)
B=strcat('F:/文件/dataset/家装图片集/所有图片/',A(k).name);
Image=imread(B);
%end
rs=size(Image);
M=rs(1);N=rs(2);
Gray = double(0.3*Image(:,:,1)+0.59*Image(:,:,2)+0.11*Image(:,:,3));

%--------------------------------------------------------------------------
%2.为了减少计算量,对原始图像灰度级压缩,将Gray量化成16级
%--------------------------------------------------------------------------
for i = 1:M
for j = 1:N
for n = 1:256/16
if (n-1)*16<=Gray(i,j)&Gray(i,j)<=(n-1)*16+15
Gray(i,j) = n-1;
end
end
end
end

%--------------------------------------------------------------------------
%3.计算四个共生矩阵P,取距离为1,角度分别为0,45,90,135
%--------------------------------------------------------------------------
P = zeros(16,16,4);
for m = 1:16
for n = 1:16
for i = 1:M
for j = 1:N
if j<N&Gray(i,j)==m-1&Gray(i,j+1)==n-1
P(m,n,1) = P(m,n,1)+1;
P(n,m,1) = P(m,n,1);
end
if i>1&j<N&Gray(i,j)==m-1&Gray(i-1,j+1)==n-1
P(m,n,2) = P(m,n,2)+1;
P(n,m,2) = P(m,n,2);
end
if i<M&Gray(i,j)==m-1&Gray(i+1,j)==n-1
P(m,n,3) = P(m,n,3)+1;
P(n,m,3) = P(m,n,3);
end
if i<M&j<N&Gray(i,j)==m-1&Gray(i+1,j+1)==n-1
P(m,n,4) = P(m,n,4)+1;
P(n,m,4) = P(m,n,4);
end
end
end
if m==n
P(m,n,:) = P(m,n,:)*2;
end
end
end

%%---------------------------------------------------------
% 对共生矩阵归一化
%%---------------------------------------------------------
for n = 1:4
P(:,:,n) = P(:,:,n)/sum(sum(P(:,:,n)));
end

%--------------------------------------------------------------------------
%4.对共生矩阵计算能量、熵、惯性矩、相关4个纹理参数
%--------------------------------------------------------------------------
H = zeros(1,4);
I = H;
Ux = H;      Uy = H;
deltaX= H;  deltaY = H;
C =H;
for n = 1:4
E(n) = sum(sum(P(:,:,n).^2)); %%能量
for i = 1:16
for j = 1:16
if P(i,j,n)~=0
H(n) = -P(i,j,n)*log(P(i,j,n))+H(n); %%熵
end
I(n) = (i-j)^2*P(i,j,n)+I(n);  %%惯性矩

Ux(n) = i*P(i,j,n)+Ux(n); %相关性中μx
Uy(n) = j*P(i,j,n)+Uy(n); %相关性中μy
end
end
end
for n = 1:4
for i = 1:16
for j = 1:16
deltaX(n) = (i-Ux(n))^2*P(i,j,n)+deltaX(n); %相关性中σx
deltaY(n) = (j-Uy(n))^2*P(i,j,n)+deltaY(n); %相关性中σy
C(n) = i*j*P(i,j,n)+C(n);
end
end
C(n) = (C(n)-Ux(n)*Uy(n))/deltaX(n)/deltaY(n); %相关性
end
%--------------------------------------------------------------------------
%求能量、熵、惯性矩、相关的均值和标准差作为最终8维纹理特征
%--------------------------------------------------------------------------
a1 = mean(E)
b1 = sqrt(cov(E))

a2 = mean(H)
b2 = sqrt(cov(H))

a3 = mean(I)
b3 = sqrt(cov(I))

a4 = mean(C)
b4 = sqrt(cov(C))

%sprintf('0,45,90,135方向上的能量依次为: %f, %f, %f, %f',E(1),E(2),E(3),E(4))  % 输出数据;
%sprintf('0,45,90,135方向上的熵依次为: %f, %f, %f, %f',H(1),H(2),H(3),H(4))  % 输出数据;
%sprintf('0,45,90,135方向上的惯性矩依次为: %f, %f, %f, %f',I(1),I(2),I(3),I(4))  % 输出数据;
%sprintf('0,45,90,135方向上的相关性依次为: %f, %f, %f, %f',C(1),C(2),C(3),C(4))  % 输出数据;
vein(k,1)=a1;
vein(k,2)=b1;
vein(k,3)=a2;
vein(k,4)=b2;
vein(k,5)=a3;
vein(k,6)=b3;
vein(k,7)=a4;
vein(k,8)=b4;
end
%xlswrite('D:\writeExcel2.xls',vein,'data');%数据存储至D盘根目录下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: