Здесь я напишу некоторый код для определения верхних цветов в изображении с помощью ML и отображения статистики.
Итак, извлечение цвета из изображений. Звучит здорово, ха!
Недавно во время работы с расширением выбора цвета для Chrome мне пришла в голову идея, что было бы здорово, если бы я мог просто загрузить изображение в программное обеспечение или веб-сайт, и это программное обеспечение или веб-сайт извлекает все различные цвета, используемые в этом изображении, и показывает мне некоторую статистику об изображении, скажем, круговую диаграмму.
Итак, я начал углубляться в это и понял, что в обычном расширении выбора цвета в chrome или обычных инструментах мы должны выбрать какую-то часть изображения, и этот инструмент в основном извлекает цвет в этой части изображения. Это означает, что он не учитывает, как цвета распределяются по всему изображению.
Немного углубившись в это, и некоторые поиски в Интернете привели меня к мысли, что наши собственные алгоритмы на основе искусственного интеллекта и ML могут быть полезны здесь. Такой алгоритм, как кластеризация “KMeans”, идеально подходит для такого рода ситуаций, когда у нас нет никакого представления о том, как цвета будут распределены внутри этого изображения.
Если вы не знакомы с алгоритмом кластеризации K Means, посмотрите на эту ссылку K Means Clustering
Итак, теперь у меня была информация о том, как решить эту проблему. Теперь пришло время КОДИРОВАТЬ!!! Итак, я начал с:-
- Анаконда (я написал код в блокноте Jupyter)
- Установил OpenCV с помощью самой Анаконды (это было очень просто. Поверь мне)
- Другие библиотеки и пакеты, которые я использовал, включают в себя:- SKLearn, Matplotlib, Numpy, Коллекции, skimage (можно использовать, хотя я этого не делал) и модуль ОС.
- Прыгнул писать в код и результаты были просто вау !!! Вы можете взглянуть на мой репозиторий, для которого есть ссылка AI-COLOR-DETECT или просто следуйте дальше, я вставлю фрагменты кода здесь с объяснением:-
ПОСЛЕДОВАЛИ ШАГИ:-
- Загрузите необходимые библиотеки и пакеты
- Загрузите изображение, над которым мы будем работать (ваше может быть любым, я выбрал красивых бабочек)
- Идентификация цвета
- Проверка нашего творения
ШАГ – 1
Здесь мы загрузим все необходимые библиотеки и пакеты из python, которые включают KMeans из sklearn.clusters, matplotlib.pyplot, numpy, cv2, из collections import Counter, os (если вы хотите получить доступ к изображению в каком-либо другом каталоге)
ШАГ – 2
Здесь мы загрузим наше изображение (над которым мы будем работать), чтобы просто взглянуть на него! По умолчанию изображение загружается в виде массива numpy в канале BGR с помощью OpenCV, а не RGB, поэтому цвет изображения немного отличается от оригинала.
Как я уже говорил, цвет изображения немного отличается от оригинального, так что давайте преобразуем его в оригинальный внешний вид, не так ли? Мы будем использовать cv2.cvtColor, что означает преобразование в цветовой формат. Он принимает два аргумента: изображение, которое должно быть преобразовано, и каналы из/в, которые мы хотим преобразовать изображение. В нашем случае от BGR до RGB.
ШАГ – 3
Здесь мы определим функции таким образом, чтобы сделать наш код модульным. Первая функция предназначена для преобразования кодов RGB в шестнадцатеричные коды, чтобы нам было легко отображать эти цвета, вторая функция предназначена для чтения изображения через OpenCV и, конечно же, преобразования его в канал RGB из BGR, и последняя функция-это то, в чем заключается вся магия. Наш алгоритм кластеризации KMeans сделает свое волшебство и выделит цвета в виде предсказаний.
ФУНКЦИЯ 1: Преобразование кодов RGB в шестнадцатеричные коды
ФУНКЦИЯ 2: Считывание изображения в пространство RGB
ФУНКЦИЯ 3: K означает кластеризацию и круговую диаграмму
Давайте разберемся, что эта функция делает шаг за шагом.
- Шаг 1: Преобразуйте изображение в массив 2 на 2 numpy, потому что это форма массива K, которую алгоритм ожидает в качестве входных данных.
modified_image = image.reshape(image.shape[0]*image.shape[1], 3)
- Шаг 2: Извлечение цветовых кластеров с помощью алгоритма KMeans, основанного на количестве цветов, необходимых для извлечения из изображения. Здесь color_count является одним из наших аргументов функции, мы можем дать ей любое целое числовое значение.
clf = KMeans(n_clusters = color_count)
- Шаг 3: Установите модель на наше измененное изображение, чтобы получить некоторые прогнозы значений цвета на основе кластеров.
predictions = clf.fit_predict(modified_image)
- Шаг 4: Создайте счетчик для прогнозов, в основном это означает, сколько раз кластер был замечен. Для определения Collections.counter посмотрите на эту ссылку Collections.counter
counts = Counter(predictions)
- Шаг 5: Извлечение центров кластеров, т. е. извлечение цветовых кодов или прогнозов для кластеров (простым способом)
center_colors = clf.cluster_centers_
Шаг 6: Извлеките значения кода RGB и преобразуйте их в шестнадцатеричные коды. Сначала это может показаться запутанным, но когда вы сравните его с приведенным выше кодом и извлеченными значениями, вы поймете, что мы используем ключи счетчика, которые на самом деле являются кластерами (например, 5 относится к кластеру 5), и используем его в центрах кластеров, которые мы выбрали выше, которые в основном являются кодами RGB для кластеров, а затем преобразуем их в шестнадцатеричные коды и сохраняем их в списке hex_colors и сохраняем цвета RGB в другом списке, называемом rgb_colors.
Шаг 7: Постройте круговую диаграмму, если наша диаграмма отображения аргументов верна.
if (display_chart): plt.figure(figsize = (8, 6)) plt.pie(counts.values(), labels = hex_colors, colors = hex_colors)
- Шаг 8: Возвращайте значения из функции. Я вернул все переменные, которые вы можете вернуть, любые значения, которые вы хотите проверить.
return counts, hex_colors,center_colors, predictions
ШАГ-4
Ого! наконец-то мы здесь. Момент истины. Давайте проверим наше творение.
- Считайте изображение с помощью нашей функции read_image().
loaded_image = read_image('butterfly.jpeg')
- Установите аргументы для нашей большой функции fetch_colors ().
color_count = 10 display_chart = True
- Запустите алгоритм
colors_fetched_counts, colors_fetched, center_colors, predictions = fetch_colors(loaded_image, color_count, display_chart)
ПРЕВОСХОДНО!!!! Наш собственный экстрактор цветов готов, и это тоже со статистикой
Изображение, на котором я тестировал код
Давайте распечатаем выбранные цвета:
print(colors_fetched) >>['#efe2ca', '#23201c', '#5898d4', '#f8f5f1', '#909b79', '#954b16', '#f6dd86', '#efdba7', '#e49d11', '#365979']
Фу!!! Итак, мы все закончили, но подождите….. После того, как вы изучили его, что, по вашему мнению, может быть его вариантами использования? Ну комментируйте и делитесь своими идеями . В то же время я поделюсь тем, что я чувствую, например:-
- Такой алгоритм может быть использован, если мы хотим создать забавный веб-сайт, где вы могли бы просто загрузить изображение и посмотреть на его цветовое распределение.
- Мы можем использовать его в приложении, где у нас есть 1000 изображений, и мы хотим найти изображение с определенным цветом в нем, скажем, синий может быть.
- Мы можем создать функцию разделения изображений для наших устройств, которая будет различать изображения по цветам и собирать их в отдельных местах, чтобы, если мы хотим найти все изображения, содержащие синий цвет, мы могли бы отделить их.
- и т.д.
Я наткнулся на это сообщение в блоге и это было очень полезно для меня, вы можете почувствовать, что коды выровнены в моем блоге и в этом, но я чувствовал, что это требует дополнительных объяснений того, что происходит, поэтому я подумал о том, чтобы написать один самостоятельно.
Ну, вот и все для этого блога. Я надеюсь, что вам понравилось, и если да, то прокомментируйте и дайте мне знать, а также мне нравится этот пост в блоге, если вы считаете, что это было полезно, и не забудьте поделиться своими идеями о том, что мы можем сделать с помощью такого алгоритма.