Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705

Способы сравнить два почти идентичных цвета

25.05.2015, 04:51. Показов 6620. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два цвета:
C#
1
2
Color first = { A = 255; R = 150; G = 20; B = 20; }
Color second =  { A = 255; R = 170; G = 20; B = 20; }
Цвета почти идентичные, разница всего в 10ти единицах красного байта. Вот мне надо сделать так что бы цвета сравнивались с допуском, скажем, +-30.

Есть ли способ лучше чем сравнивать каждый байт цвета с учетом допуска?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2015, 04:51
Ответы с готовыми решениями:

Два почти идентичных запроса mysql_query выдают разные результаты
Всем привет! У меня возникла проблема. Я начинающий програмист і вот уже 6 час смотрю на строчку и ничего не могу понять. А проблема...

Как правильно сделать два почти идентичных ajax запроса без копирования дополнительного кода?
У меня есть два запроса ajax. Один выполняется при загрузке страницы и выдает данные, например за последний месяц, второй запрос...

Сравнить два цвета
Добрый день. Хочу сделать функцию на php, которая бы сравнивала два цвета (как это делает фотошоп - поле "допуск"). Подскажите,...

9
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
25.05.2015, 07:59
Перевести в модель HSV https://ru.wikipedia.org/wiki/... B%D1%8C%29 и сравнивать тон
1
80 / 58 / 11
Регистрация: 16.12.2013
Сообщений: 175
25.05.2015, 14:42
Если надо меру сходства такую, чтобы различие в цифрах было пропорционально различию в восприятии, то ни RGB ни HSV не подходят. Надо перевести в хроматические координаты XYZ (perceptual uniform chromatic coordinates, гуглите, там много всего). Тогда различие будет
C#
1
double chromaticDistance = Math.Sqrt((X1-X2)*(X1-X2) + (Y1-Y2)*(Y1-Y2) + (Z1-Z2)*(Z1-Z2));
Причем эта величина будет весьма точно соответствовать ощущению различия "на глаз" для человека со здоровым зрением.
1
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
26.05.2015, 03:03  [ТС]
Австрал, Похоже это то, что мне надо, мне как раз таки и надо сравнить не байты а как бы проверить, если цвет синий, синеватый, светло синий, темно синий или любого другого синеватого оттенка, то значит он синий.

Попробую Ваш код, отпишусь.
0
80 / 58 / 11
Регистрация: 16.12.2013
Сообщений: 175
26.05.2015, 07:50
Хроматические координаты XYZ являются линейным приближением и это приближение считается не очень точным. Зато оно вычисляется умножением на матрицу перехода 3х3. Есть, якобы, более точные нелинейные приближения, вроде L*a*b*. Но я глазом разницу не вижу. Может быть, продвинутый дизайнер разницу видит. Пишите, если чего не ясно.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
27.05.2015, 07:10  [ТС]
Австрал, Во общем сейчас вот добрался до алгоритма своего сразу вопрос по Вашему коду. Как мне перевести мой RGB цвет в эти хроматические координаты в коде?

Добавлено через 13 минут
Нашел вот кстати проэкт с этими всеми алгоритмами, но я в них на столько не понимаю что даже в GUI не могу ниего понять...
0
80 / 58 / 11
Регистрация: 16.12.2013
Сообщений: 175
27.05.2015, 08:50
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 private static Pt3 RGB2XYZ(Pt3 x) {            
            Pt3 srgb = x / 255.0;            
            return new Pt3(  0.4124 * srgb.x    + 0.3576 * srgb.y  + 0.1805 * srgb.z,
                                0.2126 * srgb.x    + 0.7152 * srgb.y  + 0.0722 * srgb.z,
                                0.0193 * srgb.x    + 0.1192 * srgb.y  + 0.9505 * srgb.z);            
        }
 
private static Pt3 XYZ2RGB(Pt3 x) {
            return new Pt3(3.2410 * x.x - 1.5374 * x.y - 0.4986 * x.z,
                            -0.9692 * x.x + 1.8760 * x.y + 0.0416 * x.z,
                            0.0556 * x.x - 0.2040 * x.y + 1.0570 * x.z) * 255.0;
 
        }
Pt3 - это просто точка трёхмерная {x,y,z}. Ну там операторы деления и умножения для неё определены.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
27.05.2015, 20:10  [ТС]
Австрал, Так мне вот как раз таки и не понятно как мне эту самую точку создать из цвета. Давайте так, вот у меня на выходе моих методов получается два цвета для сравнения:
C#
1
2
System.Windows.Media.Color color1;
System.Windows.Media.Color color2;
Как мне перевести эти два цвета в точки и потом их прогнать через Ваш алгоритм сравнения?

Добавлено через 1 час 49 минут
Во общем нашел библиотеки для работы с цветами. Перевел свои цвета в Lab, и попробовал отприделить Delta-E между моими цветами, и че то как то не очень мне результат понравился, ибо он почти такой же как и результат с моего метода:

Вот как может быть схожесть этих двух цветов равна `58,59767%` если один из них почти черный а второй красный:
Цвета: #222211 | #CF0F0C

А вот ваш алгоритм дал 27% совпадения, но должно быть еще меньше где то 7-12% ибо они ну ож очень разные с точки зрания восприятия человека...
C#
1
double chromaticDistance = Math.Sqrt((X1-X2)*(X1-X2) + (Y1-Y2)*(Y1-Y2) + (Z1-Z2)*(Z1-Z2));
Вот еще такой вот алгоритм нашел, он дал 25% совпадения
C#
1
2
double chromaticDistance =  (Math.Max(c1.R, c2.R) - Math.Min(c1.R, c2.R)) + (Math.Max(c1.G, c2.G) - Math.Min(c1.G, c2.G)) +
                (Math.Max(c1.B, c2.B) - Math.Min(c1.B, c2.B));
Добавлено через 38 минут
Короче почитав документацию к одной из библиотек и посмотрев на ее код, и нашел в ней метод который сравнивает два RGB цвета, и этот алгоритм дал мне 11.9% совпадения для моих цветов, я думаю это то, что мне нужно, лучшего результата не дал ни один из алгоритмов...

Библиотека тут: http://colormine.org/

Добавлено через 3 минуты
З.Ы. сравнивал через `Cie1976`. Пробовал еще варианты через: Cie94б`, `CieDe2000`, `Cmc` - но они давали 22-59% совпадения на мои цвета...
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
28.05.2015, 11:40
Цитата Сообщение от siriusED Посмотреть сообщение
Вот как может быть схожесть этих двух цветов равна `58,59767%` если один из них почти черный а второй красный:
Цвета: #222211 | #CF0F0C
возвращаемся к модели hsl и сравниваем тон (если нужен только цвет)
#222211 = hsl(60, 33%, 10%)
#CF0F0C = hsl(0, 89%, 42%)
разница в 60 градусов

+ Luminance если нужна еще и яркость
0
80 / 58 / 11
Регистрация: 16.12.2013
Сообщений: 175
02.06.2015, 08:29
siriusED, Вы что-то делаете неправильно. Дело в том, что L*a*b* - есть истина, а XYZ - линейное приближение истины. Эти хроматические координаты получены в результате исследования восприятия цвета десятками тысяч людей. Довольно давно, когда понадобилось, чтобы цветное кино и телевидение передавало цвета правильно. Вот в вашем же телевизоре цвета естественные? Это потому, что там при преобразованиях сигнала используется модель Lab.

А вот ваш алгоритм дал 27% совпадения, но должно быть еще меньше где то 7-12% ибо они ну ож очень разные с точки зрания восприятия человека...
C#
1
double chromaticDistance = Math.Sqrt((X1-X2)*(X1-X2) + (Y1-Y2)*(Y1-Y2) + (Z1-Z2)*(Z1-Z2));
Это не мой алгоритм, это строгая формула для расстояния в трёхмерном пространстве.

Согласен, что XYZ немного врёт на краях хроматического пространства. Вблизи чисто чёрного или чисто красного, например. Но, именно немного. А Lab - не врёт и врать не может.

Ну вот для примера, палитра от красного до чёрного с шагом 20%, сделана через XYZ координаты.
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.06.2015, 08:29
Помогаю со студенческими работами здесь

Как сравнить два цвета?
Всем привет. Подскажите начинающему програмировать как можна сравнить два цвета один и котрых задан ро умолчанию, а второй должен браться...

Два идентичных запроса SQL
СУБД POSTGESQL. Анализирую чужой код. Есть таблица Коды, в ней столбец Ключ типа text и столбец Запись типа boolean, есть 2 запроса: ...

Два идентичных куска кода работают по-разному
Разбираю чужой код. В одном случае $realty = new Realty(); $ass_user = new User(); ...

Два идентичных файла. В одном выдает ошибку, в другом - нет
Помогите, пожалуйста!! Уже часа 2 сижу колупаюсь и не могу понять что не так! Есть 2 файла, начальный код - одинаковый. Создано 2 таблички...

Два практически идентичных кода, но один почему-то работает медленней
Почему мой код работает намного медленнее? Ведь по сути одно и то же! Мой код: int ans = 0; set<int> check; for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru