基于灰度共生矩阵进行木材纹理提取|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

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName