Аффинное преобразование между эллиптическими пятнами

Я новичок в OpenCV, и я учусь обрабатывать изображения. В рамках моего проекта у меня возникла проблема с деформированием участка изображения в форме эллипса в эллипс назначения. Насколько я понимаю, мне нужно было бы вычислить аффинное преобразование между двумя патчами, а затем преобразовать это преобразование в патч назначения. Просматривая Интернет в поисках помощи, я не нашел способа вычислить аффинные преобразования между двумя эллиптическими пятнами. Я на правильном пути? Буду признателен, если вы дадите мне несколько советов, как действовать дальше или где искать дополнительную информацию.


person stckjp    schedule 07.10.2012    source источник
comment
что вы имеете в виду вычислить аффинные преобразования между двумя эллиптическими пятнами. В чем именно проблема. От чего именно вы вычисляете аффинное преобразование? Набор очков? Изображение двух эллипсов?   -  person Hammer    schedule 08.10.2012
comment
Эллиптические пятна представляют интересующую область для дескриптора. Каждый дескриптор в исходном изображении сопоставляется с дескриптором из базы данных изображений. Идея состоит в том, чтобы восстановить исходное изображение с помощью базы данных. Я нашел соответствующие дескрипторы, и теперь мне нужно исказить соответствующие эллиптические участки в исходном изображении. Каждый патч уже имеет аффинное преобразование, поэтому мне нужно найти аффинное преобразование среди соответствующей пары и применить его. Я просто не знаю, как это сделать.   -  person stckjp    schedule 08.10.2012
comment
сколько точечных соответствий у вас есть? Вы смотрели cv :: getAffineTransform? как насчет cv :: ratingAffine3D?   -  person Hammer    schedule 08.10.2012
comment
проблема в получении аффинного преобразования или деформации?   -  person Hammer    schedule 08.10.2012
comment
Дело в том, что мне нужно деформировать каждый эллиптический патч от соответствующего изображения к исходному. Количество патчей зависит от количества дескрипторов, которое зависит от исходного изображения. К сожалению, поскольку у меня есть эллипсы, я не могу использовать классические аффинные преобразования из opencv   -  person stckjp    schedule 09.10.2012
comment
Итак, каждое изображение имеет много патчей, и мне нужно деформировать соответствующие патчи, которые я нашел из базы данных, в исходное изображение, которое мне нужно восстановить.   -  person stckjp    schedule 09.10.2012
comment
Эллипс определяется тремя точками, почему вы не можете их использовать? Все было бы намного яснее, если бы вы предоставили более подробную информацию в вопросе, в идеале с картинками.   -  person Hammer    schedule 09.10.2012
comment
Каждый патч описывает область изображения и задается точкой, представляющей центр области, ее матрицу аффинного преобразования, ее масштаб и ориентацию градиента, а также вектор дескриптора. Теперь я нахожусь в точке, где я нашел соответствующие эллиптические участки между двумя разными изображениями (img1 и img2) с использованием векторов дескрипторов, и то, что я хотел бы сделать для каждого патча img2, - это найти аффинное преобразование относительно соответствующего патч в img1 и деформация патча image2 в патч img1. Надеюсь, теперь стало понятнее.   -  person stckjp    schedule 09.10.2012
comment
Итак, у вас есть 2 аффинных преобразования [A] и [B], оба относительно некоторого источника O, и вы хотите найти преобразование между [A] и [B]? В этом весь вопрос?   -  person Hammer    schedule 09.10.2012
comment
да, просто эти два элемента эллипсы   -  person stckjp    schedule 09.10.2012


Ответы (1)


Тот факт, что ваши элементы являются эллипсами, не имеет отношения к вычислению преобразования. Трансформации одинаково хорошо работают с произвольными формами. Допустим, у вас есть аффинные преобразования [A] и [B] относительно некоторого начала O, вам нужно преобразование между [A] и [B]. Есть несколько способов сделать это, самый простой - получить преобразование из [A] в O, затем из O в [B] и объединить их. [A] к O - это просто обратное к [A], а O к [B] - это просто [B], поэтому

final_transform = [B]*inverse([A]);

здесь - аналогичный вопрос, решение с векторными представлениями также возможно.

Для фактического деформирования вы можете использовать cv :: warpAffine

person Hammer    schedule 09.10.2012
comment
Верно ли это, если два эллипса имеют разные точки в качестве центров? Если я деформирую A в B, будет ли центр нового участка соответствовать центру B? - person stckjp; 09.10.2012
comment
Я до сих пор не понимаю, почему важно говорить об эллипсах, я все еще неправильно понимаю вопрос? Аффинное преобразование отображает произвольную конфигурацию точек в новое местоположение. Это могут быть круги, треугольники, каракули, что угодно. Я предполагаю, что вы знаете преобразования [A] и [B], это правда? - person Hammer; 09.10.2012
comment
Да, это правда. Моя идея состояла в том, чтобы использовать это аффинное преобразование между двумя патчами, чтобы преобразовать один патч в другой. Это правильное рассуждение? Если да, то как я могу этого добиться? Спасибо за ответы. - person stckjp; 09.10.2012
comment
да, вы можете использовать аффинное преобразование для деформации патча, посмотрите cv :: warpAffine - person Hammer; 09.10.2012
comment
Спасибо, решение не было таким сложным, я думаю - person stckjp; 10.10.2012