Как стать автором
Обновить

Комментарии 14

Странная формула для определения близости пикселей в цветовом пространстве, ведь шкала оттенков циклическая — тон же угол. Как это работает на границе с красным?
Формула родилась эмпирическим путем подбора эвристикой.
В ней происходит учет, что цвет определен не только углом радиус вектора, но также его длиной.
Как известно все цвета в модели HSV переходят друг в друга непрерывно:
image
Непрерывность перехода цветов без учета третьего показателя:
image
На границе с красным (и других цветов) никаких проблем нет.
Характеристику произведения H*B можно интерпретировать как одновременный учет двух показателей («И», а не «ИЛИ»).
Для красного значения угла могут сильно различаться, например 0,001 и 359,999.
Хотя это такой-же угол, как и между 0,001 и 0,003 (0,002). Из формулы не понятно как это учитывается.
Ну например что H — это не значение угла, а единичный вектор, который потом умножается на скаляр B чтобы получить координаты точки, а близость считается как расстояние между полученными таким образом точками…
Теперь стала понятна проблема, спасибо. В формуле это действительно ни как не учитывалось, но думаю можно придумать способы для учета этой проблемы.
Например:
dist(X1, X2) = min(sqrt(H1*B1 — H2*B2), sqrt((H1+360)*B1 — H2*B2))

Может быть, стоит изучить литературу? А то в списке источников ссылка только на себя любимого – это несколько странно. Как минимум, задумались бы об Lab или YUV, а не, прости господи, HSB со всей его тригонометрией (он вообще служит только для того, чтобы представить цвет в понятной для человека форме).

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

Я не готов вам развёрнуто ответить: у вас не хватает базовых знаний, поэтому ответ получился бы слишком большой.
Но несколько тезисов:


  1. HSB – это вычислительный ад. Сложные формулы с тригонометрией, особые случаи (на один вы уже наступили), медленное вычисление.
  2. Вы, похоже, попутали Lab с HSI или ещё с чем. Никаких "светлота, тон, насыщенность". Перечитайте описание.
  3. Lab вовсе не для устранения шума на изображении. А ровно для той задачи, которая вам нужна: "При разработке Lab преследовалась цель создания цветового пространства, изменение цвета в котором будет более линейным с точки зрения человеческого восприятия (по сравнению с XYZ), то есть с тем, чтобы одинаковое изменение значений координат цвета в разных областях цветового пространства производило одинаковое ощущение изменения цвета."
  4. Если вам нужно сравнивать оттенки, не учитывая яркость — это делается без ада HSB. Просто делим цветовые компоненты в каком-нибудь "нормальном" цветовом пространстве на одну из них. Например, в YUV – U/Y, V/Y. Или RGB нормируем на яркость. Или даже R/G, B/G. Дёшево и сердито, вычислительная сложность никакая, проблем куда меньше, чем с HSB.

Ладно, фигня это всё… Могу попробовать покопаться в своих старых записях (уже лет 10, как ушёл из анализа изображений) и посоветовать литературу – надо? Хотя лучше сами поищите, за эти 10 лет в сети много появилось, и даже на русском.

Если хотите, можете менять части алгоритма как вам захочется, например заменой блока сравнения пикселей по любому алгоритму какой вам захочется и в каком вы больше уверены.
Если считаете что данный блок можно сделать более производительным и эффективным с точки зрения быстроты вычислений.
За подсказку использовать Lab спасибо. Я заметил там тоже три показателя но вместо одного «H» характеризующего тон, там два «a» и «b». Так получается в соответствии с выявления тона-оттенка этот алгоритм занимает промежуточное место между RGB схемой и HSV (в RGB — 3 в HSV — 1).
Хотелось бы иметь всего один показатель характеризующий оттенок, чтобы цвет кодировался всего одним параметром. При этом чтобы близость значений такого показателя у двух пикселей имела соответствие близости оттенков.
Использование одного показателя тона цвета означает, что не нужно будет использовать евклидово расстояние для независимых компонент цвета, а функция дистанции между точками в цветовом пространстве будет иметь завязку всего на один показатель цвета.
Так в модели HSV по одному показателю H можно сразу понять, что это за цвет, например синий или красный. Так например если H равен 100, уже неважно чему равны S и V, это все равно зеленый цвет. Цель же выявить оттенок поэтому.

Когда вы поиграете с реальными изображениями, то осознаете, что одно число для оттенка – это несбыточные мечты. Наглядный пример (хотя и гипертрофированный) – феномен синего или белого платья (гуглится).
Из менее экстремального – один и тот же объект при освещении лампами "тёплого" и "холодного" цвета: тупо вычисленное H может поменяться на 180 градусов. А вот пара a/L b/L поменяется не столь сильно, и евклидово расстояние решит проблемы.
Не жадничайте: там, где есть две степени свободы (три цветовых координаты минус яркость) не пытайтесь обойтись одной.
(Но если очень хочется – для некоторых изображений можно строить классные одномерные или двумерные палитры с помощью карт Кохонена)

«карт Кохонена»
данный метод является громоздким и примененный для вычисления H будет лишним тут, поэтому проще обойтись HSV.

Я использовал HSV из стандартной библиотеки Java, поэтому с легкостью получал результаты H.
Не поделитесь ссылкой на реализацию Lab на Java?

Не-не-не, карты Кохонена – не для вычисления H (как?), они для построения одномерной или двумерной палитры.


Lab для Java – не поделюсь, не работаю на Java. Но, думаю, нагуглить несложно.

Еще вместо произведения для улучшения функции одновременности показателей, возможно использовать степенную функция как sqrt((H1^B1)*(B1^H1) — (H2^B2)*(B2^H2))
Да… совпадение величины H*B не даёт гарантий близости цветов.
поскольку 30*0.8 = 120*0.2, но это вообще разные цвета, кроме того разность под корнем может быть отрицательной. Почему бы не использовать стандарную евклидову геометрию — было бы sqrt((H1-H2)^2 + (B1 — B2)^2) с двумерной сеткой подинтервалов. Значения угла, например, отнормировать с 0-360 до 0-1, чтобы влияние тона было примерно равно влиянию ярокости, ну или подобрать этим величинам коэффициенты, наиболее подходящие для конкретной задачи.

Замена палитры, например, классически решается просто таблицей замены одного цвета на другой. И если вся таблица 256*256*256 цветов это сильно жирно, то можно порезать её на кубики 16*16*16 — это будет всего 4096 сопоставлений, которые интерполируются в 3д.

Может это конечно слишком тупое решение, но в отличии от нейросети мне оно кажется более стабильным и предсказуемым.
Такие события как 30*0.8 = 120*0.2 маловероятны в статистическом массиве значений цветов палитры.
«Использовать стандарную евклидову геометрию» я пробовал к тому времени и получил результаты хуже чем на данной эвристике.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации