Это была проблема с разбивкой / масштабированием.
Давайте посмотрим внутрь:
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(:))].
Другими словами, функция разбивала ваши данные на 8 × 8 бинов и предполагая, что диапазон масштабирования равен полному диапазону uint16 (0-65535).Тем не менее, этот образец изображения, который вы мне дали, имеет минимум 305 и максимум 769, в результате чего он попадает в первую корзину (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, поэтому серая матрица симметрична, чтобы учесть возможностьотрицательные значения.
Конечно, вы также можете масштабировать исходные изображения в соответствии с их типами данных.Например, перцентильное масштабирование может быть хорошей идеей, если вы ожидаете выбросы и т. Д.