PDA

Просмотр полной версии : Критерий "похожести" цветов в цифровом формате


miramax
28.10.2006, 06:24
Дано:
массив colours с цветами (0x55ff55, 0xaadd55, 0x884545, 0xFFFF00 .... );
любой цвет myColour (например 0x00аа00)
Найти:
цвет в массива colours самый близкий (визуально наиболее похожий) на цвет myColour.

Условие "самый близкий" я вижу как наибольшую вероятность не различить эти цвета глазом.
Разбиение uint на значения каналов и сравнение этих значений наводят меня на печальные мысли :(
Что же взять за критерий "похожести" цветов в цифровом формате?

iNils
28.10.2006, 06:30
А почему на печальные мысли наводит?

miramax
28.10.2006, 06:37
Например цвет 888888 визуально ближе к aaaaaa чем к aa88aa, а если сравнивать каналы то получим что цвет 888888 ближе к aa88aa... как их правильно сравнить-то?

graphics.lineStyle(0, 0x000000, 0)
graphics.beginFill(0x888888)
graphics.drawRect(0, 0, 300, 50)
graphics.beginFill(0xaaaaaa)
graphics.drawRect(0, 50, 300, 50)
graphics.beginFill(0xaa88aa)
graphics.drawRect(0, 100, 300, 50)

iNils
28.10.2006, 06:54
Для начала переводить цвета в HSB, так как эта модель самая близкая к восприятию человека.

miramax
28.10.2006, 06:59
Отлично, сэнкс за наводку. :)
Вот нашёл, __etc написал полезную штуку на эту тему:
http://dev.etcs.ru/blog/as2/ru/etcs/draw/colorobject/

udaaff
28.10.2006, 08:25
выделить канал можно следующим способом
function RGB(color:Number) {
var R:Number = (color >> 16)
var G:Number = (color >> 8) & 0xFF;
var B:Number = (color >> 0) & 0xFF;
trace("Red " + R.toString(16));
trace("Green " + G.toString(16));
trace("Blue " + B.toString(16));
}
RGB(0xAB12CF);

miramax
28.10.2006, 08:39
выделить канал можно следующим способом

Выделить канал не проблема,
Я не понял твоей коснтрукции. Делаю вот так

var color:Number = 0xe4dddf;
R = Number('0x'+color.toString(16).substr(0, 2))
G = Number('0x'+color.toString(16).substr(2, 2))
B = Number('0x'+color.toString(16).substr(4, 2))

но с каналами всё равно не подходит вариант, нужно сравнивать параметры HSB. Результаты более правдоподобные

udaaff
28.10.2006, 09:23
Выделить канал не проблема,
Я не понял твоей коснтрукции.
На каждый канал отводится по 8 бит(на цвет RGB-24)
R.делаем сдвиг на 16(биты которые выходят за рамки убиваются), остается красный
G.--сдвиг на 8 (восемь убиваются)
----оставлям побитовым "&" нужные 8
B.оставляем "&" нужные 8

iNils
28.10.2006, 09:40
2 miramax: Твоя функция в 25 раз медленнее работает и самое главное в некоторых случаев она будет работать не правильно (например если был задан цвет 0x00FFFF или 0x055555).
2 udaaff: я не понял смысла операции color >> 0

etc
28.10.2006, 12:52
miramax, цвет строкой должен быть задан, numberToHEX у меня в классе возвращает строку, которая потом уже разбивается на подстроки.

Переделаю пару функций в ColorObject, чтобы быстрее работало…

UPD: можешь обновиться, я там как раз переделал на битовое сравнение.

udaaff
29.10.2006, 02:17
2 udaaff: я не понял смысла операции color >> 0
в ней столько же смысла , сколько и в A+0

miramax
14.12.2006, 07:50
http://algolist.manual.ru/graphics/find_col.php :)

iNils
14.12.2006, 22:18
Это ты столько времени искал?:)