Как узнать цвет пикселя opencv python
Обнаружение и фильтрация цвета OpenCV с использованием Python
Определение и фильтрация цветов OpenCV - отличное место для начала разработки OpenCV Python. В этой статье я представлю базовую программу Python, чтобы начать использовать OpenCV. Программа позволит пользователям опробовать процедуры цветовой фильтрации и обнаружения. Эта статья знаменует начало моего создания робота для обнаружения объектов.
OpenCV (библиотека компьютерного зрения с открытым исходным кодом) используется для фильтрации изображений, полученных из видеопотоков, видеофайлов или файлов изображений. При использовании поддерживаемого языка программирования вы можете создавать программы для использования камеры в качестве датчика для обнаружения и отслеживания элементов изображения. Если вы можете изолировать элементы на изображении, вы можете обнаруживать и отслеживать элементы в видеопотоке.
Пластиковые шары красный, синий, желтый и зеленый
Pi Wars 4.0 2018
Я интересовался OpenCV несколько лет, но до сих пор плохо им пользовался. Моя мотивация для работы с OpenCV в последнее время - недавние Pi Warsигра. Одна из задач в игре называется «где-то над радугой». Эта задача требует, чтобы соревнующиеся роботы обнаружили четыре шара четырех разных цветов (красный, синий, желтый и зеленый). Робот должен управлять каждым шаром в определенной цветовой последовательности, чтобы выполнить задание до наилучшей доступной точки.
Итак, чтобы иметь возможность приложить некоторые усилия в испытании «Где-то на радуге», я посмотрю, как определять четыре разных цвета. Следовательно, определение цвета OpenCV является хорошей отправной точкой для определения четырех представляющих интерес цветов: красного, синего, желтого и зеленого.
Определение цвета OpenCV
Определение цвета OpenCV - это только отправная точка. Конечная цель - наконец использовать код Python 3 для определения положения элемента цвета в кадре видеопотока. Поэтому, если я могу изолировать и отслеживать элементы в видеопотоке, я могу, например, установить путевую точку для робота.
Установить OpenCV
Чтобы запустить образец программы Python для определения цвета OpenCV, необходимо установить OpenCV на Raspberry Pi или в ОС Windows.
Raspberry Pi
Чтобы быстро установить OpenCV на Raspberry Pi, вы можете установить OpenCV из файла сценария оболочки в соответствии с этой статьей. Вы можете загрузить и запустить сценарий оболочки для установки OpenCV и всех зависимостей сразу.
Из сценария оболочки -ссылкаУстановите OpenCV на Raspberry Pi.
Windows 10
Если вас интересует запуск OpenCV в Windows 10, вам необходимо установить Python. Затем используйте диспетчер пакетов Python pip для установки библиотек Numpy и OpenCV. Я считаю, что Python включает диспетчер пакетов pip с установкой Windows Python.
- Загрузите и установите последнюю версию программного обеспечения Python 3 для Windows.
- Затем установите следующие пакеты в командной строке Windows:
Теперь приложение Idle можно использовать для запуска и редактирования кода Python в Windows.
Пример кода обнаружения цвета OpenCV
Мой GitHub предоставляет две версии примеров кода Python 3 для определения цвета OpenCV. Единственная разница между ними - это тип средств массовой информации, которые они открывают. Таким образом, один пример кода Python открывает файл изображения, а другой - видеопоток. Однако, если вы запускаете Linux или Raspberry Pi в среде виртуальной машины, как выборЗадний, Вы можете открывать только файлы изображений или видео.
Камера Raspberry Pi
Для моей цели и совместимости с образцами кода я использую дешевую веб-камеру Banggood, совместимую с USB Raspberry Pi (номер продукта: 1023048). Веб-камера, которая стоит 5,10 фунтов стерлингов (6,67 долларов США), более мощная, чем камера Raspberry Pi с более длинным кабелем.
Однако, если вы хотите использовать камеру Raspberry Pi с приведенным ниже примером кода, проверьте следующие ресурсы, чтобы найти ссылку на руководство. Это руководство объяснит, как использовать камеру Raspberry Pi в OpenCV.
Как работает пример программы Python
Запустите следующий код, используя приложение Python Idle на Raspberry Pi или рабочем столе Windows. Окно должно появиться на рабочем столе, как показано на изображении выше. Вы можете манипулировать ползунком HSV (оттенок, насыщенность, значение), чтобы изолировать цвета, которые должны быть обнаружены в изображении.
При использовании ползунка GUI для определения нового цвета сначала сбросьте ползунок. Таким образом, первые три ползунка становятся равными нулю, а три нижних - 255. Сначала нужно изменить низкие и высокие значения оттенка, чтобы зафиксировать желаемый цвет. Затем отрегулируйте низкую насыщенность и значение для точной настройки.
Выбранный диапазон значений HSV от низкого до высокого будет использоваться для создания маски вокруг обнаруживаемого цветового профиля. Попробуйте разные изображения, чтобы лучше понять проблемы выделения разных цветов.
Пожалуйста, просмотрите две версии и тестовые изображения, которые GitHub связал с этим кодом в ссылках ниже.
Код обнаружения цвета OpenCV
OpenCV хорошо документирован, просто погуглите метод OpenCV, с которым вы не знакомы, вы можете найти дополнительную информацию о нем.
Код определения цвета OpenCV выполняет следующие шаги:
- Загрузите образец изображения.
- Получите значение HSV из ползунка графического интерфейса.
- Отобразите исходный образец изображения на рабочем столе ОС.
- Образец изображения размывается и отображается на рабочем столе.
- Преобразуйте размытое изображение в цветовую модель HSV.
- Используйте значения в диапазоне, выбранном ползунком, для создания маски. Затем отобразите сгенерированную маску.
- Используйте функцию «морфологического преобразования», чтобы очистить маску. Затем отобразите сгенерированную маску.
- Примените последнюю маску к исходному изображению, что оставит интересующий цвет неизменным.
- Наконец, отображается сгенерированное изображение.
эксперимент
Используйте приведенный выше код, чтобы поэкспериментировать с разными образцами изображений. Попробуйте выделить различные элементы на образце изображения. Кроме того, попробуйте разные методы размытия и попробуйте настроить значение размытия, чтобы увидеть, как это имеет значение. Статью OpenCV о сглаживании изображений можно найти вВот。
Морфологическая трансформация
Операция преобразования формы, используемая в примере кода, помогает заполнить дыры в круглом цветном шаре, который я пытаюсь отфильтровать. При использовании только цветовой фильтрации темные тени и точки лампочек могут стать причиной несовершенных масок изображения. Чтобы узнать больше о морфологическом преобразовании, посетите документацию OpenCV.это здесь。
Размер эллипса зависит от размера пятна, которое вы хотите закрыть или открыть.
Что дальше
Если у вас есть совместимая веб-камера, попробуйте версию кода Python для захвата видео. Найдите ссылку на код в разделе «Ссылки» ниже.
Пример кода может быть тем минимумом, который вы хотите начать. Однако для обнаружения объектов, которые сложнее сфер, могут потребоваться более сложные решения кодирования.
Используя образец кода OpenCV, представленный в этой статье, код не может отслеживать AOI (интересующую область) в изображении. Об этом я и расскажу в следующей статье OpenCV.
Используйте OpenCV и Python для обнаружения и отслеживания объектов.ссылка。
Захват видео с камеры Pi с использованием OpenCV и многопоточности Python -ссылка。
Например, мы можем отслеживать AOI в видеопотоке, и мы можем использовать эту информацию, чтобы установить точку перемещения для робота. Например, путевая точка может быть зарядной станцией, на которой останавливается робот. Если у вас есть другие мысли об AOI, используйте раздел комментариев.
Ресурсы
неисправность
Я надеюсь, что вы нашли эту статью полезной - Обнаружение и фильтрация цветов OpenCV с помощью Python, пожалуйста, поставьте лайк и поделитесь.
Вы научились устанавливать OpenCV 3 и делать простые преобразования с изображениями? Самое время добавить цвета! Сегодня мы поговорим о цветовых пространствах в OpenCV, как переводить изображения из одного в другое, зачем это надо и применим на практике полученные знания. Начнем!
Что такое цвет в OpenCV
Мы не будем хитрить с черно-белым и для примера рассмотрим следующее изображение:
Когда мы говорим о цветном изображении, мы обычно имеем в виду изображение, которое содержит пиксели минимум 3 различных цветов, с различной длинной волны. Такие как красный, синий, зеленый. Почему мы используем именно 3 различные цвета и как мы сможем с их помощью описать любой цвет отлично описано в данной статье.
Итак, загрузим данное изображение в OpenCV:
Если мы в данный момент проверим размерность массива через атрибут shape то увидим следующее:
Разложение по каналам BGR
Как мы видим, вывод по умолчанию предполагает что изображение будет в формате BGR. В случае перевода формат в RGB мы сохраняем зеленый канал и меняем синий и красный каналы местами. Это видно по изменению синих цветов на красные.
Сравнение BGR и RGB
Хорошие статьи про цветовые пространства это раз, два, три. Вот пример отображения всех пространств в BGR:
RGB, GRAY, YUV, LAB, HSV, XYZ в BGR
Итог
В следующий раз мы научимся размещать на изображении произвольную информацию, такую как текст и геометрические фигуры. Хорошего распознавания изображений!
В прошлой статье мы узнали как установить библиотеку PIL в Python и начать уже с ней работать. В этой статье мы продолжаем изучение библиотеки PIL. Начиная с версией 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к отдельным пикселям изображения. Указав два значения внутри квадратных скобок, можно получить или задать цвет пикселя.
Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel(<Координаты>) позволяет получить цвет указанного пикселя, а метод putpixel(<Координаты>, <Цвет>) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load(). Пример использования метода getpixel() и putpixel() приведен ниже.
Использование метода getpixel() и putpixel()
В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображения, используемую в операционной системе по умолчанию. Например, на моем компьютере запускается программа ACDSee. Для сохранения изображения в файл предназначен метод save().
В первом параметре указывается абсолютный или относительный путь. Вместо пути можно передать файловый объект, открытый в бинарном режиме. Сохраним изображение в форматах JPEG и BMP разными способами.
Сохраняем изображение в Python
Обратите внимание на то, что мы открыли файл в формате JPEG, а сохранили его в формате BMP. Таким образом, можно открывать изображения в одном формате и конвертировать его в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Если параметр <Формат> не указан, то формат изображения определяется по расширению файла.
В параметре <Обции> можно указать дополнительный характеристики изображения. Поддерживаемый опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100.
За дополнительной информации по опциям обращайтесь к документации. Так же для более подробной инструкции игры в покер можете прочитать poker правила и повысить свои навыки в этой игре. Удивите своих знакомых во время игры в покер, продемонстрировав им свой профессионализм игры.
Привет, Хабр! Запускаю цикл статей по библиотеке OpenCV в Python. Кому интересно, добро пожаловать под кат!
Введение
OpenCV — это open source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Широко используется в таких языках как C, C++, Python и Java.
Установка
Будем считать, что Python и библиотека OpenCV у вас уже установлены, если нет, то вот инструкция для установки python на windows и на ubuntu, установка OpenCV на windows и на ubuntu.
Немного про пиксели и цветовые пространства
Перед тем как перейти к практике, нам нужно разобраться немного с теорией. Каждое изображение состоит из набора пикселей. Пиксель — это строительный блок изображения. Если представить изображение в виде сетки, то каждый квадрат в сетке содержит один пиксель, где точке с координатой ( 0, 0 ) соответствует верхний левый угол изображения. К примеру, представим, что у нас есть изображение с разрешением 400x300 пикселей. Это означает, что наша сетка состоит из 400 строк и 300 столбцов. В совокупности в нашем изображении есть 400*300 = 120000 пикселей.
В большинстве изображений пиксели представлены двумя способами: в оттенках серого и в цветовом пространстве RGB. В изображениях в оттенках серого каждый пиксель имеет значение между 0 и 255, где 0 соответствует чёрному, а 255 соответствует белому. А значения между 0 и 255 принимают различные оттенки серого, где значения ближе к 0 более тёмные, а значения ближе к 255 более светлые:
Импорт библиотеки OpenCV
Теперь перейдём к практической части. Первое, что нам необходимо сделать — это импортировать библиотеку. Есть несколько путей импорта, самый распространённый — это использовать выражение:
Также можно встретить следующую конструкцию для импорта данной библиотеки:
Загрузка, отображение и сохранение изображения
Для загрузки изображения мы используем функцию cv2.imread(), где первым аргументом указывается путь к изображению, а вторым аргументом, который является необязательным, мы указываем, в каком цветовом пространстве мы хотим считать наше изображение. Чтобы считать изображение в RGB — cv2.IMREAD_COLOR, в оттенках серого — cv2.IMREAD_GRAYSCALE. По умолчанию данный аргумент принимает значение cv2.IMREAD_COLOR. Данная функция возвращает 2D (для изображения в оттенках серого) либо 3D (для цветного изображения) массив NumPy. Форма массива для цветного изображения: высота x ширина x 3, где 3 — это байты, по одному байту на каждую из компонент. В изображениях в оттенках серого всё немного проще: высота x ширина.
С помощью функции cv2.imshow() мы отображаем изображение на нашем экране. В качестве первого аргумента мы передаём функции название нашего окна, а вторым аргументом изображение, которое мы загрузили с диска, однако, если мы далее не укажем функцию cv2.waitKey(), то изображение моментально закроется. Данная функция останавливает выполнение программы до нажатия клавиши, которую нужно передать первым аргументом. Для того, чтобы любая клавиша была засчитана передаётся 0. Слева представлено изображение в оттенках серого, а справа в формате RGB:
И, наконец, с помощью функции cv2.imwrite() записываем изображение в файл в формате jpg(данная библиотека поддерживает все популярные форматы изображений:png, tiff,jpeg,bmp и т. д., поэтому можно было сохранить наше изображение в любом из этих форматов), где первым аргументом передаётся непосредственно само название и расширение, а следующим параметром изображение, которое мы хотим сохранить.
Доступ к пикселям и манипулирование ими
Для того, чтобы узнать высоту, ширину и количество каналов у изображения можно использовать атрибут shape:
Важно помнить, что у изображений в оттенках серого img.shape[2] будет недоступно, так как данные изображения представлены в виде 2D массива.
Чтобы получить доступ к значению пикселя, нам просто нужно указать координаты x и y пикселя, который нас интересует. Также важно помнить, что библиотека OpenCV хранит каналы формата RGB в обратном порядке, в то время как мы думаем в терминах красного, зеленого и синего, то OpenCV хранит их в порядке синего, зеленого и красного цветов:
Cначала мы берём пиксель, который расположен в точке (0,0). Данный пиксель, да и любой другой пиксель, представлены в виде кортежа. Заметьте, что название переменных расположены в порядке b, g и r. В следующей строке выводим значение каждого канала на экран. Как можно увидеть, доступ к значениям пикселей довольно прост, также просто можно и манипулировать значениями пикселей:
В первой строке мы устанавливаем значение пикселя (0, 0) равным (255, 0, 0), затем мы снова берём значение данного пикселя и выводим его на экран, в результате мне на консоль вывелось следующее:
На этом у нас конец первой части. Если вдруг кому-то нужен исходный код и картинка, то вот ссылка на github. Всем спасибо за внимание!
Недавно я начал читать о том, как я могу работать с изображениями в Python. Когда я наткнулся на OpenCV, который позволяет импортировать и манипулировать изображениями в Python, я начал задаваться вопросом, можно ли извлечь информацию из этих изображений с помощью машинного обучения и каким-либо образом использовать.
Мы все видели, что мы можем искать в Интернете на основе определенных фильтров, один из которыхцвет, Меня вдохновило написать код, который может извлекать цвета из изображений и фильтровать изображения на основе этих цветов.
В этой статье я объясню, как я понимал основы OpenCV, извлекал цвета из изображений с использованием алгоритма KMeans и фильтровал изображения из коллекции изображений на основе значений цветов RGB. Полный блокнот доступен по адресуэтот репозиторий, sample_image.jpg была нажата мной и другими 5 изображениями в папке images были взяты изUnsplash,
Чтобы прочитать любое изображение, мы используем метод cv2.imread() и укажите полный путь к изображению, которое импортируется в блокнот в виде массива Numpy. Затем мы можем построить его, используя метод pyplot imshow() ,
Форма массива (3456, 4608, 3). Первые два значения соответствуют пикселям изображения. Третье значение установлено на 3, поскольку каждый пиксель представлен в виде комбинации трех цветов: красного, синего и зеленого.
Цвет изображения выглядит немного не так. Это связано с тем, что по умолчанию OpenCV считывает изображение в последовательности Blue Green Red (BGR). Таким образом, для просмотра реального изображения нам нужно преобразовать рендеринг в красный, зеленый, синий (RGB).
Метод cvtColor позволяет нам преобразовывать рендеринг изображения в другое цветовое пространство. Перейти от BGR цветовое пространство для RGB мы используем метод cv2.COLOR_BGR2RGB ,
В некоторых ситуациях нам может потребоваться черно-белое изображение. В таких случаях мы можем выразить изображения как серый. Теперь мы используем пространство преобразования как cv2.COLOR_BGR2GRAY и показать вывод с цветовой картой как gray ,
Мы также можем изменить размер изображения до заданного размера. Мы используем метод resize предоставлено cv2 , Первый аргумент - это изображение, которое мы хотим изменить, а второй аргумент - это ширина и высота, определенные в скобках.
Теперь перейдем к идентификации цветов на изображении и отображению верхних цветов в виде круговой диаграммы.
Преобразование RGB в Hex
Сначала мы определим функцию, которая будет преобразовывать RGB в hex так что мы можем использовать их в качестве меток для нашей круговой диаграммы.
При чтении цвета, который находится в RGB пробел, мы возвращаем строку. просто отображает шестнадцатеричное значение для соответствующего цвета.
Прочитать изображение в цветовом пространстве RGB
Далее мы определим метод, который поможет нам получить изображение в Python в RGB Космос.
Мы предоставляем путь к изображению в качестве аргумента. Сначала мы читаем файл, используя imread а затем измените его цветовое пространство, прежде чем вернуть его.
Получить цвета с изображения
Теперь мы определяем полный код как метод, который мы можем вызвать, чтобы извлечь верхние цвета из изображения и отобразить их в виде круговой диаграммы. Я назвал метод как get_colors и он принимает 3 аргумента:
- image : Изображение, цвета которого мы хотим извлечь.
- number_of_colors : Всего цветов, которые мы хотим извлечь.
- show_chart : Логическое значение, которое решает, показать ли нам круговую диаграмму или нет.
Давайте разберем этот метод для лучшего понимания.
Сначала мы изменяем размер изображения до размера. 600 x 400 , Не требуется изменять его размер до меньшего, но мы делаем это для уменьшения пикселей, что сокращает время, необходимое для извлечения цветов из изображения. KMeans ожидает, что ввод будет двухмерным, поэтому мы используем функцию изменения формы Numpy для изменения формы данных изображения.
Алгоритм KMeans создает кластеры на основе предоставленного количества кластеров. В нашем случае это сформирует кластеры цветов, и эти кластеры будут нашими главными цветами. Мы тогда fit а также predict на том же изображении, чтобы извлечь прогноз в переменную labels ,
Мы используем Counter чтобы подсчитать все метки. Чтобы найти цвета, мы используем clf.cluster_centers_ , ordered_colors перебирает ключи, присутствующие в count, а затем делит каждое значение на 255 , Мы могли бы напрямую разделить каждое значение на 255, но это нарушило бы порядок.
Далее мы получаем hex а также rgb цвета. Поскольку мы разделили каждый цвет на 255 раньше, теперь мы снова умножаем его на 255, находя цвета. Если show_chart является True , мы строим круговую диаграмму с каждой частью круговой диаграммы, определенной с помощью count.values() , обозначается как hex_colors и цвета как ordered_colors Мы наконец вернем rgb_colors который мы будем использовать на более позднем этапе.
Давайте просто вызовем этот метод как get_colors(get_image(‘sample_image.jpg’), 8, True) и наша круговая диаграмма появляется с верхними 8 цветами изображения.
T Он открывает двери для многих превосходных приложений, таких как поиск цветов в поисковой системе или поиск предмета одежды, в котором есть определенный цвет.
Мы только что определили большинство из 8 цветов, которые существуют в нашем изображении. Давайте попробуем реализовать механизм поиска, который может фильтровать изображения на основе предоставленного нами цвета.
Теперь мы погрузимся в код фильтрации набора из пяти изображений по желаемому цвету. Для нашего случая использования мы предоставим значения RGB для цветовзеленый,синийа такжежелтыйи пусть наша система фильтрует изображения.
Получить все изображения
Изображения находятся в папке images , Мы определяем COLORS как словарь цветов. Затем мы читаем все изображения в этой папке и сохраняем их значения в images массив.
Показать все изображения
Сначала мы показываем все изображения в папке, используя нижеуказанные for петля.
Разобьем область на участки, равные количеству изображений. Метод принимает аргументы какколичество рядов = 1,количество столбцов = все изображения, т.е. 5в нашем случае апоказатель,
Сопоставить изображения с цветом
Теперь мы определим метод match_image_by_color отфильтровать все изображения, которые соответствуют выбранному цвету.
Сначала мы извлекаем цвета изображения, используя наш ранее определенный метод get_colors в RGB формат. Мы используем метод rgb2lab чтобы преобразовать выбранный цвет в формат, который мы можем сравнить. for Цикл просто перебирает все цвета, полученные из изображения.
Для каждого цвета цикл меняет его на lab , находит дельту (в основном разницу) между выбранным цветом и цветом в итерации, и если дельта меньше порогового значения, изображение выбирается как соответствующее цвету. Нам нужно вычислить дельту и сравнить ее с порогом, потому что для каждого цвета существует много оттенков, и мы не всегда можем точно подобрать выбранный цвет с цветами на изображении.
Говоря зеленым, пользователь может означать светло-зеленый, зеленый или темно-зеленый. Нам нужно просмотреть все возможности.
Если мы извлекаем, скажем, 5 цветов из изображения, даже если один цвет соответствует выбранному цвету, мы выбираем это изображение. threshold в основном определяет, насколько могут различаться цвета изображения и выбранного цвета.
Давайте рассмотрим случай, когда мы пытаемся найти изображения с зеленым цветом. Если порог слишком высок, мы можем начать видеть синие изображения в нашем поиске. Аналогично, с другой стороны, если пороговое значение слишком низкое, зеленый цвет может даже не совпадать с изображениями, имеющими темно-зеленый цвет. Все зависит от того, что требуется в данной ситуации, и мы можем соответствующим образом изменить значения. Нам нужно тщательно установить threshold ценность.
Показать выбранные изображения
Мы определяем функцию show_selected_images который перебирает все изображения, вызывает вышеупомянутую функцию для их фильтрации по цвету и отображает их на экране, используя imshow ,
Теперь мы просто вызовем этот метод и дадим ему возможность отобразить результаты.
Читайте также: