Я работаю над искажением изображения. Преобразованная версия реальных координат изображения — это x и y, а полярные координаты преобразованного изображения — это r и theta.
(цилиндрический анаморфоз). У меня есть функции преобразования. Но я запутался в некоторых вещах. Я получаю полярные координаты из функций преобразования, которые можно легко преобразовать в декартову. Но как нарисовать это преобразованное изображение? так как новый размер будет отличаться от старого размера изображения.
РЕДАКТИРОВАТЬ : У меня есть изображение, как показано в цилиндре. У меня есть функция преобразования, чтобы преобразовать его в изображение иллюзии, как показано на рисунке. Поскольку размер этого изображения отличается от исходного изображения, как мне обеспечить преобразование всех моих точек в основном изображении. Кроме того, координаты этих точек в преобразованном изображении являются полярными. Могу ли я использовать openCV для формирования нового изображения, используя преобразованные полярные координаты?
REF: http://www.physics.uoguelph.ca/phyjlh/morph/Anamorph.pdf
У вас есть две проблемы здесь. В моем понимании, большая проблема возникает потому, что вы конвертируете дискретные интегральные координаты в координаты с плавающей точкой. Другая проблема заключается в том, что размер получаемого изображения больше или меньше размера исходного изображения. Кроме того, результирующее изображение не обязательно должно быть прямоугольным, поэтому оно должно быть либо обрезано, либо заполнено черными пикселями по углам.
В соответствии с http://opencv.willowgarage.com/documentation/geometric_image_transformations.html нет процедуры радиального преобразования.
I'd suggest you do the following:
- Увеличить исходное изображение до ширины * 2, высоты * 2. Установите новое изображение на черный. (cvResize, cvZero)
- Запустите каждый пиксель исходного изображения. Найти новые координаты пикселя. Добавьте 1/9 его стоимости ко всем 8 соседям нового
координаты, и сами новые координаты. (CV_IMAGE_ELEM (…) + =
1,0 / 9 * ….)- Уменьшить масштаб нового изображения до первоначальной ширины, высоты.
- В зависимости от результата вы можете использовать процедуру повышения резкости.
Если вы хотите сохранить некоторые пиксели, выходящие за границы, это другой вопрос. В основном вы хотите найти минимальные и максимальные координаты, которые вы получаете, поэтому, например, ваше исходное изображение имеет Min, Max = [0,1024] и ваш новый MinNew, MaxNew = [-200,1200], вы делаете функцию
normalize(int &convertedx,int &convertedy)
{
convertedx = MinNewX + (MaxNewX-MinNewX)/(MaxX-MinX) * convertedx;
convertedy = ...;
}
Других решений пока нет …