Функция MATLAB fminsearch - PullRequest
       13

Функция MATLAB fminsearch

1 голос
/ 12 января 2010

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

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

Я пытаюсь использовать fminsearch ( документация ), чтобы найти оптимальный перевод для минимума функции корреляции (т. Е. Шары находятся в одном и том же месте) следующим образом:

global reference_im unknown_im;

starting_trans = [0 0 0];
trans_vector = fminsearch(@correlate_images,starting_trans)

correlate_images.m:

function r = correlate_images(translate)
global reference_im unknown_im;

new_im = move_image(unknown_im,translate(1),translate(2),translate(3));

% This bit is unimportant to the question
% but you can see how I calculate my correlation
r = 1 - corr(reshape(new_im,[],1),reshape(reference_im,[],1));

Есть две проблемы, во-первых, fminsearch настаивает на передаче значений с плавающей запятой для вектора перевода в функцию correlate_images. Есть ли способ сообщить ему, что нужны только целые числа? (Я бы сэкономил большое количество циклов ЦП!)

Во-вторых, когда я запускаю эту программу, результат trans_vector всегда совпадает с starting_trans - я предполагаю, что это потому, что не был найден минимум, но есть ли другая причина, по которой он просто не работает?

Большое спасибо!

EDIT

Я обнаружил, как мне кажется, причину, по которой вывод trans_vector всегда совпадает с starting_trans. fminsearch смотрит на начальное значение, затем небольшое приращение в каждом направлении оттуда, это небольшое приращение всегда меньше единицы, что означает, что результат от корреляции будет идеальным соответствием (так как move_image вернет так же, как входное изображение для движений субпикселя). Я собираюсь продолжить работу над тем, чтобы убедить matlab только в fminsearch над целыми значениями!

Ответы [ 2 ]

1 голос
/ 12 января 2010

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

Во-вторых, для такой простой переводческой регистрации вы можете использовать БПФ. Произведите прямое преобразование обоих изображений, умножьте изображения вместе (точечно! То есть используйте A. * B, а не A * B, поскольку это разные операции, и первое - то, что вам нужно), и в обратном порядке должен быть пик преобразование, чье смещение от начала координат - это необходимая вам сумма перевода. Численные рецепты в C имеют хорошее объяснение; вот ссылка на индекс pdf . Разница в скорости между версией FFT и версией с прямой корреляцией огромна; БПФ - это O (N log N), а методом корреляции будет O (N * M), где M - количество пикселей в окрестности поиска. Если вы хотите разрешить поиск всего изображения, тогда корреляция становится O (N * N), что займет намного больше времени, чем версия FFT. Изменение параметров с плавающих на целые не решит проблему.

Причина, по которой функция fminsearch использует числа с плавающей запятой (если я могу догадаться о причинах решений кодеров), заключается в том, что для задач, которые не являются тестовыми проблемами (например, сферы в объеме), вам часто требуется разрешение в субпикселях выполнить правильную регистрацию. Ознакомьтесь с документацией ITK о ​​причинах такого подхода.

В-третьих, я хотел бы предложить, чтобы хорошим способом написания этой программы на Matlab (если вы все еще хотите это делать!), В то же время форсируя целочисленные корреляции, было бы избегание функции fminsearch, которая захочет использовать float. Попробуйте что-то вроде:

startXPos = -10; %these parameters dictate the size of your search neighborhood
startYPos = -10; %corresponds to M in the above explanation
endXPos = 10;
endYPos = 10;
optimalX = 0;
optimalY = 0;
maxCorrVal = 0;
for i=startXPos:endXPos
   for j = startYPos:endYPos
      %test the correlation of the two images here, where one image is shifted to another
      currCorrVal = Correlate(image1, image2OffsetByiAndj);
      if (currCorrVal > maxCorrVal)
          maxCorrVal = currCorrVal;
          optimalX = i;
          optimalY = j;
      end
   end
end

Здесь вам просто нужно написать функцию смещения. Таким образом, вы избежите проблемы с плавающей точкой и увеличите вектор перевода (я не вижу способа, чтобы этот вектор перемещался в предоставленных вами функциях, что, вероятно, объясняет отсутствие движения).

0 голосов
/ 13 января 2010

Существует очень похожая демонстрация в Toolbox Toolbox , которая использует нормализованную функцию взаимной корреляции normxcorr2 для регистрации изображения. Чтобы не повторять одно и то же, ознакомьтесь с демонстрацией непосредственно:

Регистрация изображения с использованием нормализованной взаимной корреляции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...