Доброго времени суток.
Есть задача коррекции отсканированного изображения (например карты). Суть ее сводится к преобразованию четырехугольника (в общем случае с углами не равными 90гр. и неодинаковыми сторонами,например трапеция) к квадрату. Помогут ли афинные преобразования (тогда можно было бы задействовать GDI+)? Или нужно все делать руками по какому-нить хитрому алгоритму (какому)?
Может кто решал подобную задачу. Спасибо
Здравствуйте, zinabnm, Вы писали:
Z>Доброго времени суток. Z>Есть задача коррекции отсканированного изображения (например карты). Суть ее сводится к преобразованию четырехугольника (в общем случае с углами не равными 90гр. и неодинаковыми сторонами,например трапеция) к квадрату. Помогут ли афинные преобразования (тогда можно было бы задействовать GDI+)? Или нужно все делать руками по какому-нить хитрому алгоритму (какому)? Z>Может кто решал подобную задачу. Спасибо
Да в данном случае можно воспользоваться афинными преобразованиями, но — в пространстве. Смысл таков — трапеция получается при рассмотрении прямоугольника с определённого ракурса. Соотвественно нужно получить матрицу обратного преобразования и прогнать точки через неё. Ондако это будет работать хорошо только при действительно линейном искажении.
В общем случае (для произвольного искажения), определяется вектор-функция искажения D( x, y ), которая показывает смещение точки в зависимости от её местоположения на исходной картинке ( x, y — координаты на исходной картинке), затем решается обратная задача: нахождение исходных координат точки, если известны её координаты на искажённом изображении.
В случае линейного (трапеция, ромб) искажения такая функция тоже будет линейной и задача может быть решена аналитически.
Здравствуйте, AndreyFedotov,
спасибо за отклик!
Теперь по существу. Насколько я понимаю(а понимаю скорее всего немного, если говорить о ромбе, то хватит 2D, изменив масштаб по одной из осей. В случае параллелограмма 3D, скорее всего уже пригодится. А в случае трапеции, кажется без проекции (притом центральной) уже не обойтись. У меня напрашивается печальный вывод, что GDI+, напрмер, для решения такой задачи уже не хватит, учитывая размерность его матриц. А вообще хотелось бы его задействовать.
Здравствуйте, zinabnm, Вы писали:
Z>Здравствуйте, AndreyFedotov, Z>спасибо за отклик! Z>Теперь по существу. Насколько я понимаю(а понимаю скорее всего немного, если говорить о ромбе, то хватит 2D, изменив масштаб по одной из осей. В случае параллелограмма 3D, скорее всего уже пригодится. А в случае трапеции, кажется без проекции (притом центральной) уже не обойтись. У меня напрашивается печальный вывод, что GDI+, напрмер, для решения такой задачи уже не хватит, учитывая размерность его матриц. А вообще хотелось бы его задействовать.
GDI+ действительно не хватило бы, если бы речь шла о использовании матричных операций в GDI+. (То есть сдвиги, повороты, отражения изображения). Но его вполне хватит, если делать собственный пересчёт координат. Более того собственное преобразование даже желательно делать, так как в случае трапеции, например, получится различная плотность цвета в разных частях изображения. Тем более, что сдлать преобразование довольно просто.
Здравствуйте, zinabnm, Вы писали:
Z>Доброго времени суток. Z>Есть задача коррекции отсканированного изображения (например карты). Суть ее сводится к преобразованию четырехугольника (в общем случае с углами не равными 90гр. и неодинаковыми сторонами,например трапеция) к квадрату. Помогут ли афинные преобразования (тогда можно было бы задействовать GDI+)? Или нужно все делать руками по какому-нить хитрому алгоритму (какому)? Z>Может кто решал подобную задачу. Спасибо
Решал подобную задачу- решается просто- билинейной интерполяцией.
Например тебе из исходного 4-х угольника надо получить квадрат NxN точек. Т.о. тебе нужно вычислить цвет NxN точек, цвет вычисляется просто- представь, что ты на исходный четырехугольник наложил сетку NxN. Найди координаты узлов сетки и посчитай взвешенное (среднее) значение в этой точке в зависимости от рядом стоящих точек. Думаю рисунок поможет. Если не понятно- ищи билинейную интерполяцию.
U>Решал подобную задачу- решается просто- билинейной интерполяцией. U>Например тебе из исходного 4-х угольника надо получить квадрат NxN точек. Т.о. тебе нужно вычислить цвет NxN точек, цвет вычисляется просто- представь, что ты на исходный четырехугольник наложил сетку NxN. Найди координаты узлов сетки и посчитай взвешенное (среднее) значение в этой точке в зависимости от рядом стоящих точек. Думаю рисунок поможет. Если не понятно- ищи билинейную интерполяцию.
Спасибо, интересная идея. Сейчас поищу подробности
Здравствуйте, zinabnm, Вы писали:
Z>Доброго времени суток. Z>Есть задача коррекции отсканированного изображения (например карты). Суть ее сводится к преобразованию четырехугольника (в общем случае с углами не равными 90гр. и неодинаковыми сторонами,например трапеция) к квадрату. Помогут ли афинные преобразования (тогда можно было бы задействовать GDI+)? Или нужно все делать руками по какому-нить хитрому алгоритму (какому)? Z>Может кто решал подобную задачу. Спасибо
Приветствую, огромное спасибо за материал! Очень помог. Там есть ссылочки на другие главы. Если имеются в наличии (остальные главы\ссылки на них) поделись, пожалуйста.
Андрей
Здравствуйте, zinabnm, Вы писали:
Z>Приветствую, огромное спасибо за материал! Очень помог. Там есть ссылочки на другие главы. Если имеются в наличии (остальные главы\ссылки на них) поделись, пожалуйста. Z>Андрей