zoukankan      html  css  js  c++  java
  • 灰度共生矩阵的理解

    (转载)

    一直计划着使用灰度共生矩阵来提取图像的纹理特征,就在一些论坛里搜罗来了不少程序,然后机械地来处理手头的图片,获得了一些个数字,就以为灰度共生矩阵法就这么回事了。这些天专门研学习一下这个方法,觉得学习上还是存在问题!发现:其实,自己对灰度共生矩阵怎么来的,计算又是怎么计算的,并不清楚,郁闷却无解。

    通过跟一些网友交流,肯定了这个想法之后,认真的看了一些资料,有以下新认识:

    灰度共生矩阵法,顾名思义,就是通过计算灰度图像得到它的共生矩阵,然后透过计算这个共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征(纹理的定义仍是难点)。灰度共生矩阵能反映图像灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图像的局部模式和它们排列规则的基础。

    对于灰度共生矩阵的理解,需要明确几个概念:方向,偏移量和灰度共生矩阵的阶数。

    1、  方向

    一般计算过程会分别选在几个不同的方向来进行,常规的是0°、45°、90°、135°,理论上的所有方向计算方法不可取。

    定义如下:

    水平方向为0°垂直的90°,以及45°和135°(大致如上图所画)

    2、偏移量(offset:下面例子中,取值为1来帮助理解)

    3、灰度共生矩阵的阶数和灰度图像的灰度值的阶数是一致的,即当灰度图像的灰度值的阶数是N时,灰度共生矩阵为N*N的矩阵。

     

    0

    0

    0

    1

    2

    0

    0

    1

    1

    2

    0

    1

    1

    1

    1

    1

    1

    2

    2

    1

    1

    2

    2

    1

    0

    假定offset1,取0°方向求共生矩阵时:

    最初取点(1,1) (1,2) ,此时在频度矩阵的(00)处加1(1,1)点的灰度值为0(1,2)点的灰度也为0);

    然后取(1,2) (1,3)点,此时也在频度矩阵的(00)处加1

    接着取到(1,3) (1,4)点,此时也在频度矩阵的(00)处加1

    接着取到(1,4) (1,5) 点,此时在频度矩阵的(10)处加1(1,5)点的灰度值为1 (1,4)点的灰度为0)。

    直到每一行都取遍即可。

    假定offset1,取45°方向求共生矩阵时:

    最初取点(1,1) (2,2) ,此时在45°方向频度矩阵的(00)处加1(1,1)点的灰度值为0(2,2)点的灰度也为0);

    然后取(1,2) (2,3)点,此时在45°方向频度矩阵的(01)处加1

    接着取到(1,3) (2,4)点,此时也在45°方向频度矩阵的(01)处加1

    接着取到(1,4) (2,5) 点,此时在45°方向频度矩阵的(12)处加1(1,4)点的灰度值为1 (2,5)点的灰度为2)。

    然后下一行,直到每一行合适的值都取遍即可。

    另两个方向的情况相似。

    最后得到如下四个频度矩阵

     

    10

    0

    1

    2

    0

    3

    3

    0

    1

    1

    5

    4

    2

    0

    2

    2

    11

    0

    1

    2

    0

    1

    5

    0

    1

    0

    3

    5

    2

    1

    1

    0

     

     

     

     

     

     

    0°方向频度矩阵                  45°方向频度矩阵

                                            

    10

    0

    1

    2

    0

    3

    3

    0

    1

    1

    6

    3

    2

    0

    2

    2

    10

    0

    1

    2

    0

    3

    0

    0

    1

    0

    7

    2

    2

    0

    2

    2

     

     

     

     

     

    90°方向频度矩阵               135°方向频度矩阵

     

    在用matlab编程时由于matlab的矩阵的下脚标是从1开始的所以矩阵的形式类似于下面的形式:

    p(I(i,j)+1,I(i,j+1)+1)= p(I(i,j)+1,I(i,j+1)+1)+1;这是0°方向的计算式

    这里,灰度阶数即从最低的0变成最低为1

    四个方向的计算式,大致如下:

    p1(IN(M,N)+1,IN(M,N+1)+1)= p1(IN(M,N)+1,IN(M,N+1)+1)+1;%是共生矩阵0度的计算式

    p1(IN(M,N)+1,IN(M-1,N+1)+1)= p1(IN(M,N)+1,IN(M-1,N+1)+1)+1;%45度的计算式

    p1(IN(M,N)+1,IN(M-1,N)+1)= p1(IN(M,N)+1,IN(M-1,N)+1)+1;%是共生矩阵90度的计算式

    p1(IN(M,N)+1,IN(M-1,N-1)+1)= p1(IN(M,N)+1,IN(M-1,N-1)+1)+1;%135度的计算式

     

     

    现在各个方向统计完毕,然后将频度矩阵/总频次即得共生矩阵

    这时候得到四个共生矩阵,分别是

    其编程实现,可参见如下代码:

    %2.为了减少计算量,对原始图像灰度级压缩,将Gray量化成16

    %--------------------------------------------------------------------------

    for i = 1:M

        for j = 1:N

            for n = 1:256/16

                if (n-1)*16<=Gray(i,j)&Gray(i,j)<=(n-1)*16+15

                    Gray(i,j) = n-1;

                end

            end

        end

    end

     

    %--------------------------------------------------------------------------

    %3.计算四个共生矩阵P,取距离为1,角度分别为0,45,90,135

    %--------------------------------------------------------------------------

    P = zeros(16,16,4);

    for m = 1:16

        for n = 1:16

            for i = 1:M

                for j = 1:N

                    if j<N&Gray(i,j)==m-1&Gray(i,j+1)==n-1

                        P(m,n,1) = P(m,n,1)+1;

                        P(n,m,1) = P(m,n,1);

                    end

                    if i>1&j<N&Gray(i,j)==m-1&Gray(i-1,j+1)==n-1

                        P(m,n,2) = P(m,n,2)+1;

                        P(n,m,2) = P(m,n,2);

                    end

                    if i<M&Gray(i,j)==m-1&Gray(i+1,j)==n-1

                        P(m,n,3) = P(m,n,3)+1;

                        P(n,m,3) = P(m,n,3);

                    end

                    if i<M&j<N&Gray(i,j)==m-1&Gray(i+1,j+1)==n-1

                        P(m,n,4) = P(m,n,4)+1;

                        P(n,m,4) = P(m,n,4);

                    end

                end

            end

            if m==n

                P(m,n,:) = P(m,n,:)*2;

            end

        end

    end

    %%---------------------------------------------------------

    % 对共生矩阵归一化

    %%---------------------------------------------------------

    for n = 1:4

        P(:,:,n) = P(:,:,n)/sum(sum(P(:,:,n)));

    end

    (有待再阅读,加深理解)

     

  • 相关阅读:
    加密文件夹 | 彻底隐藏文件夹
    Swing的概述
    Java SE练习题——求奇数
    多线程有什么用?
    Robot的使用
    基础的Servlet
    Angular Resolver 学习
    GoLang 学习
    Angular Material 控件学习
    Angular 学习小记
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2115266.html
Copyright © 2011-2022 走看看