Сравнение цвета
Цель такая.
Итёт сканирование экрана, при этом заданы верхний и нижний предел цвета (дапустим от светло зелёного до тёмно зелёного).
Задача проверить, что просканированный цвет находиться в промежутке между задаными цветами.
Дапустим
Нижний предел = 2027802 [as long] or RGB(30,241,26)
Верхний придел = 2717000 [as long] or RGB(41,117,72)
--------------------------------------------------------
Результат скана = 3241545 [as long] or RGB(49,118,73)
Ешё вопрос.
Возможно ли полученный цвет перевести в разрят 16 цветов или 32.
Сорру. Изночально не там открыл.
Так мне и нужно выяснить - подходит или нет.
Да - результат скана число (типа long) но его можно представить в системе RGB (Red,Gren,Blue).
Мне не нужно сравнивать разные цвета, а нужно выяснить что цвета одинаковые (человеческому глазу).
Дапустим - Я задал тёмно зелёный и светло зелёный и мне нужно проверить что просканированный цвет близок к задданым. Тоесть тоже зелённый но с каким то другим оттенком.
У меня уже есть пару идей.
На выходных буду пробывать.
Ну а зная форматы пикселов (положение битов, отводящихся под каждую составляющую цвета) для 16-битного и 32-битного цвета их без особых усилий можно преобразовать один в другой.
Ну а зная форматы пикселов (положение битов, отводящихся под каждую составляющую цвета) для 16-битного и 32-битного цвета их без особых усилий можно преобразовать один в другой.
Я тоже думал в этом направление, но к сожелениею этот вариант не работает. Я задавал допустимую погрешность и сравнивал что разница не больше заданой погрешности.
Заданный цвет RGB(R1,G1,B1)
Просканированный цвет RGB(R2,G2,B2)
Сравнивал по следуюшей формуле
If ABS(R1-R2) < 50 And ABS(G1-G2) < 50 And ABS(B1-B2) < 50 Then
ABS () - абсолютное число
50 - это погрешность.
Тут есть одна проблемма. С погрешностью в 50 он находит только цвета с небольшими отклонениями в оттенках, тоесть он найдёт все светло синие но не найдёт тёмно синих. А если увеличить погрешность то тут уже начинают подходить и совсем другие цвета.
Вот подумываю может ешё и по сумме сделать ограничение.
Вечером попробую следуюшее. Увеличить погрешность но добавть ешё одну проверку по сумме R+G+B
If ABS(R1-R2) < 70 And ABS(G1-G2) < 70 And ABS(B1-B2) < 70 Then
R=ABS(R1-R2)
G=ABS(G1-G2)
B=ABS(B1-B2)
If R+G+B < 150 Then
:)
End If
End If
Хм. Неплохая идея. По крайне мере с первого восприятия она кажеться лучше.
Пошёл собирать информацию про систему HSB, и переваривать прочитаное.
Т.е. пространство (R,G,B) можно апредставить 3-х мерным (X,Y,Z)
dist^2=X^2+Y^2+Z^2 ~ R^2+G^2+B^2 тоже самое можно сделать и с HSB, всетаки яркость и насыщенность тоже несут информацию.
Из документации по формату JPEG:
1) Плавное преобразование цветового пространства: [R G B] -> [Y Cb Cr]
(R,G,B - 8-битовые величины без знака)
| Y | | 0.299 0.587 0.114 | | R | | 0 |
| Cb | = | -0.1687 -0.3313 0.5 | * | G | + |128|
| Cr | | 0.5 -0.4187 -0.0813 | | B | |128|
Новая величина Y = 0.299*R + 0.587*G + 0.114*B названа яркостью. Это – величина, исполь-зованная монохромными мониторами, чтобы представить цвет RGB. Физиологически, передает интенсивность цвета RGB воспринятого глазом.
Вы видите, что формула для Y, подобно средневзвешенному значению с разным весом для каж-дого спектрального компонента: глаз наиболее чувствителен на Зеленый цвет, затем следует Красный компонент и в последнюю очередь - Синий.
Величины Cb = - 0.1687*R - 0.3313*G + 0.5 *B + 128
и Cr = 0.5 *R - 0.4187*G - 0.0813*B + 128
названы цветовыми величинами и представляют 2 координаты в системе, которая измеряет от-тенок и насыщение цвета ([Приближенно], эти величины указывают количество синего и крас-ного в этом цвете).
Эти 2 координаты кратко названы цветоразностью.
Да, виноват
+10 за ссылку. Выношу в "Важное".;)
Т.е. пространство (R,G,B) можно апредставить 3-х мерным (X,Y,Z)
dist^2=X^2+Y^2+Z^2 ~ R^2+G^2+B^2 тоже самое можно сделать и с HSB, всетаки яркость и насыщенность тоже несут информацию.
Честно сказать не понял.
Можно более детально.
Ну чтож. Я воспользовался твоим совет, и он мне помог.
Что хорошо в системе HSB - это то что диапозон цвета не такой большой как в RGB, всего 360 цветов.
Я сравниваю цвета используя только Hue (значение цвета).
Но нужно будет дабавить сравнение по яркости (brightness) и насыщенности(saturation) так как есть варианты когда цвет с большой насыщенностю становиться очень близок к белому или наоборот при маленькой насыщенности становиться близок к чёрному. Конечно используя определёную погрешность.
Хотя это тоже не всегда работает.
Дапустим если я сканирую что то монотоное то всё работает как надо а вот если сканирую что то цветастое (дапустим картинку) то тут уже проблема. Програме удаёться найти нужные цвета там где человеческий глаз их не видет.
Дапустим я ишю цвета в зелёном диапозоне и програма находит их там где человеческий глаз видит только один желтый. Я знаю что зелёный и желтый похожие цвета и они находяться рядом, поэтому допускаю нахождение зелёных точет рядом с жёлтыми при этом не нарушая желтой эдилии.
Это конечно можно обойти кучей проверок, что я уже и начал делать - но дело это не благодарное и очень сильно замедляет программу.
Может кто знает как можно (и можно ли вобше) снимать шумы (грязь) с картинки.
Можно более детально.
Ну на самом деле разница от того,что ты делал через ABS(R2-R1)... не большая, просто у тебя областью будет параллепипед, а в этом случае-сфера.
расстояние определяется аналогично тому, как это делается в декартовых кооринатах.
Пусть имеются два цвета (R1,G1,B1) и (R2,G2,B2). Представляем эти компоненты как коорлинаты X,Y,Z. Тогда расстояние между двумя этими точками (цветами) будет определяться так:
d=sqrt((R2-R1)^2+(G2-G1)^2+(B2-B1)^2);
и есть порог L (аналогично твоему 50), тогда условие будет выглядеть так: d<=L или d^2<=L^2.
Думаю, что это всеже тебе всеравно не поможет :(
Надо всеже что-то с HSB делать....
Либо, если я понял твою задачу, то тебе нужно всю картинку изрисовать из определенного набора цветов, тогда просто смотришь по кратчайшему расстоянию