Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

Определение доминирующего цвета на изображении

16.08.2019, 08:10. Показов 8373. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую ребята, подскажите пожалуйста, как определить доминирующие цвета на изображении ? Есть массив пикселей в формате RGB, есть идея сложить все значения по каналу и разделить на количество пикселей, или нужно использовать другую цветовую модель ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2019, 08:10
Ответы с готовыми решениями:

Выделение цвета в изображении
Здравствуйте, есть изображение на котором есть пиксели с белым цветом, нужно убрать с изображения все пиксели кроме белого цвета ...

Изменение цвета в изображении с сохранением текстуры
Имеется изображение PNG с прозрачностью. Допустим вот такое Имеется задача менять цвет этого изображения, конкретно отображаемых...

Подсчет количества элементов одинакового цвета на изображении
В общем нужна программа подсчета количества лесных вырубок на космоснимке. Благодаря этому форуму получилось это: ...

29
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
16.08.2019, 08:23
Цитата Сообщение от Почтальон Посмотреть сообщение
есть идея сложить все значения по каналу и разделить на количество пикселей
И что в итоге получится?

Вам, видимо, надо построить гистограмму цветов.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
16.08.2019, 08:30  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
И что в итоге получится?
Думаю что получится чушь , сейчас в интернетах курю как можно сделать
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
16.08.2019, 08:48
Почтальон, решение "в лоб" - словарик вида Dictionary<ulong, long>, где первое число - цвет, второе - счётчик. Можно несколько таких словарей для многопоточной обработки, с последующим слиянием их содержимого.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
16.08.2019, 09:09
Usaga, так цвета отличающиеся на 1 байт будут считаться разными, хотя для человека они неотличимы.
Статистика будет теряться, и в итоге так же получится ерунда.
Я думаю что для довольно маленького изображения вообще каждый пиксель может быть уникальный
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
16.08.2019, 09:16
Рядовой, почему ерунда? Получится подсчёт всех встречающихся цветов на изображении. Другое дело, что таких цветов действительно будет дофига, но ТС не оговаривался об этом моменте. Можно и сжать палитру до каких-нибудь 256-ти цветов при подсчёте, не проблема. То, что я выше описал я явно назвал решением "в лоб".
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
16.08.2019, 09:40  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Можно и сжать палитру до каких-нибудь 256-ти цветов при подсчёте
Еще хуже - до одного цвета

Добавлено через 3 минуты
Ну или хотя бы трех

Добавлено через 2 минуты
Думаю что тут вообще нужно будет использовать HSI, а не RGB, чтобы можно было определить цветовой тон
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
16.08.2019, 09:42
Почтальон, это уже детали)
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
16.08.2019, 09:56
Цитата Сообщение от Почтальон Посмотреть сообщение
подскажите пожалуйста, как определить доминирующие цвета на изображении ?
Цитата Сообщение от Рядовой Посмотреть сообщение
Usaga, так цвета отличающиеся на 1 байт будут считаться разными, хотя для человека они неотличимы.
Предлагаю свой вариант. 3 счетчика для R, G, B каналов. Значение пикселя RGB(R = 225, G = 220, B = 15). По значению доминирующим каналом является R, соответственно цвет пикселя это оттенок красного цвета, значит инкрементим счетчик R, и т.д.. Думаю идея понятна.
0
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,379
16.08.2019, 09:58
Цитата Сообщение от Почтальон Посмотреть сообщение
как определить доминирующие цвета на изображении
Есть такой научный термин - кластерный анализ.
Цвета пикселов картинки - это точки в трёхмерном гиперкубе со сторонами [0,255]. Надо найти сгущения точек внутри этого объёма.
Беда в том, что таких сгущений/кластеров может быть >1. Либо всё может быть настолько равномерно размазано, что результат попытки выделения неоднородностей выйдет недостоверным.

Ещё вариант - рубануть исходную палитру до 256/16 цветов методом медианного сечения (median cut), и найти среди получившихся сечений исходного гиперкубика сечение (трёхмерный параллелепипед) с наименьшим объёмом. Т.к. данный алг стремится в каждое сечение запихать примерно равное (насколько это ему позволит дискретнозначная природа данных) число точек - то меньшему объёму сечения будет соответствовать бОльшая плотность (термин из статистики) данных. Т.е. по сравнению с гистограммой - число точек, попавших в некоторый одно/многомерный интервал, отражается не высотой столбика гистограммы, а шириной/объёмом.
И в найденном наименьшем сечении взять средний цвет попавших туда пикселов.
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
16.08.2019, 10:02  [ТС]
Цитата Сообщение от anapshy Посмотреть сообщение
Думаю идея понятна.
если честно - нефига не понятна
Скорее всего изображение из RGB нужно перевести в HSL, и уже обрабатывать количество пикселей по H-каналу, каких больше - такой цвет и преобладает
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
16.08.2019, 10:14
Так же может быть такое, что значение двух каналов совпадут, допустим RGB(225, 225, 25) - это вроде как будет оттенок желтого цвета. Т.е. добавить счетчик для желтого цвета. RGB(50, 50, 50), RGB(100,100,100) - оттенки серого.

Добавлено через 5 минут
Почтальон, тем способом предлагал выбрать доминирующий канал на изображении. Если нужно прям по цветам различать, то да, как вариант HSL. По H свою границу выстроить где какой цвет начинается, или в интернете уже готовое поискать.
1
 Аватар для Immo
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
16.08.2019, 10:18
стоит ознакомиться
1
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
16.08.2019, 10:20
https://m.habr.com/ru/post/136530/
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
16.08.2019, 15:32  [ТС]
Toros1992, это уже читал, можно вообще заюзать OpenCV.
Сейчас попробую конвертнуть в HSL, а там уже видно будет.

Добавлено через 5 часов 2 минуты
Конвертнул в HSB, осталось только сгруппировать и кажется получается то, что нужно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
16.08.2019, 20:32
Цитата Сообщение от Почтальон Посмотреть сообщение
осталось только сгруппировать
А это и есть главная проблема....
Пример для линейной системы (черно-белого изображения).
Шкала 0-100.
Есть семь точек: три - 10, две - 88 и две - 100. Какой цвет доминирующий? 10, 94, 58?
0
31 / 22 / 11
Регистрация: 15.08.2019
Сообщений: 125
16.08.2019, 23:45
Почтальон, А если разложить изображение на пиксели. Через цикл узнать сколько красных, зеленых и синих цветов. Потом, по идее, если конечный результат точек всех трёх цветов разделить на количество пикселей, получим средние значения красных, зелёных и синих точек.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
17.08.2019, 08:25  [ТС]
Цитата Сообщение от Frixon Посмотреть сообщение
А если разложить изображение на пиксели. Через цикл узнать сколько красных, зеленых и синих цветов. Потом, по идее, если конечный результат точек всех трёх цветов разделить на количество пикселей, получим средние значения красных, зелёных и синих точек
про это я уже описывал:
Цитата Сообщение от Почтальон Посмотреть сообщение
есть идея сложить все значения по каналу и разделить на количество пикселей
и
Цитата Сообщение от Почтальон Посмотреть сообщение
Думаю что получится чушь
Так с цветами не работатют

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Какой цвет доминирующий?
10, т.к. наибольшее количество пикселей одного тона.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А это и есть главная проблема....
Нее, это уже не проблема, группируются данные по тональности, яркость уже вторична. Полагаю с linq это решается на раз-два

Добавлено через 2 минуты
Цитата Сообщение от Frixon Посмотреть сообщение
Через цикл узнать сколько красных, зеленых и синих цветов.
Каждый цвет состоит из этих составляющих, но в разной пропорции
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
17.08.2019, 09:55
Цитата Сообщение от Почтальон Посмотреть сообщение
10, т.к. наибольшее количество пикселей одного тона.
То есть просто наиболее часто встречающийся цвет?
Хотя (как в моём примере) он может быть визуально и не самый доминирующий?
Я чему это.
Если вам просто какая-то статистическая обработка нужна это одно.
Если же это какой-то пользовательский интерфейс и надо учитывать человеческий факто то это совсем другое.

Ещё пример (точка-количество): 3-10, 2-95, 2-96, 2-97, 2-98, 2-99, 2-100.
Статистически - наиболее часто встречающийся цвет - это 10.
Но для пользователя-человека цвет 10 заметен почти не будет и такой выбор будет неожиданностью.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
17.08.2019, 21:26
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но для пользователя-человека цвет 10 заметен почти не будет и такой выбор будет неожиданностью.
Например, если количества какого-то цвета меньше скольких-то процентов от общего изображения, искать значение у которого максимальное количество ближайших соседей (кол-во соседей задается программно, или пропорционально от размеров изображения, или от чего-то другого), такой оттенок цвета и будет доминирующий. Но только не знаю как KNN повлияет на длительность анализа изображения, если изображение будет, допустим, в формате 4К.

Добавлено через 5 минут
Если так задумать, то решение вроде бы лежит на поверхности. Но если начать учитывать какие-то факторы, то оказывается, что здесь нужен большой спектр работ всё будто бы сразу усложняется в степени двойки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2019, 21:26
Помогаю со студенческими работами здесь

Определение центров объектов на изображении
Добрый день. Имеется бинарное изображение. Требуется определить координаты центров каждого объекта. Для одного объекта делается...

с++ Opencv 2.4 Определение лица на изображении
установил opencv2.4 http://www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/ Определение лица на изображении. ...

Определение статических жестов на изображении
Привет всем, задача такая. Есть фотки руки, где показано: два, три и четыре пальца.(фотки я вложил) Нужно создать программу которая...

Определение границы сильно зашумленного объекта на изображении
Подскажите, как лучше детектировать радиус объекта на таком изображении? Сделала фильтрацию и получила второе изображение. Буду...

Определение локальных координат указателя мыши на изображении компонента TImage
Подскажите пожалуйста, как можно определить координаты (не экранные) указателя мыши при перемещении его по компоненту TImage? Мне это нужно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru