Сопоставление 3D-шаблонов с использованием кросс-корреляции в Matlab

Вот минимальный пример того, что я пытаюсь сделать:

Создать 3D-матрицу

a(:,:,1)=[
    1 2 3 4 1;
    2 3 7 1 4;
    3 7 6 0 9;
    0 3 2 8 1;
    1 4 3 1 1]

a(:,:,2)=[
    1 7 3 4 2;
    2 9 2 3 1;
    1 4 7 7 0;
    1 2 3 4 1;
    0 9 3 3 9]

a(:,:,3)=[
    9 4 0 3 5;
    1 2 3 4 1;
    2 0 2 3 1;
    1 4 2 1 1;
    2 5 7 8 1]

a(:,:,4)=[
    2 3 5 2 0
    0 0 0 0 8
    5 2 7 9 8
    2 4 1 1 0
    6 3 8 7 9]

a(:,:,5)=[
    3 5 1 4 6;
    3 2 8 0 0;
    0 2 1 0 4;
    5 4 5 5 6;
    9 5 9 9 5]

Создать 3D-шаблон

b(:,:,1)=[
    9 4 0;
    1 2 3;
    2 0 2]

b(:,:,2)=[
    2 3 5;
    0 0 0;
    5 2 7]

b(:,:,3)=[
    3 5 1;
    3 2 8;
    0 2 1]

Вычислить взаимную корреляцию (3D-взаимную корреляцию в Matlab). Я думаю, что взаимная корреляция - это то же самое, что свертка с перевернутым шаблоном. Это правильно?

c=convn(a,b(end:-1:1,end:-1:1,end:-1:1));

Найти индексы наилучшего соответствия

[x y z] = ind2sub(size(c),find(c==max(c(:))));
x=x-(size(b, 1) - 1)/2
y=y-(size(b, 2) - 1)/2
z=z-(size(b, 3) - 1)/2

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

В результате моего примера я ожидаю: x=2, y=2, z=4. Matlab говорит мне, что это x=4, y=4, z=4. Однако при изменении шаблона на

b(:,:,1)=[
    9 2 3;  
    4 7 7;
    2 3 4]

b(:,:,2)=[
    2 3 4;
    0 2 3;
    4 2 1]

b(:,:,3)=[
    0 0 0;
    2 7 9;
    4 1 1]

Я получаю правильный результат (x=3, y=3, z=3).

Что мне нужно изменить, чтобы всегда получать правильный результат?


person nightlyop    schedule 20.06.2014    source источник
comment
Где вы прочитали, что нужно вычесть половину размера тимплейта из конечных координат? Почему (3,3,3) правильный результат?   -  person Trilarion    schedule 20.06.2014
comment
Почему вы сворачиваете свой шаблон в обратном порядке b(end:-1:1,end:-1:1,end:-1:1)); Почему вы не делаете 1:end?   -  person kkuilla    schedule 20.06.2014
comment
Триларион: Как я уже писал: не помню. Однако, если этого не сделать, вы можете получить координату угла шаблона вместо центра, но я думаю, что это все равно должно работать. Как вы думаете?   -  person nightlyop    schedule 20.06.2014
comment
kkuilla: Вот ссылка, которую я также разместил выше: stackoverflow.com/questions/12309509/ Я также смотрел youtube.com/watch ?v=Ma0YONjMZLI и думаю, что переворачивание может быть правильным. Пожалуйста, поправьте меня, если я ошибаюсь.   -  person nightlyop    schedule 20.06.2014
comment
Почему вы ожидаете, что правильный результат будет (x, y, z) = (2, 2, 4)? Мне кажется, что вы поступаете правильно и максимальная корреляция у (4, 4, 4) со значением 354 по сравнению со значением 352, полученным при 2, 2, 4. Кроме того, вместо вычитания из индексов вы можете просто сделать c = conv(..., 'same').   -  person 3lectrologos    schedule 20.06.2014
comment
Я ожидаю, что результат будет в центре шаблона при наложении шаблона в правильном положении. Таким образом, максимальная корреляция не должна быть там, где шаблон точно соответствует (в (x, y, z) = (2, 2, 4))   -  person nightlyop    schedule 20.06.2014


Ответы (1)


В вашем коде нет ошибок

Ваш алгоритм правильный! Но, к сожалению, в вашем случае максимум взаимной корреляции находится на (4, 4, 4), а не на (2, 2, 4), как вы ожидаете.

Это потому, что, ища образец матрицы B, содержащийся в матрице A, вы нашли аналогичный образец, но с гораздо более высокой «интенсивностью» в (4, 4, 4).

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

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

Я думаю, что вы столкнулись с аналогичной проблемой здесь.

person vrleboss    schedule 25.06.2014
comment
Ты прав. Когда я немного изменяю матрицу «а», я получаю правильный результат. Большое спасибо! Есть ли возможность автоматически проверять результат? Также я думаю, что результат может быть лучше при использовании нормализованной взаимной корреляции, но как я могу сделать это в 3D с помощью свертки? - person nightlyop; 25.06.2014
comment
@vrleboss: я не уверен, как этот вопрос похож на проблему здесь. Код там и изображение, которое вы показали, основаны на обнаружение круга с помощью преобразования Хафа, а не какое-то сопоставление с шаблоном с использованием взаимная корреляция, как вы предложили. Таким образом, это было бы похоже на использование imfindcircles из набора инструментов обработки изображений, как в отличие от методов свертки/корреляции - person Amro; 25.06.2014
comment
@ Амро полностью с тобой согласен. Я пытался найти хорошую иллюстрацию к проблеме nightlyop, но вы правы, она далека от идеала... Я продолжу поиск и обновлю свой ответ. - person vrleboss; 25.06.2014