Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

Расстояние между цветами   Найти похожие ветки 

 
Borealis   (2003-10-23 12:21) [0]

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


 
MBo ©   (2003-10-23 12:32) [1]

1) допуск по каждой цветовой составляющей - выделить их GetRvalue и т.п.
2) расстояние в цветовом пространстве - так же, как в обычной геометрии - корень из суммы квадратов разностей составляющих (корень можно и не извлекать)


 
Borealis   (2003-10-23 13:01) [2]


> MBo © (23.10.03 12:32) [1]
> 1) допуск по каждой цветовой составляющей - выделить их
> GetRvalue и т.п.
> 2) расстояние в цветовом пространстве - так же, как в обычной
> геометрии - корень из суммы квадратов разностей составляющих
> (корень можно и не извлекать)

Я тоже в первую очередь подумал об этой формуле. А как насчёт коэффициентов? Мне нужно чтобы было близко к человеческому восприятию.
Например преобразование к серому градиенту производится не по формуле:
(GetRValue(RGBColor) + GetGValue(RGBColor) + GetBValue(RGBColor ))/3, как следовало бы ожидать, а по формуле:
0.30 * GetRValue(RGBColor) + 0.59 * GetGValue(RGBColor) + 0.11 * GetBValue(RGBColor )


 
MBo ©   (2003-10-23 13:09) [3]

>было близко к человеческому восприятию.
возможно, тогда будет лучше сравнивать в HSV или HSL пространстве.
можно и поэкспериментировать с указанными коэффициентами.


 
Borealis   (2003-10-23 13:31) [4]


> MBo © (23.10.03 13:09) [3]
> >было близко к человеческому восприятию.
> возможно, тогда будет лучше сравнивать в HSV или HSL пространстве.
> можно и поэкспериментировать с указанными коэффициентами.

Насчёт HSL это идея. Нужно будет попробовать. А что такое HSV?


 
MBo ©   (2003-10-23 14:13) [5]

Покопайся на www.efg2.com


 
miek ©   (2003-10-23 20:18) [6]

Математически точная формула:
D := SQRT ( SQR (R2-R1)+SQR (G2-G1)+SQR (B2-B1))


 
CMPXCHG8 ©   (2003-10-28 22:24) [7]

Как такового расстояния между "цветами" нет, потому что цветовая модель RGB не совсем корректна для отображения.
Допустим описываем чистый цвет Red = RGB(255,0,0) и белый - (255,255,255) - если вести расчет как предложено - то "расстояние" между ними велико, хотя на самом деле яркость Red такая же, как и у чистого белого,отличается только уровень Saturation (смешения) Лучший способ оценки - цветовая модель HSV.
Пиши на hotfix@rambler.ru, я как раз заканчиваю программу для обработки фотографий и накопал довольно прилично.


 
miek ©   (2003-10-28 23:55) [8]

2CMPXCHB: Пример неверный, но в общем абсолютно правильно. В KOL вообще ближайший цвет выбирается как логической расстояние, т.е. RGB1 XOR RGB2


 
Думкин ©   (2003-10-29 07:12) [9]


> miek © (28.10.03 23:55) [8]
> 2CMPXCHB: Пример неверный, но в общем абсолютно правильно

Это как? Переведи.


 
cmpxchg8 ©   (2003-10-29 09:43) [10]

2miek - это смотря как понимать


 
Sapersky ©   (2003-10-29 09:55) [11]

Можно ещё YUV, если нужно сделать сравнение независимым от яркости (сравниваем U и V, Y выбрасываем). Строго математически оно, наверное, некорректно, но преобразование в YUV делается быстрее, чем в HSV (впрочем, если кто-нибудь предложит быструю формулу перевода в HSV...)


 
miek ©   (2003-10-29 23:45) [12]

2CMPXCHG, Думкин: Поясняю. То, что расстояние между цветами можно и нужно по-разному считать, это верно,
То, что RGB (255,0,0) и (255,255,255) это одно и то же - неверно. Вторая точка ровно втрое ярче. Как цветной монитор работает - представляете?


 
cmpxchg8 ©   (2003-10-30 22:53) [13]

2Sapesky Быстро - даже очень быстро на SSE (asm)
2miek неверно, вывод на монитор и оценка цвета - две разные вещи


 
Asteroid ©   (2003-10-30 23:43) [14]

> miek © (29.10.03 23:45) [12]
Не-а, не втрое. Восприятие яркости отличается для разных цветов.


 
miek ©   (2003-10-31 00:04) [15]

Я и говорил не про восприятие, а про физическую яркость. Восприятие вообще вещь субъективная. А так - втрое, именно втрое.
Три точки в триаде (пикселе) освещены тремя электронными пушками, интенсивность складывается.

2Cmpxchg: Автор темы спрашивал про реальный пример из жизни, по этому не надо путать. Ему предстоит на мониторе все показывать, или как кто себе это представляет???


 
cmpxchg8 ©   (2003-10-31 23:18) [16]

2all конкретный ответ:// Не в качестве сентенции или поучения
Речь идет по-видимому об инструменте наподобие Magic Wand
Во первых надобно учесть, что практически все модели цветов нелинейны во всех отношениях.
Оценивать разность цветов надо
1. по тону - наиболее важно
2. по степени смешения
3. по яркости
Приблизительно так:
// Функция вычисления разности углов, поелику значение HUE - евто угол от 0 до 360
abstract function AngleDiff(Angle1,Angle2)
//Нормализуем углы
while Angle1<0 do Inc(Angle1,360);
while Angle1>=360 do Dec(Angle1,360);
while Angle2<0 do Inc(Angle2,360);
while Angle2>=360 do Dec(Angle2,360);
if Angle1>Angle2 then Result:=Angle1-Angle2
else Result:=Angle2-Angle1;
//Нормализуем результат, угол должен быть наименьшим
if Result>180 then Result:=360-Result;

abstract function ColorDiff(Color1,Color2:TRGB)
HSV1,HSV2: THSV;
HSV1:=RGBtoHSV(Color1);
HSV2:=RGBtoHSV(Color2);
Result:=AngleDiff(HSV1.Hue-HSV2.Hue)*
Hyp(HSV1.Sat-HSV2.Sat,
HSV1.Value-HSV2.Value);

Может быть я и ошибаюсь, но приведенный пример я использую в своих разработках, единственно я оптимизировал его по вычислениям и переложил на asm.
Если у Вас есть лучшее решение предложите.
С уважением, всегда признающий себя чайником, CMPXCHG8.
P.S. Определение яркости цветового сигнала по коэфициентам не совсем корректно - эта весчь принята на вооружении в телевидении и енти самые коэффициенты были подобраны методом статистического опроса людей, хотя при конвертировании цветной фотографии в черно-белую иногда даже очень подходят



Страницы: 1 вся ветка

Текущий архив: 2004.03.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
1-6045
Maxim_________
2004-02-19 01:45
2004.03.03
как получить из функции array of array of.......?


14-6193
phantom2040
2004-02-12 10:44
2004.03.03
Организация сети


1-6029
smolin
2004-02-18 14:21
2004.03.03
Удаление пробела из строки


1-6108
VID
2004-02-13 02:23
2004.03.03
TEmbeddedWB всё время спрашивает пароль...


1-6142
WebErr
2004-02-19 15:34
2004.03.03
А в Delphi есть template?