У меня есть два изображения, которые я пытаюсь совместно зарегистрировать - то есть одно может быть из шара в центре изображения, другое - из того же шара около края, и я пытаюсь найти онемение из пикселей я должен переместить второе изображение так, чтобы шары были в одном месте. (Я на самом деле использую 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 над целыми значениями!