alexPec 6 December 27, 2018 Posted December 27, 2018 · Report post Всем доброго дня. Прошу помочь с математикой. Пытаюсь повторить эксперимент: http://www.nazim.ru/2269 - согласованный 2d фильтр. Приведенный код, по-моему бесполезен, усугубляет все отсутствие знаний питона. Поэтому пробовал сделать в Labview. С виду все просто - делаем 2d FFT от картинки, затем 2d FFT от паттерна, который хотим найти на картинке, делаем комплексное сопряжение спектра паттерна, перемножаем комплексно-сопряженный спектр паттерна на спектр картинки, делаем IFFT - и должны получить чудо. В точке совпадения паттерна со своим местом в картинке должны получить максимум. Сходу чуда не получилось. Первый и основной вопрос - разные размерности картинки и паттерна. Пробовал делать так: делать большое окно, размером с картинку, в угол ставлю паттерн, остальное заполняю нулями - не катит, пробовал размножить паттерн по вертикали и горизонтали - тоже совсем не то. Пробовал сделать FFT паттерна, а затем уже спектр "растянуть" до размерности спектра картинки - тоже не то. Ну, думаю, тогда проверю свертку - без преобразований фурье. Т.е. просто в каждой точке картинки "накладываем" паттерн и находим сумму произведений пикселей. В этом случае получаю адекватную картину - есть явный максимум в той точке, где паттерн накладывается на свое место в картинке. А дальше тупик - не пойму что где не так делаю с преобразованиями фурье. Вроде как свертка эвивалентна должна быть описанному в статье алгоритму, но результаты совершенно разные. Quote Share this post Link to post Share on other sites More sharing options...
Самурай 13 December 27, 2018 Posted December 27, 2018 · Report post 4 часа назад, alexPec сказал: Пробовал делать так: делать большое окно, размером с картинку, в угол ставлю паттерн, остальное заполняю нулями - не катит Должно катить, во всяком случае в Matlabe точно катит:) Может быть, не в тот угол паттерн ставили?:) Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 27, 2018 Posted December 27, 2018 · Report post 24 minutes ago, Самурай said: Должно катить, во всяком случае в Matlabe точно катит:) Может быть, не в тот угол паттерн ставили?:) А размерность то как правильно выравнивать? Все-таки паттерн ставить в пустую картинку такого же размера? Там какая-то готовая функция для поиска паттерна таким методом или все прозрачно, как я описывал? Пробовал паттерн и в центр и в угол ставить. Бред конечно, но так, от безнадеги. Конечно же разницы нет... Код можете выложить? Может сверим результаты поэтапно? Quote Share this post Link to post Share on other sites More sharing options...
Самурай 13 December 27, 2018 Posted December 27, 2018 · Report post Код тривиальный, красоту и изящество не наводил: Im_scene_fft = fft2(Im_scene); Im_ref_fft = fft2(Im_ref,310,431); Im_corr1 = ifft2(Im_scene_fft.*conj(Im_ref_fft)); Im_corr1_norm = (Im_corr1-min(min(Im_corr1)))*255/(max(max(Im_corr1))-min(min(Im_corr1))); Quote Share this post Link to post Share on other sites More sharing options...
iiv 49 December 27, 2018 Posted December 27, 2018 · Report post 6 hours ago, alexPec said: Чтоб проверить метод с Фурье, Вы попробуйте без оного в лоб умножением матрицы на вектор и поиском максимума. Когда это будет работать, можно фурье отлаживать. Понятно, что вычислительная сложность метода без Фурье N*N в отличие от 5/2N Log_2 N. Но для того, чтоб проверить можно и подождать чуток. Другое дело, если у Вас паттерн слегка повернут вокруг оси или соскалирован, то этот метод не катит. Тут надо градиентные фильтры на исходное изображение делать и потом аффинную трансформацию по пикам этих градиентов. Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 27, 2018 Posted December 27, 2018 · Report post Just now, iiv said: Чтоб проверить метод с Фурье, Вы попробуйте без оного в лоб умножением матрицы на вектор и поиском максимума. Когда это будет работать, можно фурье отлаживать. Понятно, что вычислительная сложность метода без Фурье N*N в отличие от 5/2N Log_2 N. Но для того, чтоб проверить можно и подождать чуток. Другое дело, если у Вас паттерн слегка повернут вокруг оси или соскалирован, то этот метод не катит. Тут надо градиентные фильтры на исходное изображение делать и потом аффинную трансформацию по пикам этих градиентов. Да без фурье-то работает, я же написал, без фурье (просто "двигаю" паттерн по картинке и вычисляю взаимнокореляционную функцию при каждом сдвиге) получаю один четкий максимум. Паттерн не повернут, он прямо вырезан из картинки. Quote Код тривиальный, красоту и изящество не наводил: Вроде все так и делал... Все, разобрался. Все получилось. Проблема с нормировкой паттерна была. Спасибо всем за помощь! Quote Share this post Link to post Share on other sites More sharing options...
Самурай 13 December 27, 2018 Posted December 27, 2018 · Report post Тогда показывайте Ваш код... Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 27, 2018 Posted December 27, 2018 · Report post 55 minutes ago, Самурай said: Тогда показывайте Ваш код... Там labview, там не код, там типа схемы, и в модулях выставляются параметры. У меня эта схема вся в экран-то не влазит чтобы скриншот сделать. Если кому надо - могу файл .vi прицепить. Quote Share this post Link to post Share on other sites More sharing options...