基于灰度共生矩阵进行木材纹理提取|MATLAB程序

2023-10-29 14:10

本文主要是介绍基于灰度共生矩阵进行木材纹理提取|MATLAB程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不同物体的散射特性不同,因此不同的物体表现在图像上将会有不同的亮度和不同的纹理。当图像的局部有较小的方差时,则灰度值占有支配地位,当图像的局部有较大的方差时,则纹理占有支配地位。纹理是和局部灰度及其空间组织相联系的,纹理在识别感兴趣的目标和地区中有着非常重要的作用。

灰度共生矩阵表示了灰度的空间依赖性,它表示了在一种纹理模式下的像素灰度的空间关系。它的弱点是没有完全抓住局部灰度的图形特点,因此对于较大的局部,此方法的效果不太理想。灰度共生矩阵为方阵,维数等于图像的灰度级。灰度共生矩阵中的元素(i,j)的值表示了在图像中其中一个像素的灰度值为i,另一个像素的灰度值为j,并且相邻距离为d,方向为A的这样两个像素出现的次数。在实际应用中A一般选择为0°、45°、90°、135°。一般来说灰度图像的灰度级为256,在计算由灰度共生矩阵推导出的纹理特征时,要求图像的灰度级远小于256,主要是因为矩阵维数较大而窗口的尺寸较小则灰度共生矩阵不能很好表示纹理,如要能够很好表示纹理则要求窗口尺寸较大,这样使计算量大大增加,而且当窗口尺寸较大时对于每类的边界区域误识率较大。所以在计算灰度共生矩阵之前需要对图像进行直方图规定化,以减小图像的灰度级,一般规定化后的图像的灰度级为8或16。由灰度共生矩阵能够导出许多纹理特征。

效果图

主函数

clc;close all;clear;
%%
name_photo='复叶槭(灰叶枫木)';
Image = imread(strcat(name_photo,'.png'));
T = Texture(Image);
X=[1,2,3,4];data_0=[T(1),T(2),T(3),T(4),T(5),T(6)];
data_45=[T(7),T(8),T(9),T(10),T(11),T(12)];
data_90=[T(13),T(14),T(15),T(16),T(17),T(18)];
data_135=[T(19),T(20),T(21),T(22),T(23),T(24)];
data=[data_0;data_45;data_90;data_135];%%
%作归一化图
figure('numbertitle','off','name',strcat(name_photo,'归一化特征参数'))
data_1=[data_0(1),data_45(1),data_90(1),data_135(1)];
data_2=[data_0(2),data_45(2),data_90(2),data_135(2)];
data_3=[data_0(3),data_45(3),data_90(3),data_135(3)];
data_4=[data_0(4),data_45(4),data_90(4),data_135(4)];
data_5=[data_0(5),data_45(5),data_90(5),data_135(5)];
data_6=[data_0(6),data_45(1),data_90(6),data_135(6)];
data_1=(data_1-min(data_1))./(max(data_1)-min(data_1));
data_2=(data_2-min(data_2))./(max(data_2)-min(data_2));
data_3=(data_3-min(data_3))./(max(data_3)-min(data_3));
data_4=(data_4-min(data_4))./(max(data_4)-min(data_4));
data_5=(data_5-min(data_5))./(max(data_5)-min(data_5));
data_6=(data_6-min(data_6))./(max(data_6)-min(data_6));
subplot(2,3,1);plot(X,data_1,'r');title('粗糙度');set(gca,'xticklabel',{'0°','45°','90°','135°'});
subplot(2,3,2);plot(X,data_2,'g');title('惯性矩');set(gca,'xticklabel',{'0°','45°','90°','135°'});
subplot(2,3,3);plot(X,data_3,'b');title('纹理熵');set(gca,'xticklabel',{'0°','45°','90°','135°'});
subplot(2,3,4);plot(X,data_4,'c');title('相关度');set(gca,'xticklabel',{'0°','45°','90°','135°'});
subplot(2,3,5);plot(X,data_5,'m');title('方差 ');set(gca,'xticklabel',{'0°','45°','90°','135°'});
subplot(2,3,6);plot(X,data_6,'k');title('逆差据');set(gca,'xticklabel',{'0°','45°','90°','135°'});
%% 生成表格行列名称,m行n列
% m=4;n=6;
column_name=['粗糙度';'惯性矩';'纹理熵';'相关度';'方差 ';'逆差据'];
row_name=['  0°';' 45°';' 90°';'135°'];
%% 表格作图
set(figure('numbertitle','off','name',name_photo),'position',[25 25 450 450]);
uitable(gcf,'Data',data,'Position',[10 25 600 400],'Columnname',column_name,'Rowname',row_name);

子函数(共生矩阵纹理提取)

%**************************************************************************
%图像检索——纹理特征
%基于共生矩阵纹理特征提取,d=1,θ=0°,45°,90°,135°共四个矩阵
%所用图像灰度级均为256
%参考《基于颜色空间和纹理特征的图像检索》
%function : T=Texture(Image) 
%Image    : 输入图像数据
%T        : 返回八维纹理特征行向量
%**************************************************************************function T = Texture(Image)
% Image = imread('1.png');
[M,N,~] = size(Image);
% M = 256; 
% N = 256;%--------------------------------------------------------------------------
%1.将各颜色分量转化为灰度
%--------------------------------------------------------------------------
%Gray = double(0.3*Image(:,:,1)+0.59*Image(:,:,2)+0.11*Image(:,:,3));
Gray=Image;%--------------------------------------------------------------------------
%2.为了减少计算量,对原始图像灰度级压缩,将Gray量化成16级
%--------------------------------------------------------------------------
for i = 1:Mfor j = 1:Nfor n = 1:256/16if (n-1)*16<=Gray(i,j)&&Gray(i,j)<=(n-1)*16+15Gray(i,j) = n-1;endendend
end%--------------------------------------------------------------------------
%3.计算四个共生矩阵P,取距离为1,角度分别为0,45,90,135
%--------------------------------------------------------------------------
P = zeros(16,16,4);
for m = 1:16for n = 1:16for i = 1:Mfor j = 1:Nif j<N&&Gray(i,j)==m-1&&Gray(i,j+1)==n-1P(m,n,1) = P(m,n,1)+1;P(n,m,1) = P(m,n,1);endif i>1&&j<N&&Gray(i,j)==m-1&&Gray(i-1,j+1)==n-1P(m,n,2) = P(m,n,2)+1;P(n,m,2) = P(m,n,2);endif i<M&&Gray(i,j)==m-1&&Gray(i+1,j)==n-1P(m,n,3) = P(m,n,3)+1;P(n,m,3) = P(m,n,3);endif i<M&&j<N&&Gray(i,j)==m-1&&Gray(i+1,j+1)==n-1P(m,n,4) = P(m,n,4)+1;P(n,m,4) = P(m,n,4);endendendif m==nP(m,n,:) = P(m,n,:)*2;endend
end%%---------------------------------------------------------
% 对共生矩阵归一化
%%---------------------------------------------------------
for n = 1:4P(:,:,n) = P(:,:,n)/sum(sum(P(:,:,n)));
end%--------------------------------------------------------------------------
%4.对共生矩阵计算粗糙度A1, 惯性矩A2,纹理熵A3,相关度A4,方差A5,逆差矩阵A6
%--------------------------------------------------------------------------
A3 = zeros(1,4);Ux = A3;      Uy = A3;
deltaX= A3;  deltaY = A3;
A4 =A3;A1=A3;u=A3;
A5 =A3;A6 =A3;A2 =A3;
for n = 1:4u(n)=sum(sum(P(:,:,n)))/16*16;for i = 1:16for j = 1:16if P(i,j,n)~=0A3(n) = -P(i,j,n)*log(P(i,j,n))+A3(n); %%熵endA1(n) = P(i,j,n)^2+A1(n); %粗糙度A2(n) = (i-j)^2*P(i,j,n)+A2(n);  %%惯性矩A5(n) = P(i,j,n)*(i-u(n))^2+A5(n); %方差A6(n) = P(i,j,n)/(1+(i-j)^2)+A6(n); %逆差矩Ux(n) = i*P(i,j,n)+Ux(n); %相关性中μxUy(n) = j*P(i,j,n)+Uy(n); %相关性中μyendend
endfor n = 1:4for i = 1:16for j = 1:16deltaX(n) = (i-Ux(n))^2*P(i,j,n)+deltaX(n); %相关性中σxdeltaY(n) = (j-Uy(n))^2*P(i,j,n)+deltaY(n); %相关性中σyA4(n) = i*j*P(i,j,n)+A4(n);             endendA4(n) = (A4(n)-Ux(n)*Uy(n))/deltaX(n)/deltaY(n); %相关度   
end%--------------------------------------------------------------------------
%最终特征向量T=[0°*6 ,45°*6,90°*6,135°*6]
%--------------------------------------------------------------------------
T(1) = A1(1);T(2) = A2(1);T(3) = A3(1);T(4) = A4(1);T(5) = A5(1);T(6) = A6(1);
T(7) = A1(2);T(8) = A2(2);T(9) = A3(2);T(10) = A4(2);T(11) = A5(2);T(12) = A6(2);
T(13) = A1(3);T(14) = A2(3);T(15) = A3(3);T(16) = A4(3);T(17) = A5(3);T(18) = A6(3);
T(19) = A1(4);T(20) = A2(4);T(21) = A3(4);T(22) = A4(4);T(23) = A5(4);T(24) = A6(4);

注意:灰度共生矩阵代码仅供学习参考

相关木材图片资源:木材纹理图片,可以用于纹理特征提取-图像处理文档类资源-CSDN下载

这篇关于基于灰度共生矩阵进行木材纹理提取|MATLAB程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301186

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

企业如何进行员工的网络安全意识培训?

企业网络安全意识培训的重要性         企业网络安全意识培训是提升员工网络安全素质的关键环节。随着网络技术的快速发展,企业面临的网络安全威胁日益增多,员工的网络安全意识和技能水平直接关系到企业的信息安全和业务连续性。因此,企业需要通过系统的网络安全意识培训,提高员工对网络安全的认识和防范能力,从而降低企业在面对潜在安全风险时的损失和影响。 企业网络安全意识培训的方法         企

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

使用JWT进行安全通信

在现代Web应用中,安全通信是至关重要的。JSON Web Token(JWT)是一种流行的安全通信方式,它允许用户和服务器之间安全地传输信息。JWT是一种紧凑的、URL安全的表示方法,用于在两方之间传输信息。本文将详细介绍JWT的工作原理,并提供代码示例帮助新人理解和实现JWT。 什么是JWT? JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSO