Algorithm MATLAB中的邻域灰度相关矩阵(NGLDM)
我想计算两个纹理特征(即:小/大数字强调、数字不均匀性、二阶矩和熵)。这些可以从相邻的灰度相关矩阵计算。我正在努力理解/实施这一点。关于这种方法的信息很少(公开提供) 根据: 该矩阵采用二维阵列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矩阵的。有人吗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的次数,可以很容易地
该方法最初由C.Sun和W.Wee创建,并在一篇名为“的论文中进行了描述,我可以访问该论文,但无法下载(在按下“下载”按钮后,页面将重新加载,仅此而已)。在您提供的示例中,
d=1
和a=0
。当代码> d=1 < /代码>时,我们考虑8像素邻域中的像素。当a=0
时,这意味着我们寻找与邻域中心具有相同值的像素
基本算法如下所示:
d=1
,我们有一个8像素的邻域,因此8+1=9。因为有4种可能的强度(0,1,2,3)
,所以我们有一个4 x 9矩阵。让我们把这个矩阵称为M
Ng
行中Nr
列这里有一个小问题:他们忽略了边界位置。因此,您不会对第一行、最后一行、第一列或最后一列执行此过程。我的猜测是,他们想确保你一直都有一个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
(省略中心)
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