Русский
Русский
English
Статистика
Реклама

Rgb

Интересная форма

06.11.2020 14:12:14 | Автор: admin
Хабр, привет. Эта статья не претендует на большую серьезность, я просто хочу поделиться новой формой, которую я открыл. Это такой круг, цвет точек которого равен сумме квадратов координат заданной точки. Другими словами pixel_color=(pixel_x^2+pixelY^2).toString(16).


image

Эта фигура сама собой очень интересна, представляет собой что-то вроде четкого интерферентного фрактала или даже модели вселенной, описывающей микро и макромир. Несмотря на то, что ее легко получить, я нигде не нашел ничего похожего на нее. Возможно я первооткрыватель. В таком случае я хотел бы назвать ее Тетраскоп (tetrascope). В приведенном примере я генерирую тетраскоп радиусом 1024px, максимальное что у меня получилось сгенерировать на своей машине это объект радиусом 4096px, картинка которого весит ~150 мегабайт.
Эта модель абсолют, под этим я понимаю, что ее физикоматематическая модель существует сама по себе, еще задолго до своего открытия и независмо от человека, как самодостаточная форма бытия.

PS: картинку рекомендую смотреть на компьютере в 100% масштабе так более понятно что она из себя представляет. В комментариях я предлагаю поэксперементировать с кодом, предложить свое описание и смысл картинки или ее название, и вообще как-нирбудь дополнить этот пост, возможно какой-то информацией.

$(document).ready(function(){
var R=1024; var D=2*R;
var rgb = function(c){
if(c.length<=6) return c+("0".repeat(6-c.length));
else return c.substring(0, 3)+c.substring(c.length-3);
}
$('body').append('');
var canvas = document.getElementById('C');
var ctx = canvas.getContext('2d');
ctx.fillStyle="#ffffff00";
ctx.fillRect(0, 0, 256, 256);
for(var x = 0;x<D;x++) {
for(var y = 0;y<D;y++) {
var X1 = R-x;
var Y1 = R-y;
var X2 = R+x;
var Y2 = R+y;
if (( x*x+y*y ) <= R*R ) {
ctx.fillStyle="#"+( rgb( (x*x+y*y).toString(16)) );
ctx.fillRect(X1, Y1, 1, 1);
ctx.fillRect(X1, Y2, 1, 1);
ctx.fillRect(X2, Y1, 1, 1);
ctx.fillRect(X2, Y2, 1, 1);
} } }
});
Подробнее..

Дефицит цветов в современных фильмах

26.10.2020 02:07:54 | Автор: admin

Настал небольшой отпуск и я решил посмотреть наконец несколько фильмов. В процессе просмотра меня посетило ощущение, что в современных фильмах что-то не так, что раньше трава была зеленее и тому подобное. Больше всего выделялось то, что на экране большую часть времени очень мало цветов (как правило, вообще два, оранжевый и голубовато-зелёный).

Well, enough said. Источник: https://gridfiti.com/visually-stunning-movies/Well, enough said. Источник: https://gridfiti.com/visually-stunning-movies/

Я в таких своих наблюдениях оказался совсем не одинок, вот, например, критическая статья о злоупотреблении этими вашими Голливудами оранжевым и голубовато-зелёным. Однако, одиночные кадры - это не серьёзно для доказательства. Тут нужен научный подход. Как астроном-любитель я знаю, что информацию о цвете чего-либо принято сравнивать в виде спектра.

Эмиссионный спектр бора. Источник: https://commons.wikimedia.org/wiki/File:Boronemissionspectrum.pngЭмиссионный спектр бора. Источник: https://commons.wikimedia.org/wiki/File:Boronemissionspectrum.png

Хочется получить такой вот примерно "спектр" для целого видео. Осталось придумать, как это сделать.

Идея

Упрощённо, видео есть последовательность изображений. Каждое изображение - массив RGB значений цветов пикселей. Можно заметить, что в спектре есть две оси: цвет (или длина волны) по горизонтали и уровень сигнала по вертикали. Значит, необходимо превратить трёхмерный (RGB) цвет в одномерный. И тут на помощь приходит цветовая модель HSL, где для цвета есть только одно измерение - Hue, в дополнение к Saturation и Lightness.

Теперь, для каждого пикселя видео и соответствующего ему значения "чистого цвета" (Hue) нужно определить вес чистого цвета на основе значений Saturation и Lightness. В случае с Saturation всё понятно и просто - вес должен быть пропорционален насыщенности цвета. С Lightness немножко сложнее: начения 0% и 100% будут соответствовать чёрному и белому цветам вне зависимости от значения Hue, поэтому максимальный вес (1) должен быть для значения Lightness = 50%, снижаясь "по краям" до 0, так как совсем светлые и совсем тёмные оттенки должны иметь меньший вес. Таким образом, можно вывести формулу уровня цветового сигнала:

W (S, L) = S * (0.52 - (0.5 - L)2) / 0.52

Это значение W (weight) будет численной мерой, показывающей, насколько данный цвет выглядит ярким и выраженным. Далее, для получения спектра достаточно сложить все полученные из пикселей веса (W). Стоит отдельно заметить то, что полученный "вес выразительности" цвета всё-таки субъективен, так как зависимость от яркости (L) может быть иной, например линейной. Или какой-нибудь ещё. Но я считаю свой вариант довольно честным.

Реализация

Осталось реализовать всё это в коде и я решил сделать это на Golang. К счастью, все необходимые биндинги для превращения видео в отдельные кадры, конвертации RGB в HSL и прочего уже доступны. Исходное видео конвертируется в кадры с разрешением 256х144, то есть ~37 килопикселей. Чтобы избежать слишком задумчивого переваривания при скармливании больших видеофайлов код может пропускать промежуточные кадры, чтобы не превысить лимит количества обрабатываемых кадров (хард код 2712 на данный момент). То есть любое видео будет ограничено более-менее равномерной выборкой из 100 миллионов пикселей. Для цветовой статистики вроде бы должно быть достаточно. Есть небольшая проблема, что не все промежуточные кадры одинаково полезны могут быть успешно сконвертированы. Судя по всему это происходит при попадании на не-ключевые кадры. Это может немного уменьшать выборку из-за ошибок.

Изначально это была консольная утилита, получающая на вход имя видеофайла и сохраняющая файл спектра в файл с тем же именем плюс разрешение ".svg". Позже я также добавил простейший web-cервис и форму для upload видео файла в газоанализатор для получения "спектра". Сервис раздеплоен временно-бесплатно в первом попавшемся облаке, так что желающие могут попробовать немножко поэкспериментировать: https://moviespectrum.azurewebsites.net/.

На размер загружаемого видеофайла стоит ограничение 128 Мб, поэтому рекомендуется использовать не самое лучшее разрешение, тем более что оно слабо влияет на цветовую статистику и видео всё равно конвертируется в кадры 256х144 перед обработкой.

В облаке сервис работает на минимальных ресурсах и никак не приспособлен для масштабирования, так что если он вдруг приляжет вследствие хабраэффекта или по какой другой причине, то вы всегда можете собрать его из безисходников и запустить локально, например в докере: https://github.com/akurilov/moviespectrum

Также сначала была идея прикрутить это всё к тытубу, чтобы пользователь мог просто кинуть ссылку на видео, однако из-за инцидента с youtube-dl я решил не рисковать и отпилить всю подобную функциональность. Даже вспомнилось Unix-заклинание "один инструмент = одна функция" в качестве оправдания. Так что теперь придётся сначала скачать видео, а потом уже скармливать его.

Результаты

Возьмём в качестве baseline пару олдскульных фильмов и посмотрим на их "спектры".

1991 - Терминатор 2:

1994 - Форрест Гамп:

Теперь возьмём фильмы посвежее и сравним:

1999 - Матрица aka 50 оттенков зелёного, если не считать фиолетового артефакта:

2003 - Властелин колец:

2005 - Город грехов. В качестве малоцветного baseline:

2007 - Трансформеры. Очень малоцветный фильм, не считая фиолетового артефакта:

2009 - Аватар:

2013 - Обливион:

2019 - Джокер. Всё почти в красном цвете, но есть немножно зеленовато-голубого.

Выводы вы можете сделать самостоятельно. На мой взгляд, есть тенденция к обеднению цветов со временем.

Подробнее..
Категории: Работа с видео , Rgb , Golang , Svg , Ffmpeg , Opensource , Movies , Hsl

ORM textures, а стоит ли оно того?

15.06.2020 00:20:27 | Автор: admin
Недавно я читала статью и увидела описание процесса создания интересной текстурной карты, о которой пойдет речь далее



Вступление


Что же такое ORM? Сокращенно это Occlusion, Roughness, Metallic необычное сочетание трех разных PBR карт запакованных в одной текстуре.

Пример создания такой текстуры я буду показывать в Substance Painter, но также ее можно делать и в Photoshop (для меня это более затратный по времени способ тогда, как Substance Painter делает ее автоматически, главное только правильно настроить конфигурацию). Для рендера я буду использовать Blender 2.8.

Проблема


Для настройки текстур на объекте, работая в Blender, как и в любом другом редакторе, очень часто приходится добавлять примерно пять основных текстурных карт (BaseColor, Normal, AO, Metallic, Roughness), а то и больше. Этот процесс занимает хоть и не большое, но все-таки драгоценное время художника. Поэтому в данной статье я и хочу разобрать такую тему, как объединение карт в ORM и выяснить, какое она дает преимущество перед традиционными текстурами и дает ли его вообще.

Разбор


Ambient Occlusion, Roughness, Metallic это три черно-белые (Grayscale) карты. Это значит, что их цвет лежит только в одном канале. Для справки, в текстурировании мы можем использовать текстуры, состоящие из 3-4 каналов (RGB, RGB+A).

Тогда зачем же хранить эти карты по отдельности, когда можно сделать небольшой архив-изображение, в трех каналах которого поместятся целых три черно-белые текстуры? В этом и есть преимущество ORM.



С теорией разобрались. Но перед тем как показывать настройку проектов в Substance Painter и Blender, я бы хотела привести немного измерений рендеринга одного и того же 3D объекта с использованием разных движков, попеременно подключая два разных материала (один с тремя отдельными картами, другой с использованием ORM).



Для рендеринга я использовала такие движки как Eevee, Cycles (CPU и GPU) и Octane Render (все настройки стандартные, sampling равен 128).

(Сразу хочу сказать, что в Octane я не профи, и, если вы заметите у меня неточности в настройке материалов, буду только рада, если вы на них укажите).



Теперь выбор остается за вами. Как видно результаты рендера очень близкие. Хочу напомнить, что эта статья написана в первую очередь лишь для того, что бы показать, как работать с ORM, а не про оценку времени рендеринга на разных движках.

Настройка текстур


Первоначально создадим свою конфигурацию в Substance Painter и добавим в нее три ячейки для текстур, первую и вторую RGB+A (три связанных канала и один несвязанный), а третью R+G+B (три несвязанных канала). Теперь переносим в ячейки уже имеющиеся карты. В итоге должна получиться такая картина



При экспорте я использовала добавление альфа канала и Dilation + Transparent для того, чтобы текстура запекалась только на месте UV шеллов и нигде больше. На рисунке видно какие в итоге получились карты.

Теперь разберемся с настройкой текстур в Blender. Думаю, что таким же образом можно настраивать ноды и в других редакторах, таких как Maya или Cinema4D.
(Сейчас будет совсем туториал, поэтому я уберу его из основного текста дабы не нагружать статью большим числом картинок).

Настройка
Итак начнем с обычной настройки материала в Blender.



В Eevee и Cycles ноды с картами подключаются к своим ячейкам на главной ноде (PrincipledBSDF), которая их комбинирует. Единственное, что может вызвать вопрос, это, что я делаю с Normal Map? Такими действиями я инвертирую зеленый канал, чтобы карта из типа DirectX стала OpenGL. Да, можно и сразу выгрузить в OpenGL, но мне нравится более универсальный вариант.

Во втором случае AO, Metallic и Roughness я заменяю на ORM и добавляю ноду Separate RGB, чтобы распаковать каналы и достать карты по отдельности. Далее по той же схеме подключаю их к главной ноде.



Теперь разберемся с Octane. Ноды в этом движке отличаются, но имеют похожий смысл.



Вроде ничего сложного, теперь с ORM.



В случае с ORM разделение каналов работает по другой схеме и не так просто, как в Eevee и Cycles. Добавляя RGB Spectrum Tex (красный, зеленый или синий) и ORM в Multiply Tex, я вытягиваю из ORM только один канал, в зависимости от цвета RGB Spectrum Tex. Cosine Mix Tex преобразует этот канал в оттенки серого и отправляет в главную ноду (Universal Material).


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



Это попарное сравнение всех рендеров мечей. Как видно Octane несколько отличается, так как имеет другие стандартные настройки, и настройки освещения в том числе. Но повторю еще раз, я не профессионал. На настройку материалов в Eevee и Cycles я потратила меньше времени, чем обычно, в Octane наоборот больше, так что использовать ORM или нет решать вам, а у меня всё.

Спасибо за то, что уделили время этой небольшой статье, надеюсь она была для вас полезной.

Буду рада критике и пожеланиям!
Подробнее..

Математика палитры почему не бывает красного структурного цвета

16.09.2020 10:17:24 | Автор: admin


Многие считают, что основными инструментами художника являются кисточка, мольберт и палитра. Однако это лишь средства, позволяющие использовать истинный инструмент цвет. Наш мир полон красок всех мастей, от огненно-красного до морозно-синего. Цвет предметов и окрас живых организмов является результатом ряда физических и/или химических процессов. Учитывая разнообразие цветов, порой сложно понять разницу в механизмах из происхождения. Ученые из Кембриджского университета решили выяснить, почему структурные цвета, зависящие от наноразмерной архитектуры поверхностей, а не от химических пигментов, не бывают красных оттенков, а лишь синих или реже зеленых. В чем секрет такого цветового ограничения и как именно удалось установить истину? Пролить свет на эти вопросы нам поможет доклад ученых. Поехали.

Основа исследования



Примеры структурных цветов в природе: А гибискус тройчатый (Hibiscus trionum); В жук тамамуси (Chrysochroa fulgidissima); С бабочка вида Morpho rhetenor; D комар обыкновенный (Culex pipiens); Е морская мышь (Aphrodita aculeata); F жук вида Pachyrhynchus argus; G бабочка вида Parides sesostris

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

У структурных цветов имеется множество преимуществ по сравнению с пигментными:

  • не обесцвечиваются, так как цветообразование определяется архитектурой, а не составом;
  • могут быть изготовлены из экологически чистых материалов;
  • достигают нетрадиционных цветовых эффектов, от яркого металлического до изотропного оптического отклика.


Изображение 1

Учитывая положительные свойства структурных цветов, было разработано множество методик по их воссозданию, а точнее методик создания иерархических структур или структур ближнего упорядочения с независимыми от угла цветами. Результатом таких разработок стало фотонное стекло (PG от photonic glass), которое имеет биологический эквивалент в виде оперения многих птиц (изображение выше).

Нюанс в том, что в природе структурные цвета бывают лишь синих оттенков. Красные и зеленые цвета, как правило, достигаются с помощью структур с дальним упорядочением или с использованием пигментации. Конечно, существуют техники, позволяющие создать искусственный структурный красный оттенок. Однако, как заявляют авторы сего труда, оптические свойства у материала такого цвета крайне плохи.

Возникает вопрос можно ли в принципе создать полноценный структурный красный цвет? Дабы ответить на этот вопрос, ученые решили использовать численный подход, который обеспечивает прямой доступ к спектру отражения произвольной структуры и позволяет исследовать промежуточные режимы рассеяния, то есть между однократным рассеянием и диффузионным поведением.

Результаты исследования


Для начала посредством численного алгоритма были созданы варианты фотонного стекла (прямое и инверсивное) с различными свойствами рассеивания и структурной корреляцией (структурным фактором*).
Структурный фактор* математическое описание того, как материал рассеивает падающее излучение.
Следом были проведены расчеты оптических свойств сгенерированных структур с использованием метода конечных разностей во временной области. Созданная модель была намеренно ограничена двумерным пространством, так как подобные структуры чаще всего встречаются в природе (изображение выше). Концентрация внимания на двумерной структуре также позволяет расширить спектр изучаемых параметров, при этом ограничивая вычислительные затраты. Тем не менее ученые уверены, что полученные результаты можно применить и для описания трехмерных структур.

Если поглощение отсутствует, то рассеяние в фотонном стекле возникает в результате взаимодействия между характеристиками индивидуальных частиц (размер, форма и показатель преломления) или за счет взаимодействия между свойствами группы частиц (доля заполнения и структурные корреляции).


Изображение 2

В случае прямых PG в отражении преобладают резонансы Ми*, определяемые свойствами рассеивателя (). Таким образом, отраженный цвет можно изменить на видимый, изменив размеры рассеивателя.
Резонанс Ми* увеличение интенсивности рассеянного на сферической частице излучения для определенных длин волн, сравнимых с размерами частицы (назван в честь Густава Ми, 1868-1957).
Однако по мере увеличения размера частиц пик резонанса Ми смещается в красную сторону, и второй пик появляется в синей части спектра, что соответствует резонансной моде более высокого порядка. А вот в рассеянии света в инверсивных PG преобладают структурные корреляции (2B). Пик отражения, положение которого хорошо соответствует предсказаниям закона Брэгга*, более выражен, чем в прямых структурах.
Дифракция Брэгга* явление сильного рассеяния волн на периодической решетке рассеивателей при определенных углах падения и длинах волн.

Формула закона Брэгга: n = 2d sin , где d период решетки; угол падения волны; длина волны излучения; n число волн.
Появление отдельного пика в видимом спектре демонстрирует, что использование инверсных PG является эффективной стратегией для минимизации форм-фактора в общем оптическом отклике системы в пользу структурных вкладов.


Зависимость изотропного структурного цвета от показателя преломления для прямого (сверху) и инверсивного (снизу) PG соответственно.

Изменение показателя преломления влияет на взаимосвязь между вкладами формы и структуры. В системах с высоким показателем преломления преобладают резонансы форм-фактора, которые не позволяют им достичь хорошей чистоты цвета в красной области спектра как для прямых, так и для инверсных PG. Для прямых систем, даже когда контраст показателя преломления низкий, резонансы форм-фактора приводят к усиленному отражению на коротковолновой стороне структурного пика. Напротив, в случае инверсивных PG видно, что структурный фактор формирует хорошо разделенный пик в видимом спектре, даже в красной области длин волн.

Из этого следует вывод, что инверсивные PG с низким показателем преломления могут превосходить прямые PG с точки зрения чистоты цвета и насыщенности.


Изображение 3

Уменьшение контраста показателя преломления между матрицей рассеяния (nm) и центрами рассеяния (np) может еще больше способствовать структурному вкладу. На видно, что увеличение np приводит к широкополосному снижению коэффициента отражения и красному смещению структурного пика. Структурный пик уменьшается по ширине и имеет более высокую интенсивность по сравнению с его фоном, что приводит к лучшей чистоте цвета.

Уменьшение контраста показателя преломления снижает роль многократного рассеяния, которое так или иначе присутствует в неупорядоченных системах. Это ограничивает изотропные структурные цвета режимом распространения света между диффузным рассеянием* и баллистическим переносом*.
Диффузное рассеяние* рассеяние, возникающее в результате любого отклонения структуры материала от структуры идеально правильной решетки.
Баллистический перенос* беспрепятственный поток носителей заряда (обычно электронов) или несущих энергию частиц на относительно большие расстояния в материале.
Многократное рассеяние становится преобладающим при увеличении толщины образца, что приводит к широкополосному ненасыщенному отклику.

Соответствующие наблюдения также можно применить и к рассеивателям со сложной геометрией. Как уточняют ученые, в их предыдущих работах была представлена идея использования частиц ядро-оболочка* для разделения вкладов форм-фактора и структурного фактора и достижения отдельного пика в длинноволновой области спектра.
Частица ядро-оболочка* частица, ядро и оболочка которой отличаются по составу, морфологии и функциональному назначению.
На изображении показано, что уменьшение размера центра рассеяния (ядра) при сохранении длины структурной корреляции приводит к увеличению интенсивности и ширины длинноволнового (структурного) пика. В то же время коротковолновый вклад резонансов Ми смещается в сторону ультрафиолета.

На показано, что пониженный контраст показателя преломления может подавить многократное рассеяние, в то время как разделение вкладов форм-фактора и структурного фактора возможно через частицы ядро-оболочка ().

Объединение обоих методов показано на . Это позволяет получить более высокие значения чистоты и насыщенности цвета за счет хорошо разделенных пиков в длинноволновой части видимого спектра.

На следующем этапе исследования ученые уделили внимание оценке насыщенности и чистоты цвета. Для количественной оценки этих параметров спектры отражения прямых, инверсивных PG и ядер-оболочек были преобразованы в цветовые оттенки. Чистоту цвета можно определить как нормализованное расстояние от белой точки на диаграмме цветности по отношению к красной точке (в случае красных цветов). Насыщенность количественно определяет, насколько интенсивность отраженного света распределяется по спектру с разными длинами волн.


Изображение 4

На 4A различные системы для оттенков красного нанесены на диаграмму цветового пространства CIE XYZ. На 4В вычислены соответствующие значения чистоты и насыщения.

Стоит отметить, что все инверсивные PG демонстрируют более высокие значения чистоты и насыщенности цвета, чем красные оттенки прямых PG. Однако включение в систему частиц ядро-оболочка не приводит к значительному улучшению по сравнению со стандартным инверсивным PG. Если же объединить оба подхода, то можно получить более высокие показатели чистоты и насыщенности. Тем не менее они будут гораздо ниже, чем у реального красного цвета (т.е. из модели КЗС красный, зеленый, синий).

Для более детального ознакомления с нюансами исследования рекомендую заглянуть в доклад ученых и дополнительные материалы к нему.

Эпилог


В данном труде ученым удалось продемонстрировать, что фотонные стекла имеют внутренние ограничения в достижении насыщенных красных оттенков. Это обусловлено взаимодействием между резонансом, связанным со структурным фактором, рассеянием, связанным с форм-фактором, и фоном многократного рассеяния. Подобный фундамент позволяет легко достичь структурного цвета в УФ-синем диапазоне, но не в случае больших длин волн.

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

По словам ученых, подобные наблюдения могут свидетельствовать о том, что природа была вынуждена (образно выражаясь) создать альтернативные пути формирования красных оттенков (например, многослойные или алмазные структуры).

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

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

Подобные исследования позволяют лучше понять структурные цвета, а также выработать новые методики по созданию материалов, способных быть основой для тех оттенков, что не встречаются в естественных структурных цветах. Помочь в этом, по мнению авторов исследования, могут новые типы наноструктур (например, сетевые или многослойные иерархические структуры).

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

Благодарю за внимание, оставайтесь любопытствующими и хорошей всем рабочей недели, ребята. :)

Немного рекламы


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
Подробнее..

Перевод Что это за цвет?

22.10.2020 14:22:35 | Автор: admin
В предыдущей статье мы определяли цвет одежды по изображению, и это может помочь нам для принятия решений о том, одежду каких стилей покупать, и каким клиентам их отправлять. Мы описали гибридный подход с участием человека и машины, однако подробно описывали только часть работы человека перевод изображений в иерархию цветов. В данной статье мы углубимся в часть работы компьютера наш текущий алгоритм компьютерного зрения, процесс его разработки и идеи на будущее.

Откуда нам знать, что алгоритм работает?


Перед разработкой алгоритма нужно задуматься над тем, как мы будем оценивать его работу. Допустим, мы написали алгоритм, и он говорит, что на этом изображении есть следующие цвета правильным ли будет его решение? И что это вообще значит правильным?

Для решения этой задачи мы выбрали два важных измерения правильную разметку основного цвета и правильное количество цветов. Мы задаём это как расстояние CIEDE 2000 (формула цветового отличия) между основным цветом, предсказанным нашим алгоритмом, и нашим реальным основным цветом, а также считаем среднюю абсолютную ошибку в количестве цветов. Такой выбор мы сделали по следующим соображениям:

  • Эти параметры легко подсчитать.
  • При увеличении количества метрик было бы труднее выбрать лучший алгоритм.
  • При уменьшении количества метрик мы можем упустить важное различие между двумя алгоритмами.
  • В любом случае у большинства предметов одежды есть один-два главных цвета, и многие из наших процессов полагаются на основной цвет. Поэтому правильно вычислить основной цвет гораздо важнее, чем правильно вычислить второй или третий цвета.

Что насчёт реальных данных? Наша команда мерчандайзеров обеспечила нас метками, однако наши инструменты дают им возможность выбирать только самые общие цвета, вроде серого или синего их нельзя назвать точным значением. Такие общие определения включают довольно много разнообразных оттенков, поэтому их в качестве реальных цветов использовать не получится. Придётся строить собственный набор данных.

Кто-то из вас мог уже задуматься о сервисах типа Mechanical Turk. Но нам не нужно размечать очень много изображений, поэтому описать эту задачу, возможно, будет даже тяжелее, чем просто выполнить её. Кроме того, создание набора данных помогает лучше разобраться в них. Мы по-быстрому сварганили приложение на HTML/Javascript и случайным образом выбрали 1000 изображений, выбрали для каждого пиксель, представляющий его основной цвет, и разметили количество увиденных нами на изображении цветов. После этого получить два числа, оценивающие качество нашего алгоритма, стало просто (расстояние до главного цвета CIEDE и количество цветов MAE).

Иногда мы проверяли работу программ вручную, запуская оба алгоритма на одном изображении и выводя два списка цветов. Затем мы вручную проставили оценки 200 изображениям, выбирая, какие цвета были распознаны лучше. Очень важно подобным образом плотно работать с данными чтобы не просто получить результат (алгоритм Б в 70% случаев отработал лучше алгоритма А), но и понять, что происходит в каждом из случаев (алгоритм Б обычно выбирает слишком много групп, а алгоритм А упускает светлые цвета).


Свитер и выбранные двумя разными алгоритмами цвета

Наш алгоритм извлечения цвета


Перед обработкой изображений мы преобразуем их в цветовое пространство CIELAB (или просто LAB) вместо более распространённого RGB. В результате наши три цифры будут обозначать не количество красного, зелёного и синего. Точки пространства LAB (правильнее будет L*a*b*, но мы для простоты будем писать LAB) обозначают три разных оси. L обозначает яркость от чёрного 0 до белого 100. A и B обозначают цвет: А указывает место в диапазоне от зелёного -128 до красного 127, а В от синего -128 до жёлтого 127. Основное преимущество такого пространства воспринимаемая однородность. Расстояние или разница между двумя точками в пространстве LAB будет восприниматься одинаково, вне зависимости от их местонахождения, если евклидово расстояние между ними в пространстве тоже будет одинаковым.

Естественно, у LAB есть другие проблемы: к примеру, мы рассматриваем изображения на компьютерных экранах, использующих RGB-пространство, зависящее от устройства. Также гамма LAB шире, чем у RGB, то есть в LAB можно выражать такие цвета, какие не выразишь через RGB. Поэтому преобразование из LAB в RGB не может быть двусторонним преобразовав точку в одном направлении, а потом в обратном, можно получить другое значение. Теоретически эти недочёты присутствуют, но на практике метод всё равно работает.

Преобразовав картинку в LAB, мы получим набор пикселей, которые можно рассматривать, как точки (L, A, B, X, Y). Оставшаяся часть алгоритма занимается группировкой этих точек, при которой группы первого этапа используют все пять измерений, а второго опускают измерения X и Y.

Группировка в пространстве


Мы начинаем с изображения без группировки пикселей, прошедшего цветовую корректировку, описанную в предыдущей статье, сжатого до 320200 и преобразованного в LAB.



Для начала применим алгоритм Quickshift, группирующий близлежащие пиксели в суперпиксели.



Это уже сводит наше изображение, содержащее 60 000 пикселей, к нескольким сотням суперпикселей, удаляя ненужную сложность. Ещё более упростить ситуацию можно, слив воедино близлежащие суперпиксели с небольшим цветовым расстоянием между ними. Для этого мы рисуем их граф региональной близости граф, в котором обозначающие два разных суперпикселя узлы соединяются ребром, если их пиксели соприкасаются.


Слева граф региональной близости (Regional Adjacency Graph, RAG) для кардигана. Тёмные линии, соединяющие суперпиксели, говорят о том, что между ними нет особой цветовой разницы, и поэтому их можно сливать. Яркие линии, или их отсутствие, говорят о высоком различии между цветами, и о том, что их сливать не надо. Справа суперпиксели, слитые после обработки графа по пороговым значениям.

Узлы графа вычисленные нами суперпиксели, а рёбра расстояние между ними в цветовом пространстве. У ребра, соединяющего два близлежащих суперпикселя с похожими цветами будет низкий вес (тёмные линии), а у ребра между суперпикселями с очень разными цветами высокий (яркие линии, а также отсутствие линий их не рисовали, если их вес больше 20). Существует много способов скомбинировать близлежащие суперпиксели, однако для нас оказалось достаточно простого порогового значения, равного 10.

В нашем случае 60 000 пикселей получилось свести к 100 участкам, в каждом из которых содержатся пиксели одного цвета. Это даёт преимущества при вычислениях: во-первых, мы знаем, что большой суперпиксель почти белого цвета это фон, и его можно удалить. Мы удаляем все суперпиксели, у которых L>99, а А и В находятся в промежутке от -0,5 до 0,5. Во-вторых, мы можем сильно уменьшить количество пикселей на следующем шаге. У нас не получится уменьшить их количество до 100, поскольку нам надо взвешивать участки на основании количества содержащихся в них пикселей. Но мы можем легко удалить 90% пикселей из каждой группы, не особенно потеряв в детализации и почти не исказив следующей группировки.

Группировка без использования пространства


На данном шаге у нас есть несколько тысяч пикселей с координатами (L, A, B). Существует множество методов, способных красиво сгруппировать эти пиксели. Мы выбрали метод k-средних, поскольку он быстро работает, прост для понимания, у наших данных есть только 3 измерения, и евклидовое расстояние в LAB-пространстве имеет смысл.

Мы не особо умничали и провели группировку с К=8. Если в какой-то группе содержится меньше 3% точек, мы пробуем снова, уже с К=7, потом 6, и так далее. В итоге мы имеем список от 1 до 8 центров группировки и доли количества точек, принадлежащих к каждому из центров. Названия им даёт алгоритм colornamer, описанный в предыдущей статье.

Результаты и оставшиеся проблемы


Мы достигли среднего расстояния в 5,86 по шкале CIEDE 2000 между предсказанным и реальным цветом. Правильно интерпретировать этот показатель довольно сложно. По простой метрике расстояния CIE76 наша средняя дистанция равняется 7,82. По этой метрике значение 2,3 означает едва различимую разницу. Поэтому можно сказать, что наши результаты, немного превышающие 3, обозначают едва заметную разницу.

Также наш показатель MAE составил 2,28 цветов. Но опять-таки, это вторичная метрика. Многие описанные далее алгоритмы уменьшают эту ошибку, но за счёт увеличения цветового расстояния. Гораздо проще проигнорировать ложные цвета, стоящие на 5-м или 6-м месте, чем проигнорировать неправильный 1-й цвет.


Даже вещи явно одного цвета, как эти шорты, содержат области, из-за теней кажущиеся гораздо более тёмными

Остаётся проблема теней. Ткань не уложишь идеально ровно, поэтому часть изображения всегда останется в тени, и будет казаться обманчиво другого цвета. Простейшие подходы вроде поиска дубликатов цветов одного оттенка и разной яркости не работают, поскольку переход от пикселя без тени к пикселю в тени не всегда работает одинаково. В будущем мы надеемся использовать более хитрые техники вроде DeshadowNet или автоматического распознавания теней.



Мы сконцентрировались только на цвете одежды. У бижутерии и туфель свои проблемы: наши фотографии украшений слишком маленькие, а на фотографиях обуви часто видно её внутренность. В приведённом выше примере мы бы указали наличие на фото бургундского и охры, хотя важен только первый из них.

Что ещё мы пробовали


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

Удаление фона


Мы пробовали алгоритмы удаления фона к примеру, алгоритм от Lyst. Неформальная оценка показала, что они работают не так точно, как простое удаление белого фона. Однако мы планируем поглубже изучить его по мере обработки изображений, над которыми не работала наша фотостудия.

Хэширование пикселей


Некоторые библиотеки для извлечения цветов выбрали простое решение данной задачи: группировать пиксели, хэшируя их в несколько достаточно широких контейнеров, а потом возвращать средние значения LAB контейнеров с наибольшим количеством пикселей. Мы опробовали библиотеку Colorgram.py; несмотря на её простоту, работает она удивительно неплохо. Кроме того, она работает быстро не более секунды на изображение, в то время, как наш алгоритм тратит десятки секунд на одно изображение. Однако среднее расстояние до основного цвета у Colorgram.py было больше, чем у нашего алгоритма в основном потому, что его результат взят у средних расстояний до больших контейнеров. Тем не менее, мы иногда используем его для случаев, когда скорость важнее точности.

Другой алгоритм разделения на суперпиксели


Мы используем алгоритм Quickshift для сегментирования изображения на суперпиксели, однако возможных алгоритмов существует несколько к примеру, SLIC, Watershed и Felzenszwalb. На практике лучшие результаты показал Quickshift благодаря его работе с мелкими деталями. К примеру, у SLIC есть проблема с такими вещами, как полоски, занимающие много места на картинке. Вот показательные результаты работы алгоритма SLIC с разными настройками:


Оригинальное изображение


compactness=1


compactness=10


compactness=100

Для работы с нашими данными у Quickshift есть одно теоретическое преимущество: он не требует непрерывной связи суперпикселей. Исследователи отмечали, что из-за этого у алгоритмов могут возникать проблемы, однако в нашем случае это преимущество часто у нас попадаются небольшие области с мелкими деталями, которые мы хотим привести к одной группе.


Рубашка в клеточку


Её суперпиксельная группировка от Quickshift

Хотя суперпиксельная группировка от Quickshift выглядит хаотично, на самом деле она группирует все красные полоски с другими красными, синие с синими, и т.п.

Разные методы подсчёта количества групп


При использовании метода k-средних чаще всего возникает вопрос: каким сделать k? То есть, если нам надо группировать точки в некоторое количество групп, сколько их нужно делать? Для ответа на вопрос было разработано несколько подходов. Простейший локтевой метод, однако он требует ручной обработки графа, а нам нужно автоматическое решение. Статистика разрывов [Gap Statistic] формализует этот метод, и с её помощью мы получили лучшие результаты по метрике количества цветов, однако за счёт точности определения основного цвета. Поскольку основной цвет важнее всего, мы не использовали её в рабочей программе, но планируем далее изучать этот вопрос.

Наконец, метод силуэта ещё один популярный метод выбора k. Он выдаёт резульатты чуть хуже, чем наш алгоритм, и у него есть один серьёзный недостаток: ему нужно не менее 2 групп. Но у многих артикулов одежды есть только один цвет.

DBSCAN


Одно потенциальное решение вопроса выбора k использовать алгоритм, не требующий от вас выбирать этот параметр. Один из популярных примеров DBSCAN, ищущий в данных группы примерно равной плотности.


Разноцветная блузка


Все пиксели её изображения в LAB-пространстве. Пиксели не формируют чётких групп зеленовато-голубой и фиолетовый.

Часто у нас не получается таких групп, или мы видим что-то наподобие групп только из-за особенностей человеческого восприятия. Для нас зеленовато-голубые огурцы на блузке выделяются на фиолетовом фоне, но если мы построим все пиксели в координатах RGB или LAB, они не сформируют групп. Но мы всё равно пробовали DBSCAN с различными значениями эпсилон и получили предсказуемо неважные результаты.

Решение от Algolia


Один из хороших принципов исследователи посмотреть, не решил ли кто уже вашу проблему. Лео Эрколанелли с сайта Algolia опубликовал подробное описание решения такой задачи более трёх лет назад. Благодаря их щедрости в раздаче исходников, мы смогли сами попробовать их решение. Однако результаты получились чуть хуже наших, поэтому мы оставили наш алгоритм. Они решают не совсем ту же проблему, что мы: у них были изображения товаров на моделях и на отличном от белого фоне, поэтому разумно, что их результаты отличаются от наших.

Координация цветов


Этот алгоритм завершает процесс, описанный в нашей предыдущей статье. После извлечения центров групп мы используем Colornamer для назначения им имён, а потом импортируем эти цвета в наши внутренние инструменты. Это помогает нам легко визуализировать нашу продукцию по цветам; мы надеемся включить эти данные в алгоритмы рекомендаций покупок. Этот процесс нельзя назвать идеальным решением, он помогает нам получить лучшие данные о тысячах наших товаров, что, в свою очередь, способствует нашей главной цели: помогать людям находить стили, которые им понравятся.

Опрос о переводе первой части
Подробнее..

SRGB lives matter или как Chrome врал с цветами

30.08.2020 18:21:45 | Автор: admin
image

Началось все с того что я решил обновить свой ноутбук и купил себе DELL G3, для работы и естественно поиграть. Конечно, монитор у него не ретина, но в принципе пойдет.

Затем как то, работая с нашим заказчиком, я обнаружил, что с удаленного рабочего стола цвета их логотипа выглядят совсем по-другому. После чего я решил открыть их сайт на разных браузерах и понял, что 2 из 4 браузеров показывают не правильно и это те что на хром движке к слову показывали правильно цвета Mozila FireFox и Internet Explorer (внезапно! Но сайт их криво отрисовал но это уже другая история), а Google Chrome и Microsoft EDGE (на базе хром движка) не верно выводили цвета.

Выглядело это вот так:

image
Если узнали чей логотип треугольника напиши в комментариях)

Я решил глобально изменять цветовые профили в настройках системы, но это не помогло. Проведя несколько часов в интернете я узнал, что во вкладке chrome://flags можно изменить цветовой профиль и тогда это будет это цвета будут отображаться корректно. Но после нескольких обновлений опять слетает настройка. Chrome в чем дело?

image

Кстати проверить цвета можно на сайте http://monteon.ru/ вот так выглядело до и после применения цветового профиля. Разница очевидна.

image

Кстати напишите в комментариях кто столкнулся с такой же проблемой. И помогла ли эта статья?
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru