Создание матрицы совпадений уровня серого из 16-битного изображения - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть набор данных изображений, которые являются 16-битными, и я хочу создать из них матрицу GLCM для извлечения функций GLCM.

Однако полученная матрица показывает одно значение (как показано на рисунке ниже).), Мне интересно, почему.

16glcm

Я пытался использовать то же изображение, но преобразованное в 8-битное, в результате GLCM показывает несколько значений.

8glcm

Примечание: я использовал следующую функцию Matlab:

glcm_matrix = graycomatrix(image.tif);

Вот обрезанный образец из 16-битного изображения:

rescaled_crop

Примечание: Изображение, используемое в вычислениях, можно загрузить с здесь .Исходное изображение имеет очень низкий контраст и выглядит абсолютно темным.Изображение, показанное выше, имеет растянутый контраст и предназначено только для визуализации.

РЕДАКТИРОВАТЬ:

Я использовал

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

, и это дает мне следующие результаты:

16glcmfixed

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я просто хотел бы опираться на отличный ответ @ Tapio.

GLCM, получаемый с помощью graycomatrix при использовании пары имя / значение GrayLimits', [] в вызове функции, выглядит хорошо.Однако этот подход может быть недопустимым для вашего приложения.Если вы вычисляете GLCM для набора изображений таким образом, одни и те же элементы двух разных GLCM, соответствующих двум разным изображениям, вероятно, будут иметь разное значение.Действительно, поскольку интенсивность по-разному перераспределяется для каждого изображения, компоненты GLCM фактически кодируют разные совпадения от одного изображения к другому.

Чтобы избежать этого, вы можете сначала рассчитать минимальную и максимальную интенсивность повесь набор данных изображений (например, minImgs и maxImgs), а затем используйте эти значения для изменения масштаба интенсивности всех изображений, составляющих набор данных, точно таким же образом:

glcm_matrix = graycomatrix(image_tif, 'GrayLimits', [minImgs maxImgs]); 
0 голосов
/ 07 февраля 2019

Это была проблема с разбивкой / масштабированием.

Давайте посмотрим внутрь:

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, поэтому серая матрица симметрична, чтобы учесть возможностьотрицательные значения.

Конечно, вы также можете масштабировать исходные изображения в соответствии с их типами данных.Например, перцентильное масштабирование может быть хорошей идеей, если вы ожидаете выбросы и т. Д.

...