Войти
ПрограммированиеФорумГрафика

Выделение карт материала из фото (гуру матана/цифрового фото приветствуются)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 4 Следующая »
#0
0:20, 28 авг. 2016

Йо, народ.
Неделю назад решил вдруг заняться вопросом выделения карт материалов из реальных изображений.
В первую очередь интересовали (в терминологии могу путаться, она, как мне кажется, постоянно меняется какими-то хипстерами ради эпичного звучания):
1. Diffuse/Albedo - чистый цвет поверхности, без бликов/затенения (вообще говоря любого влияния света)
2. Normal - направление нормали
3. Height/Displacement - относительная высота
4. Specular/Gloss - какую часть света материал рассеивает, а какую отражает (включая цвет отраженного света)
6. Occlusion/Cavity? - степень затенения поверхности (насколько рассеиваемая поверхностью часть света чувствительна к излучению)
5. Roughness - шероховатость поверхности (насколько сильно размывается отраженная часть света)

Само собой, хотелось все как можно реалистичнее, без фейковой генерации (типа CrazyBump). Поразмышлял и пришел к выводу, что если использовать серию правильно сделанных фото - можно восстановить нормаль, по изменению интенсивности света в каждой точке. План был таков:
0. Изначально изолируем сцену от любого стороннего света (имею ввиду вообще полностью)
1. С помощью бубна и плясок освещаем сцену со всех сторон. На выходе получаем diffuse (последующую интенсивность делим на нее, дабы плясать относительно этой точки отсчета)
2. Делаем 4 снимка сцены, с участием единственного точечного источника света. Позиция источника на последних трех должна быть равноудаленна от позиции на первом фото + 3 вектора, построенные на этих трех точках должны быть взаимно-перпендикулярны и иметь равную длинну:
  1. изображение для точки отсчета - origin
  2. изображение со сдвигом источника по оси X - offsetX
  3. изображение со сдвигом источника по оси Y - offsetY
  4. изображение со сдвигом источника по оси Z - offsetZ
3. Теперь у нас на руках имеется информация о:
  1. Интенсивности света в каждой точке - i1, i2, i3 (intensity)
  2. Вектор на источник света в каждой точке - l1, l2, l3 (light)
  3. Вектор на наблюдателя в каждой точке - v1, v2, v3 (view)
Теперь рассмотрим, как все это устроенно для случая полного рассеивания света (никаких отражений/бликов):
Интенсивность света зависит от косинуса угла падения света на поверхность, который в случае единичных векторов есть обычным dot product:
i1 = (l1, n) = l1x * nx + l1y * ny + l1z * nz
i2 = (l2, n) = l2x * nx + l2y * ny + l2z * nz
i3 = (l3, n) = l3x * nx + l3y * ny + l3z * nz
Оказывается, все это можно представить в виде умножения матрицы на вектор:
i = (i1, i2, i3)
L = (l1, l2, l3)
i = Ln
Обычная система уравнений. Решается не менее обычным Гауссом (или что там еще придет нам в голову).
Отсюда можно найти нашу нормаль - n, что и было проверено экспериментально:

+ рассеянное освещение

Обозначим рассеянную часть света через d (diffuse):
i = d = Ln
Тем не менее, все это перестает нормально работать когда часть сцены начинает часть света отражать:
+ рассеянное+отраженное освещение

И это, пожалуй, нормально. Отраженный свет - s (specular) зависит уже не только от нормали, но и от вектора отражения - v:
s1 = (l1, r)
s2 = (l2, r)
s3 = (l3, r)
s = Lr
Тем не менее, этот отраженный вектор зависит от нормали и вектора взгляда - v:
r = 2(n, v)n - v
Итого, у нас теперь джве компоненты, рассеянная и отраженная:
i = d + s
d = Ln
s = Lr = L(2(n, v) - v) = 2L(n, v) - Lv
i = Ln + 2L(n, v) - Lv = L(n + 2(n, v) - v) = Lq
Часть, которую мы можем посчитать из изображения мы обозначили q:
q = n + 2(n, v) - v
n + 2(n, v) = q + v
И вот как уже в этом случае найти n - я хз
Потому у меня возникла мысль убрать/не допустить появления на фото отраженной составляющей - s, с чем и пришел сюда.
Тем не менее, если есть другие идеи - рад буду услышать. Спасибо.

+ Старый 0-пост
#1
1:06, 28 авг. 2016

The Player
> Слышал о светофильтрах. Ими действительно можно сдвигать спектр и
> фотографировать в других диапазонах?

Фильты фильтруют (убирают какую-то часть спектра), а не сдвигают.

Для сдвига нужны другие преобразующие приборы.

#2
1:11, 28 авг. 2016

The Player
> Можно ли, с помощью бубнов и жертвоприношений увеличить точность обычных
> фотокамер?

можно по аналогии с фасеточным зрением насекомых.
С помощью специального самонаводящегося штатива фоткать узкими участками и потом склеивать в одну картинку.

#3
1:48, 28 авг. 2016

1.Что имеете ввиду, линейность передачи яркости? Или цветовая температура? Зависит в первую очередь от матрицы, особенно на самых малых и самых больших яркостях. Снизу ограничено тепловыми шумами матрицы, сверху ее термическим повреждением. Остальное можно программно выправить. 2.Точность увеличить за счет размеров матрицы и раздельной обработки каждого диапазона яркости. 3.Фильтры это сито которое задерживает свет разной длины волны. Допустим ультрафиолетовый или желтый фильтр задерживает высокочастотный спектр который глазом не виден но в условиях высокогорья моря забивает по интенсивности видимый спектр дает ошибки экспозиции жжет матрицу. Небо становится высветленным без ярких облаков. При съемке на пленку с качественной оптикой без фильтров не обойтись. Сдвигать спектр нельзя. Можно оставить его часть которую фильтры не задержат. Есть фильтры вплоть до инфракрасного теплового диапазона. Т.е. в комнате будет виден только забытый утюг. 4.Свойства материалов не меняются но в разных диапазонах видны по разному. Тенденция к увеличению контраста вниз по диапазону в сторону красного. Без специального покрытия все отражает. С покрытием тоже, но по разному в разных направлениях с явным минимумом в одном из них.  Стоит конкретизировать задачу.

#4
2:46, 28 авг. 2016

koman
> Что имеете ввиду, линейность передачи яркости?
Точность. 8-битных значений мало, нужно ну хотя бы 16, идеально - все 32.
> Стоит конкретизировать задачу.
Нужно выделить из фото отраженный/рассеянный свет. Фото не готовое, сцену, свет и процесс съемки можно настроить. Важно не убрать блики с фотографии, а именно отловить отраженную часть света (ну или наоборот, без разницы).
Как именно - в принципе не важно. Можно колдовать с источниками света (освещение сцены искусственное). Т.е. можно использовать фильтры на объективе, либо как-то хитро фильтровать свет до попадания на сцену, если необходимо. Спектр тоже не важен, т.е. если получим картинку рассеянного света в инфракрасном диапазоне - все ОК.
Главное - минимум исключений (особенно металлы). Читал о поляризующих светофильтрах, но т.к. металлы не поляризуют свет - они там бесполезны.

#5
3:05, 28 авг. 2016

The Player
> Важно не убрать блики с фотографии, а именно отловить отраженную часть света

что это за ересь?

Всё что ты видешь на фотографии, кроме солнца и лампочек - это и есть отражённый свет.

#6
3:08, 28 авг. 2016

Миха Маус
Да ну. Разве это не смесь рассеянного и отраженного света?

#7
3:10, 28 авг. 2016

The Player
> Разве это не смесь рассеянного и отраженного света?

Рассеянный - это тоже отражённый. Просто отражённый во все стороны, а не как от зеркала.

Хотя, вообще, мне не нравится слово "рассеянный"... это что ты имеешь в виду такое?

Я понял так, что ты под этим имеешь в виду матовую поверхность...

Или ты под рассеиванием что-то другое имеешь в виду? Туман чтоли? :)

#8
3:15, 28 авг. 2016

Миха Маус
> Рассеянный - это тоже отражённый. Просто отражённый во все стороны, а не как от зеркала
Окей, да, я все это понимаю. Тем не менее задача как раз в этом и состоит - выделить одну из компонент.

> Хотя, вообще, мне не нравится слово "рассеянный"... это что ты имеешь в виду такое?
Имеются ввиду те компоненты света, которые используются в графике: рассеянный/отраженный = diffuse/specular
Соответственно:
1. Рассеянный свет излучается поверхностью во все стороны и в принципе со всех направлений будет выглядеть одинаковым
2. Отраженный излучается под тем же углом, что и приходит от источника света, а потому и будем изменятся при смене позиции наблюдения.

#9
3:21, 28 авг. 2016

The Player
> Имеются ввиду те компоненты света, которые используются в графике:
> рассеянный/отраженный = diffuse/specular
> Соответственно:
> 1. Рассеянный свет излучается поверхностью во все стороны и в принципе со всех
> направлений будет выглядеть одинаковым
> 2. Отраженный излучается под тем же углом, что и приходит от источника света, а
> потому и будем изменятся при смене позиции наблюдения.
КО намекает что для получения этой информации нужен видео поток, а не фотка

#10
3:27, 28 авг. 2016

SuperInoy
Окей, как мне с помощью видеопотока выделить кадр, на котором будет присутствовать только рассеянный свет?
Если на то пошло - фоток может быть несколько.

#11
3:33, 28 авг. 2016

Тебе нужен альбедо?

#12
3:40, 28 авг. 2016

The Player

Если нужно очень приблизительно (ООООЧЕНЬ приблизительно),

то можешь сначала заклеить матовой чёрной плёнкой все матовые объекты и сфоткать.

А потом заклеить все глянцевые объекты и сфоткать =))))

Но это очень грубо. Не знаю, какая тут погрешность будет.... но думаю немаленькая =)

Даже интересно стало такой опыт поставить, чтобы погрешность определить =)


Потому что ты должен вот что понять:

Даже свет, отражённый от одной единственной (каждой) матовой поверхности, попадает на все другие матовые и глянцевые поверхности и от них также отражается на всё.

Короче, всё отражается друг от друга тысячи раз =)

#13
3:40, 28 авг. 2016

druggon
Вот это уже ближе, но все ровно не то.
Мне нужно изображение сцены, освещенное только рассеянным светом, без отраженного.

#14
3:45, 28 авг. 2016

The Player
> Мне нужно изображение сцены, освещенное только рассеянным светом, без
> отраженного.

а как быть со светом, который сначала отразился от глянцевых поверхностей и уж только потом стал рассеянным, попав на матовые поверхности?

Если такой свет тебе не нужен, то всё просто:

заклей матовой чёрной плёнкой (от которой ничего не рассеивается и не отражается, а всё поглащается) все глянцевые объекты и сфоткай.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.