В приведенном вами примере d=1
и a=0
. Когда d=1
, мы рассматриваем пиксели в районе 8 пикселей. Когда a=0
, это означает, что мы ищем пиксели, которые имеют то же значение, что и центр окрестности.
Основной алгоритм следующий:
- Инициализируйте матрицу NGLDM всеми нулями. Общее количество строк соответствует общему количеству возможных интенсивностей/значений в вашем изображении. Общее количество столбцов соответствует количеству пикселей в вашем соседстве плюс 1. Таким образом, для
d=1
у нас есть соседство из 8 пикселей, поэтому 8 + 1 = 9. Поскольку существует 4 возможных интенсивности (0,1,2,3)
, мы имеем 4 х 9 матрица. Назовем эту матрицу M
.
- Для каждого пикселя в вашей матрице обратите внимание на этот пиксель. Это идет в строке
Ng
.
- Запишите сколько допустимых соседей вокруг этого пикселя.
- Подсчитайте, сколько раз вы видите соседние пиксели, совпадающие с этим пикселем на шаге №1. Это ваш столбец
Nr
.
- Как только вы определите числа на шаге № 1 и шаге № 2, увеличьте это местоположение на 1.
Вот небольшая загвоздка: они игнорируют пограничные местоположения. Таким образом, вы не выполняете эту процедуру для первой строки, последней строки, первого столбца или последнего столбца. Я предполагаю, что они хотят быть уверены, что у вас всегда есть 8-пиксельная окрестность. Это также диктуется расстоянием d=1
. Вы должны иметь возможность захватить каждый допустимый пиксель с учетом центрального местоположения в d=1
. Если d=2
, то вам нужно убедиться, что каждый пиксель в центре окрестности имеет 25-пиксельную окрестность и так далее.
Начнем со второй строки, расположения второго столбца этой матрицы. Пройдемся по шагам:
Ng = 1
, так как это место 1.
- Действительные соседи. Начиная с верхнего левого пикселя в этом районе и сканируя слева направо, опуская центр, мы имеем:
1, 1, 2, 0, 1, 0, 2, 2
.
- Сколько значений равны
1
? Три раза. Поэтому Nr = 3
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
):
Ng = 2
- Каковы допустимые соседние пиксели?
1, 1, 2, 0, 2, 3, 2, 2
(без центра)
- Подсчитайте, сколько пикселей равно 2. Их четыре, значит
Nr = 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