tamura纹理特征 JAVA_Tamura纹理特征的matlab实现

2023-10-23 19:51

本文主要是介绍tamura纹理特征 JAVA_Tamura纹理特征的matlab实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事实上这篇文章并非原创,代码都是别人写的,可是在我的机子上有些地方不能run,我做了一丁点的修改,所以就把文章设置为原创了。另外,最初的参照博客已经看不到了,我看到的已经是别人转的,所以我有必要贴一下别人的链接以示尊重。

第一个链接: http://blog.sina.com.cn/s/blog_59ead5d90100gx1d.html 该文章已被加密,打不开了

0818b9ca8b590ca3270a3433284dd417.png幸亏有别人已经转载博主的文章,我的这篇文章就是从第二篇文章那里复制加修改得到的,代码整理放在CSDN博客上看起来更加美观,且亲测可直接运行。

下面分模块贴代码,代码是我在第二个链接的基础上稍作修改得到的,亲测可直接运行,没有任何问题。

第一个指标 Coarseness,粗糙度

%调用举例:

%image=rgb2gray(imread('example.jpg'));

%f=coarseness(image,5)

function Fcrs = coarseness( graypic,kmax )%graphic为待处理的灰度图像,2^kmax为最大窗口

[h,w]=size(graypic); %获取图片大小

A=zeros(h,w,2^kmax); %平均灰度值矩阵A

%计算有效可计算范围内每个点的2^k邻域内的平均灰度值

for i=2^(kmax-1)+1:h-2^(kmax-1)

for j=2^(kmax-1)+1:w-2^(kmax-1)

for k=1:kmax

A(i,j,k)=mean2(graypic(i-2^(k-1):i+2^(k-1)-1,j-2^(k-1):j+2^(k-1)-1));

end

end

end

%对每个像素点计算在水平和垂直方向上不重叠窗口之间的Ak差

for i=1+2^(kmax-1):h-2^(kmax-1)

for j=1+2^(kmax-1):w-2^(kmax-1)

for k=1:kmax

Eh(i,j,k)=abs(A(i+2^(k-1),j,k)-A(i-2^(k-1),j));

Ev(i,j,k)=abs(A(i,j+2^(k-1),k)-A(i,j-2^(k-1)));

end

end

end

%对每个像素点计算使E达到最大值的k

for i=2^(kmax-1)+1:h-2^(kmax-1)

for j=2^(kmax-1)+1:w-2^(kmax-1)

[maxEh,p]=max(Eh(i,j,:));

[maxEv,q]=max(Ev(i,j,:));

if maxEh>maxEv

maxkk=p;

else

maxkk=q;

end

Sbest(i,j)=2^maxkk; %每个像素点的最优窗口大小为2^maxkk

end

end

%所有Sbest的均值作为整幅图片的粗糙度

Fcrs=mean2(Sbest);

end第二个指标 Contrast,对比度

%调用举例:

%注意这个函数因为涉及到方差,要求输入类型为double,因此我这里在源代码上做了适当的修改

%image=rgb2gray(imread('example.jpg'));

%f=contrast(image)

function Fcon=contrast(graypic) %graypic为待处理的灰度图片

graypic=double(graypic);%这一句我自己做了修改,否则原博文中的代码不能直接运行

x=graypic(:); %二维向量一维化

M4=mean((x-mean(x)).^4); %四阶矩

delta2=var(x,1); %方差

alfa4=M4/(delta2^2); %峰度

delta=std(x,1); %标准差

Fcon=delta/(alfa4^(1/4)); %对比度

end第三个指标 Directionality,方向度

%调用举例:

%image=rgb2gray(imread('example.jpg'));

%[Fdir,sita]=directionality(image)

%sita为各像素点的角度矩阵,在线性度中会用到,所以这里作为结果返回

function [Fdir,sita]=directionality(graypic)

[h w]=size(graypic);

%两个方向的卷积矩阵

GradientH=[-1 0 1;-1 0 1;-1 0 1];

GradientV=[ 1 1 1;0 0 0;-1 -1 -1];

%卷积,取有效结果矩阵

MHconv=conv2(graypic,GradientH);

MH=MHconv(3:h,3:w);

MVconv=conv2(graypic,GradientV);

MV=MVconv(3:h,3:w)

%向量模

MG=(abs(MH)+abs(MV))./2;

%有效矩阵大小

validH=h-2;

validW=w-2

%各像素点的方向

for i=1:validH

for j=1:validW

sita(i,j)=atan(MV(i,j)/MH(i,j))+(pi/2);

end

end

n=16;

t=12;

Nsita=zeros(1,n);

%构造方向的统计直方图

for i=1:validH

for j=1:validW

for k=1:n

if sita(i,j)>=(2*(k-1)*pi/2/n) && sita(i,j)=t

Nsita(k)=Nsita(k)+1;

end

end

end

end

for k=1:n

HD(k)=Nsita(k)/sum(Nsita(:));

end

%假设每幅图片只有一个方向峰值,为计算方便简化了原著

[maxvalue,FIp]=max(HD);

Fdir=0;

for k=1:n

Fdir=Fdir+(k-FIp)^2*HD(k);%公式与原著有改动

end

end第四个指标 Linelikeness,线性度

%调用举例:

%image=rgb2gray(imread('example.jpg'));

%Flin=linelikeness(image,sita,4) %sita为directionality.m返回的结果

function Flin=linelikeness(graypic,sita,d) %d为共生矩阵计算时的像素间隔距离

n=16;

[h,w]=size(graypic);

%构造方向共生矩阵

PDd1=zeros(n,n);

PDd2=zeros(n,n);

PDd3=zeros(n,n);

PDd4=zeros(n,n);

PDd5=zeros(n,n);

PDd6=zeros(n,n);

PDd7=zeros(n,n);

PDd8=zeros(n,n);

for i=d+1:h-d-2

for j=d+1:w-d-2

for m1=1:n

for m2=1:n

%下方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i+d,j)

PDd1(m1,m2)=PDd1(m1,m2)+1;

end

%上方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i-d,j)

PDd2(m1,m2)=PDd2(m1,m2)+1;

end

%右方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i,j+d)

PDd3(m1,m2)=PDd3(m1,m2)+1;

end

%左方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i,j-d)

PDd4(m1,m2)=PDd4(m1,m2)+1;

end

%右下方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i+d,j+d)

PDd5(m1,m2)=PDd5(m1,m2)+1;

end

%右上方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i-d,j+d)

PDd6(m1,m2)=PDd6(m1,m2)+1;

end

%左下方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i+d,j-d)

PDd7(m1,m2)=PDd7(m1,m2)+1;

end

%左上方向

if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i-d,j-d)

PDd8(m1,m2)=PDd8(m1,m2)+1;

end

end

end

end

end

f=zeros(1,8);

g=zeros(1,8);

for i=1:n

for j=1:n

f(1)=f(1)+PDd1(i,j)*cos((i-j)*2*pi/n);

g(1)=g(1)+PDd1(i,j);

f(2)=f(2)+PDd2(i,j)*cos((i-j)*2*pi/n);

g(2)=g(2)+PDd2(i,j);

f(3)=f(3)+PDd3(i,j)*cos((i-j)*2*pi/n);

g(3)=g(3)+PDd3(i,j);

f(4)=f(4)+PDd4(i,j)*cos((i-j)*2*pi/n);

g(4)=g(4)+PDd4(i,j);

f(5)=f(5)+PDd5(i,j)*cos((i-j)*2*pi/n);

g(5)=g(5)+PDd5(i,j);

f(6)=f(6)+PDd6(i,j)*cos((i-j)*2*pi/n);

g(6)=g(6)+PDd6(i,j);

f(7)=f(7)+PDd7(i,j)*cos((i-j)*2*pi/n);

g(7)=g(7)+PDd7(i,j);

f(8)=f(8)+PDd8(i,j)*cos((i-j)*2*pi/n);

g(8)=g(4)+PDd8(i,j);

end

end

tempM=f./g;

Flin=max(tempM);%取8个方向的线性度最大值作为图片的线性度

end

第五个指标 Regularity,规则度

%调用举例:

%image=rgb2gray(imread('example.jpg'));

%Freg=regularity(image,64)

function Freg=regularity(graypic,windowsize) %windowsize为计算规则度的子窗口大小

[h,w]=size(graypic);

k=0;

for i=1:windowsize:h-windowsize

for j=1:windowsize:w-windowsize

k=k+1;

crs(k)=coarseness(graypic(i:i+windowsize-1,j:j+windowsize-1),5); %粗糙度

con(k)=contrast(graypic(i:i+windowsize-1,j:j+windowsize-1)); %对比度

[dire(k),sita]=directionality(graypic(i:i+windowsize-1,j:j+windowsize-1));%方向度

lin=linelikeness(graypic(i:i+windowsize-1,j:j+windowsize-1),sita,4)*10; %线性度,*10与crs、con、dire同量级化

end

end

%求上述各参数的标准差

Dcrs=std(crs,1);

Dcon=std(con,1);

Ddir=std(dire,1);

Dlin=std(lin,1);

%规则度Freg=1-(Dcrs+Dcon+Ddir+Dlin)/4/100;end

第六个指标 Roughness,粗略度

%粗略度

Frgh=Fcrs+Fcon;

这篇文章我读的很费劲,感觉很多地方其实并没有多么明白,只是希望拿这几个指标作为图像纹理“好坏”的衡标准,为调参过程提供依据,仅此而已。

有问题可发邮件至 jzwang@bjtu.edu.cn 讨论交流。注:代码非我所写,我只做丁点修改使之可在我的机器上顺利运行。向原作致谢,如有侵权马上删掉!

这篇关于tamura纹理特征 JAVA_Tamura纹理特征的matlab实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.