• 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

  • 相关阅读:
    ORA01940: cannot drop a user that is currently connected
    struts+swfupload实现批量图片上传(下篇)
    iPhone开发入门教程
    从零开始学习OpenGL ES集合
    iPhone入门学习——半翻页动画效果例子
    《Android学习指南》目录
    基于OpenGL ES 的图片翻转例子,包含双面贴图3D变换
    Android核心分析
    ios开发之分享一个特效 Cube
    仿Drinkspiration App的menu
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2977673.html
Copyright © 2020-2023  润新知