从16位图像创建灰度共现矩阵

时间:2019-02-04 08:43:54

标签: matlab image-processing glcm

我有一个16位图像数据集,我想从中创建GLCM矩阵以提取GLCM特征。

但是,结果矩阵显示一个值(如下图所示),我想知道为什么。

16glcm

我尝试使用相同的图像但转换为8位,结果GLCM显示了多个值。

8glcm

注意:我使用了以下Matlab函数:

glcm_matrix = graycomatrix(image.tif);

这是16位图像的裁剪样本:

rescaled_crop

注意:可以从here下载计算中使用的图像。原始图像对比度很低,看起来完全暗。上面显示的图像具有被拉伸的对比度,仅用于可视化目的。

编辑:

我用过

glcm_matrix = graycomatrix(image.tif, 'GrayLimits', []); 

它给了我以下结果:

16glcmfixed

2 个答案:

答案 0 :(得分:3)

这是一个装箱/缩放问题。

让我们来看看里面吧

edit graycomatrix

在这种情况下,我们对'NumLevels'和'GrayLimits'这两个选项很感兴趣

%   'NumLevels'      An integer specifying the number of gray levels to use
%                    when scaling the grayscale values in I. For example,
%                    if 'NumLevels' is 8, GRAYCOMATRIX scales the values in
%                    I so they are integers between 1 and 8.  The number of
%                    gray levels determines the size of the gray-level
%                    co-occurrence matrix (GLCM).
%
%                    'NumLevels' must be an integer. 'NumLevels' must be 2
%                    if I is logical.
%  
%                    Default: 8 for numeric
%                             2 for logical
%
%   'GrayLimits'     A two-element vector, [LOW HIGH], that specifies how 
%                    the values in I are scaled into gray levels. If N is
%                    the number of gray levels (see parameter 'NumLevels')
%                    to use for scaling, the range [LOW HIGH] is divided
%                    into N equal width bins and values in a bin get mapped
%                    to a single gray level. Grayscale values less than or
%                    equal to LOW are scaled to 1. Grayscale values greater
%                    than or equal to HIGH are scaled to NumLevels. If
%                    'GrayLimits' is set to [], GRAYCOMATRIX uses the
%                    minimum and maximum grayscale values in I as limits,
%                    [min(I(:)) max(I(:))].

因此,换句话说,该功能将您的数据分成8x8个bin,并假设缩放范围是整个uint16范围(0-65535)。但是,您提供的样本图像最小值为305,最大值为769,使其落入第一个bin中(0-8192左右)。当我打电话给A = graycomatrix(I)时,会得到以下矩阵:

A =

    6600           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0
       0           0           0           0           0           0           0           0

但是,当调用A = graycomatrix(I,'GrayLimits', [])时,缩放范围被视为min(I)-max(I),并且该函数按预期工作:

A =
       4           2           1           0           0           0           0           0
       1           1           2           2           0           0           0           0
       2           2           4           7           1           0           0           0
       0           1           7         142          72           1           0           0
       0           0           0          65        1711         252           0           0
       0           0           0           0         230        3055         178           0
       0           0           0           0           0         178         654           8
       0           0           0           0           0           0           8           9

在您的原始示例中,单个值最有可能在8x8矩阵的中间,因为您的原始图像是int16而不是uint16,因此Graycomatrix是对称的,以考虑负值的可能性。

您当然也可以缩放原始图像以适合其数据类型。例如,如果您预期有异常值等,百分位数缩放可能是个好主意。

答案 1 :(得分:2)

我只想基于@Tapio的出色答案。

在函数调用中使用名称/值对graycomatrix时,GrayLimits', []产生的GLCM看起来不错。但是,这种方法可能对您的应用程序无效。如果以此方式为一组图像计算GLCM,则对应于两个不同图像的两个不同GLCM的相同元素可能具有不同的含义。确实,由于对每个图像的强度进行了不同的缩放,因此GLCM的组件实际上在编码从一个图像到另一个图像的不同同时出现。

为避免这种情况,您可以首先计算整个图像数据集的最小和最大强度(例如minImgsmaxImgs),然后使用这些值重新缩放构成图像的所有图像的强度。以完全相同的方式处理数据集:

glcm_matrix = graycomatrix(image_tif, 'GrayLimits', [minImgs maxImgs]);