zoukankan      html  css  js  c++  java
  • matlab练习程序(共生矩阵)

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

    假设待分析在精细纹理图像的一部分是一个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;
       end
    end
    
    for 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);    %相关性特征
        end
    end

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

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

    参考:

    http://matlab.izmiran.ru/help/toolbox/images/graycomatrix.html

  • 相关阅读:
    微信小程序开发前期准备
    怎样在vs2013和vs2015中实现自动编译sass
    在MVC中使用Bundle打包压缩js和css
    Html5 突破微信限制实现大文件分割上传
    Automapper 实现自动映射
    Polly一种.NET弹性和瞬态故障处理库(重试策略、断路器、超时、隔板隔离、缓存、回退、策略包装)
    关于transactionscope 事务的脏数据
    IIS设置session时长
    已禁用对分布式事务管理器(MSDTC)的网络访问的解决方法之一
    DAL.SQLHelper 的类型初始值设定项引发异常的处理
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2977673.html
Copyright © 2011-2022 走看看