ЭЛЕКТРОНИКА Нужен алгоритм для сравнения показания датчика цвета с готовыми цветами.

MegaSova

✩✩✩✩✩✩✩
10 Янв 2023
6
0
Здравствуйте, у меня есть датчик цвета, от детского робототехнического конструктора, который показывает совершенно не адекватные цвета. Я с горем пополам смог от него добиться стабильных значение rgbw полторы. Мне нужен алгоритм, для того чтобы сравнивать значения rgbw датчика, со значениями какого-то цвета и чтобы алгоритм выдавал самые мне номер самого подходящего по параметрам датчика.
Меня хватило лишь на нахождение процентного соотношения между красными зелёными и тд, и нахождении среднего арифметического между этими процентами, по идее должен выдавать в процентах соотношение 1 цвета к другому. Но с этим есть проблема, если у зелёного процентное 120 а у красного 80 то среднее будет 100% что не верно. Помогите, уже 5 часов рою интернет не найду нужной инфы. Буду рад даже статьям на эту тему.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
Если нужен именно цвет, то проще в цветовой модели HSV сравнивать.
 

MegaSova

✩✩✩✩✩✩✩
10 Янв 2023
6
0
Но датчик может выдать лишь rgbw, хотя надо почитать по преобразователям rgbw в hsv.
 

poty

★★★★★★✩
19 Фев 2020
3,265
949
@MegaSova, ничего не понял. Как получаются проценты? Почему вычисляется среднее арифметическое между цветами? Что нужно получить?
Если во внятных терминах не получается, может на примере объясните?
 

Сотнег

★★★★★★★
15 Янв 2020
4,456
1,523
если у зелёного процентное 120 а у красного 80 то среднее будет 100% что не верно
А что верно?
И 120% - это в какой системе счисления?

чтобы алгоритм выдавал самые мне номер самого подходящего по параметрам датчика
Тут я потерял нить повествования.
Объясните на пальцах, что там у вас происходит?
 

MegaSova

✩✩✩✩✩✩✩
10 Янв 2023
6
0
Я для сравнения 2 красных цветов использую процентное соотношение, которое показывает в процентах насколько красный у датчика похож на красный у заданных цветов. И так же делаю с зелёным, голубым и яркостью. После этого мне надо с 4 процентных соотношения превратить в 1(общее).

Или по другому, у меня есть rgbw, я хочу чтобы алгоритм кушая rgbw говорил мне какой это цвет. Зная несколько цветов и их rgbv характеристики. При том что у датчика есть разброс в 10-20 процентов. То есть я не могу сравнивать датчик напрямую с характеристиками цвета, слишком разброс большой. По этому мне нужно чтобы алгоритм выдавал тот цвет который по rgbw политре максимально похож на заданные заранее цвета.

Если нужно могу ещё и в конкретику моей ситуации упаротся, но вам не понравится. Там визуальное программирование, по этому мне нужен не код а принцип чтобы написать на нем.

Процентное соотношение может выдает отношение одного числа к другому в процентах. 50 к 10 будет 500%, 10 к 50 будет 20%. Считается x:y*100. Не факт что я использую лучший способ, это то, что пришло мне в голову пока я над этим думал.
 

MegaSova

✩✩✩✩✩✩✩
10 Янв 2023
6
0
Я изначально хочу замерить несколько цветов и записать их характеристик в массивы. После этого сравнивать датчик с этими массивами.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Если принять составляющие по байту, то 4 байта это туева хуча вариантов. Что бы сократить можно убрать нюансы сдвигом вправа, взяв вместо байта пол байта, или 3 бита или даже 2.
 

Сотнег

★★★★★★★
15 Янв 2020
4,456
1,523

@MegaSova,
я все равно нифига не понял.
Экстрасенс подсказывает:

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

Оно?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
насколько красный у датчика похож на красный у заданных цветов
Для такой задачи RGB не подходит, тем более если сравнивать в "процентах". Переводите в HSV, в нем есть канал, который показывает именно какой цвет, по его шкале и определяйте на сколько красный действительно красный.
 

MegaSova

✩✩✩✩✩✩✩
10 Янв 2023
6
0
Для такой задачи RGB не подходит, тем более если сравнивать в "процентах". Переводите в HSV, в нем есть канал, который показывает именно какой цвет, по его шкале и определяйте на сколько красный действительно красный.
С этим будет проблема, датчик выдает какие-то свои единиц, по этому я и хотел использовать для сравнения характеристики цвета такие как видит этот датчик


@MegaSova,
я все равно нифига не понял.
Экстрасенс подсказывает:

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

Оно?
Интереснее, он по пол секунды светит красным и замеряет силу отраженного света, также с зелёным, с синим, и общую яркость светя 3 светодиодами. По итогу у меня массив в котором 4 значения, яркость отражения красного,зелёного, синего и общая яркость. Мне нужно его сравнить с несколькими другими массивами в которых указаны характеристики разных цветов. Ну да мне нужно сравнить массив получаемый от датчика со своей политрой. Формата "красный зелёный синий белый"
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
он по пол секунды светит красным и замеряет силу отраженного света, также с зелёным, с синим, и общую яркость светя 3 светодиодами. По итогу у меня массив в котором 4 значения, яркость отражения красного,зелёного, синего и общая яркость.
Ну, отбросьте общую яркость - будет обычный RGB. Далее по формуле например отсюда: RGB to HSV, HSV to RGB Conversion Calculator (had2know.org) вычисляем H-канал, это и будет цвет независимо от яркости и насыщения.
 

poty

★★★★★★✩
19 Фев 2020
3,265
949
@Сотнег, аналогично.
@Геннадий П, да там все измерения - в попугаях, их нужно сначала нормализовать, иначе в формуле они дадут неверные значения (не думаю, что датчик имеет собственную обработку). По хорошему нужно экспериментально найти гамму, преобразовать по ней данные датчика, а потом уже подставлять в формулу. Проценты здесь вообще ни о чём, тем более усреднение по разным цветам (это как усреднять вилки и калоши).
Второй момент совершенно правильно уловил @Старик Похабыч, - нужно понять хватит ли разрешения у датчика, чтобы распознавать нужное количество цветов?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
да там все измерения - в попугаях, их нужно сначала нормализовать, иначе в формуле они дадут неверные значения (не думаю, что датчик имеет собственную обработку)
Если задача стоит только узнать цвет по цветовой окружности, то нормализовать особого смысла нет, т.к. цвет определяется по взаимному отношению уровней RGB-каналов. А вот если насыщенность и яркость, то действительно нужно нормализовать.
 

Сотнег

★★★★★★★
15 Янв 2020
4,456
1,523
Мне нужно его сравнить с несколькими другими массивами в которых указаны характеристики разных цветов.
Если так и планируете держать в секрете, какое мягкое вы собрались сравнивать с тёплым и с какой погрешностью, тогда общее решение выглядит так:
Приводите все свои массивы к общему формату и сравнивайте на здоровье.

Исходя из имеющихся вводных наиболее логичным будет приведение к формату RGB, где на каждый цвет приходится по 1 байту (значение цвета в диапазоне от 0 до 255).

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

Каким образом калибровать прибор (вводить коэффициенты для коррекции или обучать нейросеть) - это вряд ли сейчас нужно думать.
 

poty

★★★★★★✩
19 Фев 2020
3,265
949
@Геннадий П, проблема цвета без нормализации состоит в том, что уровни компонент в белом цвете не равны, а измерение производится одним датчиком.
 

MegaSova

✩✩✩✩✩✩✩
10 Янв 2023
6
0
Ладно, попробую упростить. У меня есть массив, датчик с 4 параметрами. И 6 массивов цветов, каждый со своими четырьмя параметрами. Мне нужен алгоритм который сравнит параметры массива датчика с параметрами массива цветов, и выдал массив цвета, данные которого наиболее подходящие к данным массива датчика.

Датчик мне говорит что характеристики цвета который он видит 113, 90, 19, 156. У меня есть несколько массивов цветов
Например черный 20, 20, 20, 50
Красный 120, 80, 20, 160
Жёлтый 80, 120, 20, 140
Синий 20, 190, 20, 130
(Данные в выдуманных попугаях)
Мне нужен алгоритм который сравнит данные датчика со всеми данными цветов и выдаст название цвета(в данном случае красный)
Я уже не знаю как проще объяснить.
 

Сотнег

★★★★★★★
15 Янв 2020
4,456
1,523

@MegaSova,
ищите минимум суммы квадратов разностей по модулю первых трёх параметров. Четвёртый параметр выкиньте.
C-like:
temp = abs(detectedR - arrayR[i]) + abs(detectedG - arrayG[i]) + abs(detectedB - arrayB[i]);
if (temp < min) {min = temp; index = i;}
Ну или попробуйте добавьте четвёртый тоже.
 
Изменено:
  • Лойс +1
Реакции: MegaSova

poty

★★★★★★✩
19 Фев 2020
3,265
949
Я бы предложил стандартный способ распознавания цвета:
1. Определил бы характеристику "гамма": зависимость значений яркости по всем 4 каналам от реальной яркости.
2. При сравнении полученного цвета приводил бы (пересчитывал) цветовые составляющие по графику гаммы к значению общей яркости. Например, принимаем линейную гамму и сравниваем:
113, 90, 19, 156 и 20, 20, 20, 50
после пересчёта яркости получаем:
36, 29, 6, 50 и 20, 20, 20, 50
Длина вектора разницы (по @Старик Похабыч) = 23.
Для 120, 80, 20, 160 это будет 13
Для 80, 120, 20, 140 - 45
Для 20, 190, 20, 130 - 137
Из чего делаем вывод, что Красный - ближе всех.
3. Если "массив цветов" содержит близкие цвета, то стоит подумать сначала об определении разрешения. Поясню: спектральная плотность составляющих, распознаваемых глазом, неоднородна, поэтому для разных длин волн изменение измеренной яркости и яркости "по RGB" будет совершенно другой. Там, где спектральная плотность ниже, погрешность в 20% может оказаться фатальной.
 
Изменено:

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
Математика это очень хорошо. Может бытьдостаточно следующее:
1. Суммируем значения всех датчиков
2. Вычисляем соотношения цветов(опять же,учитывая,скорей всего нелинейность оных)
3. Сравниваем с образцами в массивах задавая простой допуск безо всяких танцев.
 
  • Лойс +1
Реакции: MegaSova