Соседняя матрица зависимости уровня серого (NGLDM) в MATLAB

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

Согласно эта статья:

Эта матрица имеет форму двумерного массива Q, где Q(i,j) можно рассматривать как подсчет частоты изменения серого цвета обработанного изображения. Он имеет то же значение, что и гистограмма изображения. Этот массив равен Ng×Nr, где Ng — количество возможных уровней серого, а Nr — количество возможных соседей пикселя в изображении.

Если функция изображения f(i,j) дискретна, то легко вычислить матрицу Q (для положительных целых чисел d, a ) путем подсчета количества раз, когда разница между каждым элементом в f(i,j) и его соседями меньше или равна a на определенном расстоянии d .

Вот пример из той же статьи (d = 1, a = 0):

Входная (изображение) матрица и выходная матрица Q:

Матрица ввода (изображения)введите здесь описание изображения

Я смотрю на этот пример уже несколько часов и до сих пор не могу понять, как они получили эту матрицу Q. Кто угодно?

Этот метод был первоначально разработан К. Саном и У. Ви и описан в статье под названием: Соседняя матрица зависимости уровня серого для классификации текстур, к которой я получил доступ, но не могу скачать (после загрузки страница перезагружается и все).


person sowizz    schedule 29.07.2014    source источник
comment
Не знаю, каков ответ, но, возможно, мои мысли начнут обсуждение или помогут кому-то еще увидеть это. Если d=1, то мы говорим о непосредственных (соседних) соседях, а если a=0, мы ищем разность, равную нулю, поэтому мы ищем одинаковых ближайших соседей - я думаю! 4 в NGLDM должно быть ключом к пониманию — должен быть пиксель с 4 непосредственными идентичными соседями, который выглядит как сетка 2x2 из 2 в правом нижнем углу входной матрицы — но понятия не имею, как это объясняет. !   -  person Mark Setchell    schedule 29.07.2014
comment
Я понял. я напишу ответ   -  person rayryeng    schedule 29.07.2014
comment
Я думаю, вас интересует серая матрица совпадений. Эта же матрица используется для вычисления характеристик текстур Haralick.   -  person Thoth    schedule 29.07.2014
comment
@Thoth - это отличается от матрицы совпадения. Это подсчитывает общее количество раз, когда соседи пикселя равны центру... в примере   -  person rayryeng    schedule 29.07.2014
comment
@MarkSetchell и sowizz - я написал ответ ... и в качестве бонуса я также написал код MATLAB, который вычисляет эту матрицу. Наслаждаться!   -  person rayryeng    schedule 29.07.2014


Ответы (1)


В приведенном вами примере d=1 и a=0. Когда d=1, мы рассматриваем пиксели в районе 8 пикселей. Когда a=0, это означает, что мы ищем пиксели, которые имеют то же значение, что и центр окрестности.

Основной алгоритм следующий:

  1. Инициализируйте матрицу NGLDM всеми нулями. Общее количество строк соответствует общему количеству возможных интенсивностей/значений в вашем изображении. Общее количество столбцов соответствует количеству пикселей в вашем соседстве плюс 1. Таким образом, для d=1 у нас есть соседство из 8 пикселей, поэтому 8 + 1 = 9. Поскольку существует 4 возможных интенсивности (0,1,2,3), мы имеем 4 х 9 матрица. Назовем эту матрицу M.
  2. Для каждого пикселя в вашей матрице обратите внимание на этот пиксель. Это идет в строке Ng.
  3. Запишите сколько допустимых соседей вокруг этого пикселя.
  4. Подсчитайте, сколько раз вы видите соседние пиксели, совпадающие с этим пикселем на шаге №1. Это ваш столбец Nr.
  5. Как только вы определите числа на шаге № 1 и шаге № 2, увеличьте это местоположение на 1.

Вот небольшая загвоздка: они игнорируют пограничные местоположения. Таким образом, вы не выполняете эту процедуру для первой строки, последней строки, первого столбца или последнего столбца. Я предполагаю, что они хотят быть уверены, что у вас всегда есть 8-пиксельная окрестность. Это также диктуется расстоянием d=1. Вы должны иметь возможность захватить каждый допустимый пиксель с учетом центрального местоположения в d=1. Если d=2, то вам нужно убедиться, что каждый пиксель в центре окрестности имеет 25-пиксельную окрестность и так далее.

Начнем со второй строки, расположения второго столбца этой матрицы. Пройдемся по шагам:

  1. Ng = 1, так как это место 1.
  2. Действительные соседи. Начиная с верхнего левого пикселя в этом районе и сканируя слева направо, опуская центр, мы имеем: 1, 1, 2, 0, 1, 0, 2, 2.
  3. Сколько значений равны 1? Три раза. Поэтому Nr = 3
  4. 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 пикселей, — это row=2, col=4, row=3, col=3, row=3, col=4, row=4, col=3 и row=4, col=4. Применив тот же алгоритм, который мы видели, вы увидите, что для каждого из этих местоположений Nr = 4. Таким образом, мы видим эту комбинацию Ng = 2, Nr = 4 четыре раза, и поэтому для местоположения установлено значение 4. Однако в row=3, col=4 на самом деле это Nr = 5, поскольку их пять. 2s в этом районе в этом центре. Вот почему вы видите Ng = 2, Nr = 5, M(Ng,Nr) = 1.

В качестве примера сделаем одну из локаций. Сделаем 2 шлепок в середине матрицы (row=3, col=3):

  1. Ng = 2
  2. Каковы допустимые соседние пиксели? 1, 1, 2, 0, 2, 3, 2, 2 (без центра)
  3. Подсчитайте, сколько пикселей равно 2. Их четыре, значит Nr = 4
  4. M(Ng,Nr) += 1. Возьмите Ng = 2, Nr = 4 и увеличьте это место на 1.

Если вы сделаете это с другими допустимыми местоположениями, имеющими 2, вы увидите это Nr = 4 каждый раз, за ​​исключением третьей строки и четвертого столбца, где Nr = 5.


Итак, как бы мы реализовали это в MATLAB? Что вы можете сделать, так это использовать im2col для преобразования каждой допустимой окрестности в столбцы. Я также собираюсь выделить центр каждого района. На самом деле это средний ряд матрицы. Затем мы выясним, сколько пикселей для каждой окрестности равно центру, суммируем их, и это определит наши значения 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 и 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

Мы можем воссоздать сценарий, который мы показали выше, с помощью матрицы примера:

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 таким образом:

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

Надеюсь это поможет!

person rayryeng    schedule 29.07.2014
comment
Собираюсь попробовать это через несколько минут. Тем временем я нашел еще один пример. Опять же без описания. Надеюсь, ваше решение тоже сработает. Спасибо за ваши усилия. Очень признателен ????. - person sowizz; 29.07.2014
comment
@sowizz - Не будет. Мне нужно изменить свой код, чтобы он работал для этого примера. Это будет немного сложнее, поэтому мне придется заняться этим позже. - person rayryeng; 29.07.2014
comment
@sowizz - Просто примените тот же алгоритм. Вместо того, чтобы проверять, соответствует ли пиксель в окрестности центру, вы находите абсолютную разницу между каждым пикселем в окрестности и центром. Если расстояние между соседним пикселем и центром равно <= a, то это считается частью суммы. Также d контролирует, сколько пикселей находится в вашем районе. d=1 означает район 3 x 3. Однако sqrt(2) меня озадачивает. В спецификациях указано, что d — положительное целое число, однако в примере оно дается как sqrt(2). - person rayryeng; 29.07.2014
comment
Я думаю, что это два разных подхода. Давайте остановимся на том, что d — положительное целое число, как это написано в статье, а второй пример взят из некоторых слайдов лекции. - person sowizz; 29.07.2014
comment
@sowizz - Готово. Я изменил свой код. Удачи! Было ли мое объяснение достаточно хорошим для того, как вычислить Q? - person rayryeng; 29.07.2014
comment
Я почти уверен, что это так, так как это настолько подробно, насколько это возможно. Завтра я реализую функции из OP и посмотрю, имеют ли они какую-либо дискриминационную силу в моем приложении. Конечно надеюсь. Вернусь с результатами. Еще раз спасибо. - person sowizz; 29.07.2014