Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
20 / 20 / 3
Регистрация: 07.02.2014
Сообщений: 233
1

Сглаживание при дисторсии изображения

05.09.2014, 16:30. Просмотров 1064. Ответов 9
Метки нет (Все метки)


Пытаюсь написать алгоритм деформации изображения типа бочка/подушка, но никак не могу придумать как получить сглаженный результат. Сейчас программа считает новые координаты для каждого пикселя, округляет их и рисует новый пиксель тем же цветом, что и в оригинале. Причём может получиться так, что один и тот же пиксель в итоговом изображении будет перерисовываться несколько раз (при "бочке"), а может не отрисоваться вообще (при "подушке").
Кроме того, мне не нравится сама формула дисторсии из википедии: https://ru.wikipedia.org/wiki/... 0%F1%E8%FF Там для изображений разных размеров нужно подбирать разные значения F3 чтобы получить одинаковые результаты.
0
Миниатюры
Сглаживание при дисторсии изображения  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2014, 16:30
Ответы с готовыми решениями:

Сглаживание изображения
Доброго времени суток! Я пишу часы, нужно написать сглаживание картинки. Пробовал брать каждый...

Сглаживание изображения
Ребята, есть проблема, не знаю, как её решить уже долгое время. Разберём на картинке, что во...

сглаживание изображения
Помогите доделать сглаживание изображения с помощью маски 3*3 int Lowpass(BYTE Image, int x, int...

Сглаживание изображения (tbitmap)
Можно воспользоваться библиотекой GDI+

__________________
Помогаю в написании курсовых работ и дипломов здесь.
9
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
05.09.2014, 17:34 2
Уже второй хороший вопрос. Только проще и лучше говорить "деформация", подстрочный перевод distortion звучит совсем неважно

В общем случае деформация - нелинейное и необратимое преобразование. Но в данном конкретном случае оно обратимо, поэтому лучше сканировать итоговую картинку пиксель за пикселем. Получив координаты на исходной, не округляем а осредняем. Напр получили x = 3.2, y = 4.7. Считаем что цвет находится в центре пыкселя (ей), тогда 4 ближайшие

x = 3.5, y = 4.5, color(3, 4)
x = 2.5, y = 4.5, color(2, 4)
x = 3.5, y = 5.5, color(3, 5)
x = 2.5, y = 5.5, color(2, 5)

Ну и парим bilinear - разберетесь
1
20 / 20 / 3
Регистрация: 07.02.2014
Сообщений: 233
06.09.2014, 10:37  [ТС] 3
Цитата Сообщение от Igor3D Посмотреть сообщение
Но в данном конкретном случае оно обратимо, поэтому лучше сканировать итоговую картинку пиксель за пикселем.
У меня была точно такая же мысль сначала, но в формуле (в которой только один параметр F) помимо координат точки на оригинале используется расстояние от этой точки до начала координат. Стыдно признаться, но я не смог вывести формулу обратного преобразования.

Цитата Сообщение от Igor3D Посмотреть сообщение
Только проще и лучше говорить "деформация"
Согласен, но я думал под дисторсией понимается именно такое как здесь искажение изображения.

Добавлено через 14 часов 33 минуты
Цитата Сообщение от x_Alex_x Посмотреть сообщение
я не смог вывести формулу обратного преобразования
[прозрение]Там бесконечное количество решений.[/прозрение]
Может другая формула есть?
0
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
06.09.2014, 12:44 4
Цитата Сообщение от x_Alex_x Посмотреть сообщение
[прозрение]Там бесконечное количество решений.[/прозрение]
Может другая формула есть?
Выведем эту формулу сами "по чертежу". Исходные данные

w - ширина имеджа
h - высота
k - коэффициент растяжения/сжатия от 0 до 1

Надо найти "текущий" коэффициент k2 для текущей точки (x, y). Найдем синус и косинус

C++
1
2
3
4
5
6
float x0 = x - w/2;
float y0 = x - h/2;
float len = sqrt(x0 * x0 + y0 * y0);
len = max(len, 1.0e-5);
x0 /= len;
y0 /= len;
Для "бочки" эффект макс по диагонали и мин по осям

k2 = max(fabs(x0), fabs(y0)); // этот k2 сожмет квадрат в круг
k2 = 1 * (1 - k) + k2 * k; // взвешивание

Т.е при общем k = 0 изображение остается тем же, при k = 1 жмем максимально (круг/эллипс)
Тогда точка на исходном изображении

x_src = w/2 + x * k2;
y_src = h/2 + y * k2;
1
20 / 20 / 3
Регистрация: 07.02.2014
Сообщений: 233
06.09.2014, 13:04  [ТС] 5
Igor3D, большое спасибо! Сразу не очень понятно как это работает, но как разберусь - покажу что получилось)
0
20 / 20 / 3
Регистрация: 07.02.2014
Сообщений: 233
17.09.2014, 21:17  [ТС] 6
Этот код у меня отказывался работать( Но я нашёл хорошую статью с рабочим кодом: http://www.helviojunior.com.br... istortion/
0
20 / 20 / 3
Регистрация: 07.02.2014
Сообщений: 233
18.09.2014, 16:50  [ТС] 7
Всё равно мне не нравится результат Становятся видны "ступеньки" из-за резкого перепада цветов без сглаживания.
Для сравнения привожу результаты работы моей программы и ФШ:
0
Миниатюры
Сглаживание при дисторсии изображения  
1069 / 980 / 145
Регистрация: 19.02.2010
Сообщений: 3,016
21.09.2014, 22:12 8
Так для сглаживания, наверно, надо что-то навроде алгоритма Флойда-Стейнберга (т.е. dithering). Фотожоп, похоже, его и использует - ФС переносит "погрешность" на пиксел вправа и на смежные пикселы в строке ниже, и на фотожопной картинке центр бочки сильнее размазан именно снизу.

Была бы картинка в жипеге - я бы подумал на жипеговские искажения, но пнг же при сжатии никаких искажений не вносит. А раз так - то особенности размазни есть особенности применяемого алгоритма, и нужно попытаться по этим особенностям идентифицировать алгоритм. Вот и мелькнула мыслЯ про дизеринг.
1
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
23.09.2014, 11:55 9
Цитата Сообщение от x_Alex_x Посмотреть сообщение
Этот код у меня отказывался работать( Но я нашёл хорошую статью с рабочим кодом: http://www.helviojunior.com.br... istortion/
Обычно такое списывание прикрывается словами "зачем изобретать велосипед"
Цитата Сообщение от x_Alex_x Посмотреть сообщение
Всё равно мне не нравится результат
Ну так копируя чужое решение - Вы копируете и его минусы. Тут разобраться/осмыслить - полчаса максимум
0
20 / 20 / 3
Регистрация: 07.02.2014
Сообщений: 233
24.09.2014, 23:50  [ТС] 10
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
и на фотожопной картинке центр бочки сильнее размазан именно снизу
Это из-за того, что я катринку от руки рисовал и полоса немного выше центра получилась. А так как самая сильная деформация происходит в центре, то там и размазанность больше.
Цитата Сообщение от Igor3D Посмотреть сообщение
такое списывание прикрывается словами "зачем изобретать велосипед"
Вы же не критикуето то, что я списал алгоритм? Я считаю, что лучше воспользоваться готовым и проверенным методом, чем придумывать что-то своё.
Цитата Сообщение от Igor3D Посмотреть сообщение
Тут разобраться/осмыслить - полчаса максимум
Решение действительно оказалось простым - так как для любой точки итогового изображения можно вычислить её координаты на исходном изображении, а, следовательно, и ближайшие к ним пиксели, то для сглаживания хорошо подходит линейная интерполяция.
Результат мне очень нравится, только нужно ещё доделать обработку краёв картинки.

Ещё раз спасибо всем за помощь))
0
Миниатюры
Сглаживание при дисторсии изображения  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2014, 23:50

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Сглаживание трансформированного изображения
Привет форумчане! Написал простенькую программу вращающая изображение, но при вращение,...

Сглаживание,размытие изображения
Подскажите,где можно посмотреть работу с изображениями?В частности мне нужно Гауссово сглаживание...

Сглаживание при рисовании кривых
Ф-я DrawCurve(pen,curvePoints) строит кривую по точкам. Интерполируя. Подскажите плз, как отменить...

Сглаживание в играх при разрешении в 4К
Всем привет. Наслышан, что смысла нет ставить сглаживания в играх при 4К расширение, мол, не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.