Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнение цвета

21K
22 января 2007 года
Grinja
11 / / 18.01.2007
Всем привет.

Цель такая.
Итёт сканирование экрана, при этом заданы верхний и нижний предел цвета (дапустим от светло зелёного до тёмно зелёного).
Задача проверить, что просканированный цвет находиться в промежутке между задаными цветами.

Дапустим
Нижний предел = 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.
391
22 января 2007 года
Archie
562 / / 03.02.2005
Вообще не понятно, что тебе нужно сделать. Задача - проверить находится ли цвет в заданном промежутке: тут может быть только два результата: да, находится или нет, не находится, а у тебя результат скана - какое-то число... И потом, как сравнивать два цвета? Как ты определяешь, что розовый, скажем, больше, чем оранжевый, но меньше, чем зеленый?
1.9K
22 января 2007 года
AxXxB
229 / / 21.11.2006
Опа! А почему кросспостируешь? Не делай двух одинаковых тем в разных разделах!
21K
22 января 2007 года
Grinja
11 / / 18.01.2007
Цитата: AxXxB



Сорру. Изночально не там открыл.

21K
22 января 2007 года
Grinja
11 / / 18.01.2007
Цитата: Archie
Вообще не понятно, что тебе нужно сделать. Задача - проверить находится ли цвет в заданном промежутке: тут может быть только два результата: да, находится или нет, не находится, а у тебя результат скана - какое-то число...



Так мне и нужно выяснить - подходит или нет.
Да - результат скана число (типа long) но его можно представить в системе RGB (Red,Gren,Blue).

Цитата: Archie
И потом, как сравнивать два цвета? Как ты определяешь, что розовый, скажем, больше, чем оранжевый, но меньше, чем зеленый?



Мне не нужно сравнивать разные цвета, а нужно выяснить что цвета одинаковые (человеческому глазу).
Дапустим - Я задал тёмно зелёный и светло зелёный и мне нужно проверить что просканированный цвет близок к задданым. Тоесть тоже зелённый но с каким то другим оттенком.

У меня уже есть пару идей.
На выходных буду пробывать.

6.7K
22 января 2007 года
Kessler
42 / / 02.08.2005
Лучшим (по-моему :) ) будет разложить полученное 32 (или 16) битное значение цвета на 3 составляющие, а потом взяв некоторое допустимое отклонение для каждой из составляющих сравнить цвета. Сравнить изначальные числа без разложения будет довольно сложно, так как изменение составляющей цвета, стоящей в старших разрядах числа очень сильно изменяет это число.
Ну а зная форматы пикселов (положение битов, отводящихся под каждую составляющую цвета) для 16-битного и 32-битного цвета их без особых усилий можно преобразовать один в другой.
391
22 января 2007 года
Archie
562 / / 03.02.2005
Цвет можно представлять не только в RGB. Для сравнения именно цветовой компоненты, лучше использовать систему HSB (Hue, Saturation, Brightness). Тогда значения яркости (brightness) и насыщенности(saturation) можно отбросить, а сравнивать только цветовою компоненту (hue), ну, или еще как. В любом случае, модель RGB самая неудачная, если речь идет именно о восприятии цвета глазом.
21K
23 января 2007 года
Grinja
11 / / 18.01.2007
Цитата: Kessler
Лучшим (по-моему :) ) будет разложить полученное 32 (или 16) битное значение цвета на 3 составляющие, а потом взяв некоторое допустимое отклонение для каждой из составляющих сравнить цвета. Сравнить изначальные числа без разложения будет довольно сложно, так как изменение составляющей цвета, стоящей в старших разрядах числа очень сильно изменяет это число.
Ну а зная форматы пикселов (положение битов, отводящихся под каждую составляющую цвета) для 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

21K
23 января 2007 года
Grinja
11 / / 18.01.2007
Цитата: Archie
Цвет можно представлять не только в RGB. Для сравнения именно цветовой компоненты, лучше использовать систему HSB (Hue, Saturation, Brightness). Тогда значения яркости (brightness) и насыщенности(saturation) можно отбросить, а сравнивать только цветовою компоненту (hue), ну, или еще как. В любом случае, модель RGB самая неудачная, если речь идет именно о восприятии цвета глазом.



Хм. Неплохая идея. По крайне мере с первого восприятия она кажеться лучше.

Пошёл собирать информацию про систему HSB, и переваривать прочитаное.

505
24 января 2007 года
vAC
343 / / 28.02.2006
Попробуй еще определять порог не по отклонениям каждой компоненты, а через квадрат расстояния (чтобы не извлекать корень).
Т.е. пространство (R,G,B) можно апредставить 3-х мерным (X,Y,Z)
dist^2=X^2+Y^2+Z^2 ~ R^2+G^2+B^2 тоже самое можно сделать и с HSB, всетаки яркость и насыщенность тоже несут информацию.
505
24 января 2007 года
vAC
343 / / 28.02.2006
Если еще актуально, то вот описание по 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 названа яркостью. Это &#8211; величина, исполь-зованная монохромными мониторами, чтобы представить цвет 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 координаты кратко названы цветоразностью.
391
24 января 2007 года
Archie
562 / / 03.02.2005
HSB к YCbCr не имеет никакого отношения, и не стоит их путать. Правильный алгоритм преобразования можно взять здесь: http://www.cs.rit.edu/~ncs/color/t_convert.html#RGB%20to%20HSV%20&%20HSV%20to%20RGB
505
24 января 2007 года
vAC
343 / / 28.02.2006
Цитата: Archie
HSB к YCbCr не имеет никакого отношения, и не стоит их путать. Правильный алгоритм преобразования можно взять здесь: http://www.cs.rit.edu/~ncs/color/t_convert.html#RGB%20to%20HSV%20&%20HSV%20to%20RGB



Да, виноват

9
24 января 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Archie
HSB к YCbCr не имеет никакого отношения, и не стоит их путать. Правильный алгоритм преобразования можно взять здесь: http://www.cs.rit.edu/~ncs/color/t_convert.html#RGB%20to%20HSV%20&%20HSV%20to%20RGB



+10 за ссылку. Выношу в "Важное".;)

21K
24 января 2007 года
Grinja
11 / / 18.01.2007
Цитата: vAC
Попробуй еще определять порог не по отклонениям каждой компоненты, а через квадрат расстояния (чтобы не извлекать корень).
Т.е. пространство (R,G,B) можно апредставить 3-х мерным (X,Y,Z)
dist^2=X^2+Y^2+Z^2 ~ R^2+G^2+B^2 тоже самое можно сделать и с HSB, всетаки яркость и насыщенность тоже несут информацию.



Честно сказать не понял.
Можно более детально.

21K
24 января 2007 года
Grinja
11 / / 18.01.2007
Цитата: Archie
Цвет можно представлять не только в RGB. Для сравнения именно цветовой компоненты, лучше использовать систему HSB (Hue, Saturation, Brightness). Тогда значения яркости (brightness) и насыщенности(saturation) можно отбросить, а сравнивать только цветовою компоненту (hue), ну, или еще как. В любом случае, модель RGB самая неудачная, если речь идет именно о восприятии цвета глазом.



Ну чтож. Я воспользовался твоим совет, и он мне помог.
Что хорошо в системе HSB - это то что диапозон цвета не такой большой как в RGB, всего 360 цветов.
Я сравниваю цвета используя только Hue (значение цвета).
Но нужно будет дабавить сравнение по яркости (brightness) и насыщенности(saturation) так как есть варианты когда цвет с большой насыщенностю становиться очень близок к белому или наоборот при маленькой насыщенности становиться близок к чёрному. Конечно используя определёную погрешность.

Хотя это тоже не всегда работает.
Дапустим если я сканирую что то монотоное то всё работает как надо а вот если сканирую что то цветастое (дапустим картинку) то тут уже проблема. Програме удаёться найти нужные цвета там где человеческий глаз их не видет.

Дапустим я ишю цвета в зелёном диапозоне и програма находит их там где человеческий глаз видит только один желтый. Я знаю что зелёный и желтый похожие цвета и они находяться рядом, поэтому допускаю нахождение зелёных точет рядом с жёлтыми при этом не нарушая желтой эдилии.

Это конечно можно обойти кучей проверок, что я уже и начал делать - но дело это не благодарное и очень сильно замедляет программу.

Может кто знает как можно (и можно ли вобше) снимать шумы (грязь) с картинки.

505
24 января 2007 года
vAC
343 / / 28.02.2006
Цитата: Grinja
Честно сказать не понял.
Можно более детально.


Ну на самом деле разница от того,что ты делал через 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 делать....

505
24 января 2007 года
vAC
343 / / 28.02.2006
Всетаки лучше будет чере HSB сделать. Открой любую прогу с настройкой палитры (Paint например) покрути там настройку цвета. Я посмотрел и пришел к выводу что нужно просто установить пороги на все компоненты HSB, разумеется для каждой свой. Только их надо подбирать...
Либо, если я понял твою задачу, то тебе нужно всю картинку изрисовать из определенного набора цветов, тогда просто смотришь по кратчайшему расстоянию
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог