博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab练习程序(共生矩阵)
阅读量:6238 次
发布时间:2019-06-22

本文共 2401 字,大约阅读时间需要 8 分钟。

纹理描述的共生矩阵方法是基于在纹理中某一灰度级结构重复出现的情况;这个结构在精细纹理中随着距离而快速的变化,而在粗糙纹理中则缓慢的变化。

假设待分析在精细纹理图像的一部分是一个M*N的矩形窗口。某一灰度级结构的出现情况可以由相对的频率的矩阵来描述,他描绘了具有灰度级a,b的两个像素,在方向Φ上间隔距离为d,以多大的频率出现在窗口中。

共生矩阵求取方法:

这里有两种定义,书上的是第一种,也就是对称矩阵的定义,如下:

 

 

  

 

我程序用的是非对称的矩阵的定义,如下:

 

 

 

 

哦,我想这一大堆公式是不那么容易看明白的,不过下面这个图就让人一目了然了。下图中的Φ=0,d=1.

共生矩阵产生完之后就需要使用其派生出的准则了。

主要有如下六种:

1.能量,或角度二阶矩(图像均匀性的测度——图像越均匀,其值越大):

2.熵:

3.最大概率:

4.对比度(局部图像变化的测度;典型k=2,λ=1):

5.倒数差分矩:

6.相关性(图像线性度的测度,在方向Φ上的线性方向的结构在这个方向上会产生大的相关值):

其中μx,μ是均值,以及σx,σy是标准差,

通用算法如下:

1.给定方向和距离构造共生矩阵。

2.用方向、距离以及六个特征值构成纹理特征向量,这就产生了相关的特征了。

下面是matlab源代码:

main.m

clear all;close all;clc;fai=0;d=1;img=imread('lena.jpg');[m n]=size(img);k=1;for i=1:10:m-10     %取10*10的图像,这里我随便写了,准确的是一个挨一个的取10*10   for j=1:10:n-10         re{
k}=comatrix(img(i:i+9,j:j+9),fai,d); k=k+1; endendfor j=1:8 s=[]; %存储特征的地方 for i=1:k-1 s=[s re{
i}(j)]; end figure; plot(s)end

comatrix.m

function re=comatrix(D,fai,d)    [m n]=size(D);    ma=max(D(:));    mi=min(D(:));    D=D-mi+1;       %将最小值统一为1    k=ma-mi+1;      %产生合适大小的共生矩阵    P=zeros(k,k);    if fai==0        h=0; w=d;           elseif fai==45        h=d; w=d;    elseif fai==90        h=d; w=0;    else        h=d; w=-d;    end    if fai~=135        for i=1:m-h            for j=1:n-w                 P(D(i,j),D(i+h,j+w))=P(D(i,j),D(i+h,j+w))+1;              end        end    else        for i=1:m-h            for j=1-w:n                P(D(i,j),D(i+h,j+w))=P(D(i,j),D(i+h,j+w))+1;                            end        end    end        if sum(P(:))~=0         P=P/sum(P(:));  %归一化矩阵    end        %re为八个特征值    re=zeros(1,8);    re(1)=fai;              %方向特征    re(2)=d;                %步长特征    re(3)=sum(P(:).^2);     %能量特征       re(4)=max(P(:));        %最大概率特征        miux=sum(double(1:k).*sum(P(1:k,:)));    miuy=sum(double(1:k).*sum(P(:,1:k)));    sigmax=sum((double(1:k)-miux).^2.*sum(P(1:k,:)));    sigmay=sum((double(1:k)-miuy).^2.*sum(P(:,1:k)));        for i=1:k       for j=1:k            if P(i,j)~=0               re(5)=re(5)+P(i,j)*log2(P(i,j)); %熵特征            end            re(6)=re(6)+(i-j).^2*P(i,j);        %对比度特征            if i~=j                re(7)=re(7)+P(i,j)/abs(i-j);    %倒数差分矩特征            end            re(8)=re(8)+i*j*P(i,j);                   end    end    if sigmax*sigmay~=0        re(8)=(re(8)-miux*miuy)/(sigmax*sigmay);    %相关性特征    endend

comatirx.m中的re就是当前取的纹理的特征向量,八个描述子。

最后产生的全是曲线,就不贴图了。

参考:

转载地址:http://xfdia.baihongyu.com/

你可能感兴趣的文章
设计模式--代理模式
查看>>
javascript基础知识--最基础的
查看>>
[转] vue自定义组件(通过Vue.use()来使用)即install的使用
查看>>
[转] 函数声明和函数表达式——函数声明的声明提前
查看>>
敢死队2影评
查看>>
浅析 JavaScript 中的 apply 和 call 用法的差异
查看>>
html5-css综合练习
查看>>
嵌入式开发之cgic库---cgi库的使用
查看>>
clickhouse安装 Requires: libstdc++.so.6(GLIBCXX_3.4.19)(64bit)
查看>>
FFT快速傅立叶变换
查看>>
<刘未鹏 MIND HACKS>读书笔记
查看>>
locate
查看>>
AceyOffice教程--如何判断单元格的内容
查看>>
前端 -- 超链接导航栏案例
查看>>
软工网络15个人作业
查看>>
css 兼容性写法,CSS hack写法
查看>>
剑指offer 之 C/C++基础知识1
查看>>
(KMP 暴力)Corporate Identity -- hdu -- 2328
查看>>
Silverlight程序中访问配置文件
查看>>
Linux下利用rsync实现多服务器文件同步
查看>>