Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm MATLAB中的邻域灰度相关矩阵(NGLDM)_Algorithm_Matlab_Image Processing_Matrix_Feature Extraction - Fatal编程技术网

Algorithm MATLAB中的邻域灰度相关矩阵(NGLDM)

Algorithm MATLAB中的邻域灰度相关矩阵(NGLDM),algorithm,matlab,image-processing,matrix,feature-extraction,Algorithm,Matlab,Image Processing,Matrix,Feature Extraction,我想计算两个纹理特征(即:小/大数字强调、数字不均匀性、二阶矩和熵)。这些可以从相邻的灰度相关矩阵计算。我正在努力理解/实施这一点。关于这种方法的信息很少(公开提供) 根据: 该矩阵采用二维阵列Q的形式,其中Q(i,j)可被视为处理图像灰度变化的频率计数。它的含义与图像的直方图相似。这个数组是Ng×Nr,其中Ng是可能的灰度级数,Nr是图像中像素的可能邻居数 如果图像函数f(i,j)是离散的,那么通过计算f(i,j)中的每个元素与其相邻元素之间在一定距离d处的差值等于或小于a的次数,可以很容易地

我想计算两个纹理特征(即:小/大数字强调、数字不均匀性、二阶矩和熵)。这些可以从相邻的灰度相关矩阵计算。我正在努力理解/实施这一点。关于这种方法的信息很少(公开提供)

根据:

该矩阵采用二维阵列Q的形式,其中Q(i,j)可被视为处理图像灰度变化的频率计数。它的含义与图像的直方图相似。这个数组是Ng×Nr,其中Ng是可能的灰度级数,Nr是图像中像素的可能邻居数

如果图像函数f(i,j)是离散的,那么通过计算f(i,j)中的每个元素与其相邻元素之间在一定距离d处的差值等于或小于a的次数,可以很容易地计算Q矩阵(对于正整数d,a)

以下是同一篇论文中的示例(d=1,a=0):

输入(图像)矩阵和输出矩阵Q:

我已经看了这个例子好几个小时了,仍然不知道他们是如何得到Q矩阵的。有人吗


该方法最初由C.Sun和W.Wee创建,并在一篇名为“的论文中进行了描述,我可以访问该论文,但无法下载(在按下“下载”按钮后,页面将重新加载,仅此而已)。

在您提供的示例中,
d=1
a=0
。当代码> d=1 < /代码>时,我们考虑8像素邻域中的像素。当
a=0
时,这意味着我们寻找与邻域中心具有相同值的像素

基本算法如下所示:

  • 将NGLDM矩阵初始化为全零。总行数对应于图像中可能的强度/值的总数。列的总数对应于您所在区域的像素数加1。对于
    d=1
    ,我们有一个8像素的邻域,因此8+1=9。因为有4种可能的强度
    (0,1,2,3)
    ,所以我们有一个4 x 9矩阵。让我们把这个矩阵称为
    M
  • 对于矩阵中的每个像素,记下该像素。这将出现在
    Ng
    行中
  • 写出该像素周围有多少有效邻居
  • 计算您在步骤1中看到与该像素匹配的相邻像素的次数。这是您的
    Nr
  • 计算出步骤1和步骤2中的数字后,将此位置增加1

  • 这里有一个小问题:他们忽略了边界位置。因此,您不会对第一行、最后一行、第一列或最后一列执行此过程。我的猜测是,他们想确保你一直都有一个8像素的邻居。这也取决于距离
    d=1
    必须能够抓取
    d=1处给定中心位置的每个有效像素。如果
    d=2
    ,则必须确保邻域中心的每个像素都有一个25像素的邻域,以此类推

    让我们从这个矩阵的第二行第二列位置开始。让我们完成以下步骤:

  • Ng=1
    ,因为位置为1
  • 有效邻域-从该邻域中的左上角像素开始,从左向右扫描,忽略中心,我们有:
    1,1,2,0,1,0,2,2
  • 有多少个值等于
    1
    ?三次。因此
    Nr=3
  • M(Ng,Nr)+=1
    。访问行
    Ng=1
    ,访问行
    Nr=3
    ,并将该点增加1

  • 想知道我是怎么知道他们不算边界的吗?让我们做左下角的像素。该位置是
    0
    ,因此
    Ng=0
    。如果你重复我刚才说的算法,你会期望
    Ng=0
    Nr=1
    ,因此你会期望矩阵中该位置至少有一个条目。。。但你没有!如果您在图像的边框周围进行类似的检查,您将看到应该存在的条目。。。不是。请看第三行第五列。您可能会认为
    Ng=1
    Nr=1
    ,但我们在矩阵中看不到这一点


    再举一个例子。为什么
    M(Ng,Nr)=4,Ng=2,Nr=4
    ?那么,看看每个像素中都有
    2
    。我们可以成功捕获8像素邻域的唯一有效位置是
    行=2,列=4
    行=3,列=3
    行=3,列=4
    行=4,列=3
    ,以及
    行=4,列=4
    。通过应用我们已经看到的相同算法,您将看到,对于每个位置,
    Nr=4
    。因此,我们看到Ng=2,Nr=4的组合为四次,这就是为什么位置设置为4。然而,在
    row=3,col=4
    中,这实际上是
    Nr=5
    ,因为该中心附近有5个2个。这就是为什么你会看到Ng=2,Nr=5,M(Ng,Nr)=1

    作为一个例子,让我们做一个位置。让我们在矩阵中间(<代码>行=3,COL=3</代码>)中执行<代码> 2 /代码> SMAK DAB:< /P>
  • Ng=2
  • 什么是有效的相邻像素<代码>1,1,2,0,2,3,2,2
  • (省略中心)
  • 计算等于2的像素数。其中有四个,因此
    Nr=4
  • M(Ng,Nr)+=1
    。取
    Ng=2
    Nr=4
    并将该点增加1 如果对具有
    2
    的其他有效位置执行此操作,则每次都会看到
    Nr=4
    ,第三行和第四行c除外
    % // Your example
    A = [1 1 2 3 1; 0 1 1 2 2; 0 0 2 2 1; 3 3 2 2 1; 0 0 2 0 1];
    B = im2col(A, [3 3]); %//Convert neighbourhoods to columns - 3 x 3 means d = 1
    C = bsxfun(@eq, B, B(5,:)); %//Figure out a logical matrix where each column tells
                                %//you how many elements equals the one in each centre
    D = sum(C, 1) - 1; %// Must subtract by 1 to discount centre pixel
    Ng = B(5,:).' + 1; % // We must make this into a column vector, and we also must
                       % // offset by 1 as MATLAB starts indexing by 1.
                       %// Column vector is for accumarray input
    Nr = D.' + 1; %// Do the same for Nr.  We could have simply left out the + 1 here and
                  %// took out the subtraction of -1 for D, but I want to explicitly show
                  %// the steps
    Q = accumarray([Ng Nr], 1, [4 9]); %// 4 unique intensities, 9 possible locations (0-8)
    
    Q =
    
     0     0     1     0     0     0     0     0     0
     0     0     1     1     0     0     0     0     0
     0     0     0     0     4     1     0     0     0
     0     1     0     0     0     0     0     0     0
    
    %// Set A up yourself, then use a and d as inputs
    %// Precondition - a and d are both integers. a can be 0 and d is positive!
    function [Q] = calculateGrayDepMatrix(A, a, d)
        neigh = 2*d + 1; % //Calculate rows/columns of neighbourhood
        numTotalNeigh = neigh*neigh; % //Calculate total number of pixels in neighbourhood
        middleRow = ceil(numTotalNeigh / 2); %// Figure out which index the middle row is
        B = im2col(A, [neigh neigh]);  %// Make into columns
        Cdiff = abs(bsxfun(@minus, B, B(middleRow,:))); %// For each neighbourhood, subtract with its centre
        C = Cdiff <= a; %// For each neighbourhood, figure out which differences are <= a
        D = sum(C, 1) - 1; % //For each neighbourhood, add them up
        Ng = B(middleRow,:).' + 1; % // Determine Ng and Nr, and find Q
        Nr = D.' + 1; 
        Q = accumarray([Ng Nr], 1, [max(Ng) numTotalNeigh]); 
    end
    
    A = [1 1 2 3 1; 0 1 1 2 2; 0 0 2 2 1; 3 3 2 2 1; 0 0 2 0 1];
    Q = calculateGrayDepMatrix(A, 0, 1);
    
    Q =
    
     0     0     1     0     0     0     0     0     0
     0     0     1     1     0     0     0     0     0
     0     0     0     0     4     1     0     0     0
     0     1     0     0     0     0     0     0     0