我想计算几个纹理特征(即:小/大数强调,数字非均匀性,第二矩和熵)。这些可以从相邻灰度级依赖矩阵计算。我正在努力理解/实施这个。关于这种方法的信息非常少(可公开获得)。
根据this paper:
此矩阵采用二维数组 Q 的形式,其中 Q(i,j)可视为已处理图像的灰度变化的频率计数。它具有与图像的直方图类似的含义。该数组是N g ×N r 其中N g 是可能的灰度级数,N r 是图像中像素的可能邻居数。
如果图像函数 f(i,j)是离散的,那么很容易计算 Q 矩阵(对于正整数 d,a < / em>)通过计算 f(i,j)中的每个元素与其邻居之间的差异等于或小于某个距离 a 的次数< EM> d 。
以下是同一篇论文的例子( d = 1,a = 0 ):
输入(图像)矩阵和输出矩阵 Q :
我一直在看这个例子几个小时,但仍然无法弄清楚他们是如何得到 Q 矩阵的。任何人吗?
该方法最初由C. Sun和W. Wee创建,并在一篇名为“Neighboring gray level dependence matrix for texture classification”的论文中进行了描述,我可以访问该文章,但无法下载(按下后页面重新加载,就是这样。)
答案 0 :(得分:4)
在您提供的示例中,d=1
和a=0
。当d=1
时,我们会考虑8像素邻域中的像素。当a=0
时,这意味着我们会查找与邻域中心具有相同值的像素。
基本算法如下:
d=1
,我们有一个8像素的邻域,因此8 + 1 = 9.因为有4种可能的强度{{1因此,我们有一个4 x 9矩阵。我们将此矩阵称为(0,1,2,3)
。M
行。Ng
列。这里有一个轻微的问题:他们忽略了边境位置。因此,您不必对第一行,最后一行,第一列或最后一列执行此过程。我的猜测是他们希望确保你有一个8像素的邻居。这也取决于距离Nr
。您必须才能获取d=1
处中心位置的每个有效像素。如果d=1
,那么您必须确保邻域中心的每个像素都有一个25像素的邻域,依此类推。
让我们从该矩阵的第二行,第二列位置开始。让我们完成以下步骤:
d=2
因为位置为1。Ng = 1
。1, 1, 2, 0, 1, 0, 2, 2
?三次。因此1
Nr = 3
。访问行M(Ng,Nr) += 1
,然后访问行Ng = 1
,并将此点增加1。想知道我怎么知道他们不算边界?让我们做左下角的像素。该位置为Nr = 3
,因此0
。如果你重复我刚刚说过的算法,你会期望Ng = 0
,Ng = 0
,所以你期望矩阵中该位置至少有一个条目......但是你不要!如果你在图像的边界周围进行类似的检查,你会看到应该在那里的条目......不是。看看第三行,第五列。您会认为Nr = 1
和Ng = 1
,但我们在矩阵中看不到。
又一个例子。为什么Nr = 1
?好吧,看一下其中有M(Ng,Nr) = 4, Ng = 2, Nr = 4
的每个像素。我们可以成功捕获8像素邻域的唯一有效位置是2
,row=2, col=4
,row=3, col=3
,row=3, col=4
和row=4, col=3
。通过应用我们看到的相同算法,您会看到每个位置row=4, col=4
。因此,我们看到Nr = 4
四次次的这种组合,以及该位置设置为4的原因。但是,在Ng = 2, Nr = 4
中,这实际上是{ {1}},因为该中心附近有五个 2。这就是你看row=3, col=4
的原因。
举个例子,让我们做其中一个地点。让我们在矩阵(Nr = 5
)的中间进行Ng = 2, Nr = 5, M(Ng,Nr) = 1
轻击:
2
row=3, col=3
(省略中心)Ng = 2
1, 1, 2, 0, 2, 3, 2, 2
。取Nr = 4
,M(Ng,Nr) += 1
并将此点增加1. 如果您使用Ng = 2
的其他有效位置执行此操作,则每次都会看到Nr = 4
,但第三行和第四列除外,其中2
}。
那么我们如何在MATLAB中实现呢?您可以做的是使用im2col
将每个有效的邻域转换为列。我还要做的是提取每个社区的中心。这实际上是矩阵的中间行。然后我们将计算出每个邻域中有多少像素等于中心,将它们相加,这将决定我们的Nr = 4
值。 Nr = 5
值将是中间行值本身。一旦我们这样做,我们就可以根据这些值计算直方图,就像算法如何获得矩阵一样。换句话说,尝试这样做:
Nr
......这是我们的矩阵:
Ng
如果您选中此项,则会看到此匹配项与% // 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
和Q
的位置,我们只需遵循您的文字指南即可。对于每个邻域,您可以找到中心像素与所有其他像素之间的差异。您可以计算任何正整数d
的{{1}}像素数。请注意,这将创建一个我们需要检查的a
邻域。我们也可以将它变成一个函数。没有进一步的麻烦:
<= a
我们可以通过以下示例重新创建上面显示的场景:
d
因此 2*d + 1 x 2*d + 1
:
%// 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
希望这有帮助!