![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расстояние между цветами [D6, Win2k]
Borealis © (2003-10-23 12:21:00)
По каким формулам можно посчитать расстояние между цветами (или как это правильно называется?)?
На битмапе нужно выделить область с некоторым цветом с определённым допуском, для этого нужно уметь подсчитывать расстояние между цветами от контрольного цвета до цвета очередного пиксела. Тогда проверить входит ли цвет пиксела в допустимый диапазон или нет - задача тривиальная.
cmpxchg8 (2003-10-31 23:18:00) [1]
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. Определение яркости цветового сигнала по коэфициентам не совсем корректно - эта весчь принята на вооружении в телевидении и енти самые коэффициенты были подобраны методом статистического опроса людей, хотя при конвертировании цветной фотографии в черно-белую иногда даже очень подходят
miek (2003-10-31 00:04:00) [2]
Я и говорил не про восприятие, а про физическую яркость. Восприятие вообще вещь субъективная. А так - втрое, именно втрое.
Три точки в триаде (пикселе) освещены тремя электронными пушками, интенсивность складывается.
2Cmpxchg: Автор темы спрашивал про реальный пример из жизни, по этому не надо путать. Ему предстоит на мониторе все показывать, или как кто себе это представляет???
Asteroid (2003-10-30 23:43:00) [3]
> miek © (29.10.03 23:45) [12]
Не-а, не втрое. Восприятие яркости отличается для разных цветов.
cmpxchg8 (2003-10-30 22:53:00) [4]
2Sapesky Быстро - даже очень быстро на SSE (asm)
2miek неверно, вывод на монитор и оценка цвета - две разные вещи
miek (2003-10-29 23:45:00) [5]
2CMPXCHG, Думкин: Поясняю. То, что расстояние между цветами можно и нужно по-разному считать, это верно,
То, что RGB (255,0,0) и (255,255,255) это одно и то же - неверно. Вторая точка ровно втрое ярче. Как цветной монитор работает - представляете?
Sapersky (2003-10-29 09:55:00) [6]
Можно ещё YUV, если нужно сделать сравнение независимым от яркости (сравниваем U и V, Y выбрасываем). Строго математически оно, наверное, некорректно, но преобразование в YUV делается быстрее, чем в HSV (впрочем, если кто-нибудь предложит быструюформулу перевода в HSV...)
cmpxchg8 (2003-10-29 09:43:00) [7]
2miek - это смотря как понимать
Думкин (2003-10-29 07:12:00) [8]
> miek © (28.10.03 23:55) [8]
> 2CMPXCHB: Пример неверный, но в общем абсолютно правильно
Это как? Переведи.
miek (2003-10-28 23:55:00) [9]
2CMPXCHB: Пример неверный, но в общем абсолютно правильно. В KOL вообще ближайший цвет выбирается как логической расстояние, т.е. RGB1 XOR RGB2
CMPXCHG8 (2003-10-28 22:24:00) [10]
Как такового расстояния между "цветами" нет, потому что цветовая модель RGB не совсем корректна для отображения.
Допустим описываем чистый цвет Red = RGB(255,0,0) и белый - (255,255,255) - если вести расчет как предложено - то "расстояние" между ними велико, хотя на самом деле яркость Red такая же, как и у чистого белого,отличается только уровень Saturation (смешения) Лучший способ оценки - цветовая модель HSV.
Пиши на hotfix@rambler.ru, я как раз заканчиваю программу для обработки фотографий и накопал довольно прилично.
miek (2003-10-23 20:18:00) [11]
Математически точная формула:
D := SQRT ( SQR (R2-R1)+SQR (G2-G1)+SQR (B2-B1))
MBo (2003-10-23 14:13:00) [12]
Покопайся на www.efg2.com
Borealis (2003-10-23 13:31:00) [13]
> MBo © (23.10.03 13:09) [3]
> >было близко к человеческому восприятию.
> возможно, тогда будет лучше сравнивать в HSV или HSL пространстве.
> можно и поэкспериментировать с указанными коэффициентами.
Насчёт HSL это идея. Нужно будет попробовать. А что такое HSV?
MBo (2003-10-23 13:09:00) [14]
>было близко к человеческому восприятию.
возможно, тогда будет лучше сравнивать в HSV или HSL пространстве.
можно и поэкспериментировать с указанными коэффициентами.
Borealis (2003-10-23 13:01:00) [15]
> 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 12:32:00) [16]
1) допуск по каждой цветовой составляющей - выделить их GetRvalue и т.п.
2) расстояние в цветовом пространстве - так же, как в обычной геометрии - корень из суммы квадратов разностей составляющих (корень можно и не извлекать)