Представление цвета
Сегодня сделал обескураживающие "открытие": цвета можно намного эффективнее сравнивать, не имея никакого представления об отдельных RGB компонентах.
Вся операция сравнения на Си выглядит примерно так:
if (CSL + color1 - color2) % (CSL / 2) > threshold) {...}
где CSL - Color Space Length (256, чтобы уложиться в байт)
Естественно, для этого обычные RGB компоненты необходимо конвертировать в компоненты другого вида:
1) индекс цвета в цветовой циклической палитре
2) яркость этого цвета
3) яркость белого
Это - гораздо более осязаемые вещи, чем RGB. Наверняка, некоторые уже знают этот эффект, но я в приятном удивлении. Тем более приятно, что дошел до этого сам.
Обоснование
| | вверху слева - оригинал,
вверху справа - цвета без остальных компонентов,
снизу слева - яркость цвета,
снизу справа - яркость белого
|
Смысл идеи прост. Человеческий глаз различает только три основных цвета: красный, зеленый и синий. Люди неопытные используют для сравнения корень из суммы квадратов разницы всех компонент. Но это - ошибка.
Дело в том, что если присмотреться, то вы обнаружите, что в каждый момент времени только два базовых цвета составляют видимый цвет; те, которые по яркости больше третьего. Самая же блеклая компонента на видимый цвет не влияет, а лишь придает оттенок белизны. Таким образом, не существует никакого RGB "куба", а лишь двумерная цветовая лента: от красного к зеленому, от зелего к синему, от синего к красному. Это очень важно: цветов, состоящих сразу из синего красного и зеленого - не существует! Это будет лишь цвет, составленный из основной пары + белизна. Мысль кажется такой очевидной, когда осознаешь, ведь три компоненты вместе - это градация серого.
Все это:
1) в корне упрощает алгоритм анализа изображения, так как в нем не так важна яркость, сколько цвет;
2) сама процедура сравнения феноменально ускоряется;
3) добавляются два дополнительных параметра для фильтрации, которые более вменяемы и понятны.
Правда, сказать по-правде, у меня возникала сначала проблема, как быстро создать картинку нового вида. Но, подумав, нашел отличное решение с применением таблицы трансляции размером в 65 кило, и еще пары хитростей. Сейчас работаю над этим. Надеюсь, я в теории нигде не просчитался....
PS Хотя это не имеет отношение к делу, но мне еще хочется глянуть, как будет выглядеть какая-нибудь фотка, из которой вычесть компоненты яркости и белизны, оставив лишь сам цвет. Наверное, будет чем-то похожа на картину маслом.
Ваше имя:
| Articles & posts |
|---|
| Как работает временная память в мозгу | Резюме на статей о работе гиппокампа мозга, ответственного за хранение временной памяти.
|
|---|
| Потоковая память | Иногда нужно выполнить множество операций конкатенации строки, и сделать это максимально быстро. В статье описывается алгоритм и даются исходники одного из методов решения этой задачи.
|
|---|
| Временная память - удобная альтернатива | Многие, наверное, сталкивались с "ограничением" языка Си на работу со строками, когда надо возвратить строку или другие объемные данные, созданные внутри функции. Сейчас вы поймете, почему я взял это слово в кавычки :)
|
|---|
| Функция создания точки останова на чтение/запись | Эта функция будет полезна при отладке, когда нужно определить, где портятся заданные данные.
|
|---|
| Кремль со спутника | Вид со спутника на несколько известных мест. Карты maps.google.com.
|
|---|
| Представление цвета | Принцип разложения цветов на составляющие для удобного их сравнения. Существующие два олсновных формата представления цвета.
|
|---|
| Сравнение цветов | Соображения по поводу возможного алгоритма сравнения цветов.
|
|---|
| Детектор движения | Общие соображения насчет алгоритма обнаружения движения.
|
|---|
| Сборщик мусора | Альтернатива стандартному алгоритму сборщика мусора, используемому в java.
|
|---|
|