Який алгоритм можна використовувати для імітації боке?


12

Я намагаюся написати сценарій, який проходить через кожен піксель на фотографії і застосовує боке до зображення в цілому.

Я створив сценарій на основі цього посилання , однак, здається, це зламався.

У мене є три вхідні зображення: чорно-біла карта глибини, фотографія та зображення "кисті" боке (яке на даний момент є шестикутником). На кожен піксель фотографії я штампую пензлик із боке, щоб він був зосереджений на пікселі та кольорі пікселя.

Це виглядає ... гаразд на крихітних кистях боке, але як тільки я збільшую розмір кисті "Боке", це все виглядає як гауссова розмиття. Ось малюнок часу, розмитого моїм алгоритмом:

введіть тут опис зображення

Не забудьте темні краї, я можу це виправити.

Ви можете напевно сказати, що він відрізняється від гаусса, але це ще далеко від того, що можна було б поважно назвати боке, з чіткими краями:

введіть тут опис зображення

Я розумію, чому мій алгоритм робить те, що робить ... як я можу точніше моделювати боке?



@Якщо я розумію відмінності, і що Боке, як правило, викликається лінзою, а Гаусс - післяобробкою, але я хочу імітувати Боке.
Суб’єкт

@Entity: Як шукати зразкові зображення з точною картою глибини? Ваш точний? Я хотів би спробувати це сам (після фіналу). Можливо, я придумаю відповідь через пару тижнів. Якщо ваше є загальнодоступним, чи можу я мати на нього посилання?
Martijn Courteaux

@MartijnCourteaux Для мого початкового тестування я просто використовую плоску карту глибини, щоб все було розмито. Щодо простої геометрії (наприклад, чашка на столі), я думаю, було б досить просто зробити гарну карту глибини. Для більш складних зображень вам, напевно, потрібна реальна карта глибини. Це можна обчислити з двох зображень або навіть лише з одного вашого зображення .
Суб’єкт

Відповіді:


20

Я думаю, що головна проблема полягає в динамічному діапазоні, ваш алгоритм, ймовірно, правильний, але ви працюєте над неправильним типом даних.

Точкове джерело світла, яке в іншому випадку відсікається і перетворюється чисто білим, поширюється на більшу площу розфокусованою лінзою, так що він утворює диск, який не такий яскравий і, отже, не затискається.

Ось чому ви отримуєте ці приємні кружечки у своєму справжньому боке-образі. Якщо ви зафіксуєте сигнал (зробивши його менш яскравим, ніж це було б інакше), а потім розкладете його за допомогою симуляції боке, ви отримаєте тьмяне коло (або шестикутник, чи будь-що інше), яке не виділяється і, таким чином, не виглядає реалістичним.

Що у вас є в реальному ланцюжку зображень:

bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression

Що ти робиш, так і є

sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation

Ви не отримаєте правильний результат, оскільки не працюєте з лінійними даними.

Що ви можете зробити, це спробувати лінеаризувати дані, замінити будь-який динамічний діапазон, який був втрачений на відсікання, виконати симуляцію боке, а потім повторити нелінійні операції!

Ось приклад. Я почав із зображення HDR, яке було тоналізоване, даючи дуже нелінійний результат. Це найгірший тип зображення, з яким можна спробувати імітувати боке!

Виконуючи стандартну операцію згортання для імітації боке (використовуючи інструмент розмивання об'єктива фотошопу), ви отримуєте цей результат, який дуже схожий на те, що ви отримуєте:

Для кращого результату я застосував крайню криву, щоб спробувати повернути зображення приблизно таким, яким воно було б до тоналізації, де яскраві виділення набагато яскравіші, ніж решта зображення. Я зробив це за допомогою інструменту рівнів, просунувши центральний вхід вправо, від 1,0 до приблизно 0,2). Потім я застосував інструмент розмивання лінз, як і раніше. Нарешті я застосував крайню криву у зворотному напрямку до першої кривої. Результат, хоча довгий шлях від ідеального, набагато більше нагадує справжній боке об'єктива:

 

Якщо ви робите це в коді, спробуйте зрізати кожне значення, потім застосуйте свою схему моделювання боке, а потім візьміть корінь куба кожного значення. Ви повинні побачити покращення. Це може зайняти певне налаштування.

tl; dr, навіть якщо ви реалізували досконалу математичну модель боке, вона повинна бути застосована до відсічених лінійних даних. Якщо застосувати ті ж обчислення до сильно змінених даних (навіть стандарт у JPEG камери сильно модифікований з математичної точки зору), ви отримаєте зовсім інший результат.


12

Перш за все, в оптиці додається тільки світло, а темрява - ні. Переконайтесь, що алгоритм не виводить темні пікселі назовні у вихідне місце. Отримані пікселі повинні швидше нагадувати максимум пікселів поблизу джерела, ніж середні. Або, якщо бути точнішим, ви б підсумували логарифми впливу на вихідні пікселі.

Іншою можливою причиною, чому ваші краї можуть бути не гострими, буде, якщо краї вашої маски не гострі. Анімація на сторінці, яку ви вказали як посилання, може бути неправильно зрозуміла, так що в масці оригінальний піксель яскравий, а інші поступово темніші. Це також перекладається на каламутні краї в обчисленому боке. У фотографії діафрагми мають певні краї, а не поступові. Тож насправді більшість пікселів у масці мають бути однакової яскравості, і лише краї (де менше пікселя має бути кольоровим для плавної лінії) можуть мати деякий відтінок сірого.

Ви також згадуєте наявність карти глибини, але жодного слова щодо її використання . Розмір маски боке повинен співвідноситися з глибиною пікселя та різницею глибини фокусної площини - чим далі піксель буде від фокусної площини (в будь-якому напрямку), тим більша повинна бути його маска. У фокусній площині розмір маски повинен бути 1 × 1 пікселя.


За умови, що всі операції є добавкою, ви не отримаєте проблему розтікання темних областей. Це правда, що вам потрібна гостра маска, щоб отримати гострі кола, але головна проблема полягає в тому, що його операція Боке застосовується до нелінійних даних.
Метт Грум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.