Как определить точный цвет изображений с помощью цветовой модели hsv и opencv

У меня есть наборы данных изображений драгоценных камней. Я классифицировал драгоценные камни по папкам в зависимости от их цвета (это красный, синий, розовый, фиолетовый, желтый).

Что я хочу сделать, так это:

Я хочу обучить модель, используя модель hsv и opencv, для определения цвета драгоценного камня. Это будет ли его синий, фиолетовый, розовый, желтый или красный и любой другой цвет, кроме этих 5 цветов, чтобы определить как неопределенный цвет

Исходный код: (упоминается https://www.kaggle.com)

import os
import matplotlib.pyplot as plt
import seaborn as sn

import cv2
from random import randint

import numpy as np

CLASSES, gems = [], [] # names of classes, count of images for each class

for root, dirs, files in os.walk('C:/Users/User/Desktop/Research Project/images'):
    f = os.path.basename(root)    # get class name - Red,Blue etc    
        
    if len(files) > 0:
        gems.append(len(files))
        if f not in CLASSES:
            CLASSES.append(f) # add folder name
    
gems_count = len(CLASSES) # 6 = number of classes
print('{} classes with {} images in total'.format(len(CLASSES), sum(gems)))

img_w, img_h = 220, 220    # width and height of image
train_dir = 'C:/Users/User/Desktop/Gem/images/train'

def read_imgs_lbls(_dir):
    Images, Labels = [], []
    for root, dirs, files in os.walk(_dir):
        f = os.path.basename(root)  # get class name - Red, Blue, etc       
        for file in files:
            Labels.append(f)
            try:
                image = cv2.imread(root+'/'+file)              # read the image (OpenCV)
                image = cv2.resize(image,(int(img_w*1.5), int(img_h*1.5)))       # resize the image (images are different sizes)
                image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # converts an image from BGR color space to HSV
                Images.append(image)
            except Exception as e:
                print(e)
    Images = np.array(Images)
    return (Images, Labels)

def get_class_index(Labels):
    for i, n in enumerate(Labels):
        for j, k in enumerate(CLASSES):    # foreach CLASSES
            if n == k:
                Labels[i] = j
    Labels = np.array(Labels)
    return Labels

Train_Imgs, Train_Lbls = read_imgs_lbls(train_dir)
Train_Lbls = get_class_index(Train_Lbls)
print('Shape of train images: {}'.format(Train_Imgs.shape))
print('Shape of train labels: {}'.format(Train_Lbls.shape))

dim = 4 

f,ax = plt.subplots(dim,dim) 
f.subplots_adjust(0,0,2,2)
for i in range(0,dim):
    for j in range(0,dim):
        rnd_number = randint(0,len(Train_Imgs))
        cl = Train_Lbls[rnd_number]
        ax[i,j].imshow(Train_Imgs[rnd_number])
        ax[i,j].set_title(CLASSES[cl]+': ' + str(cl))
        ax[i,j].axis('off')

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

import cv2
import numpy as np

img = cv2.imread("img.jpg")

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_val = np.array([37,42,0]) 
upper_val = np.array([84,255,255]) 

# Threshold the HSV image - any green color will show up as white
mask = cv2.inRange(hsv, lower_val, upper_val)

# if there are any white pixels on mask, sum will be > 0
hasGreen = np.sum(mask)
if hasGreen > 0:
    print('Green detected!')

Я также нашел нижнее и верхнее предельные значения hsv цветов, которые мне нужны.

          'red': [[9, 255, 255], [0, 50, 70]],             
          'blue': [[128, 255, 255], [90, 50, 70]],
          'yellow': [[35, 255, 255], [25, 50, 70]],
          'purple': [[158, 255, 255], [129, 50, 70]]

может кто-нибудь, пожалуйста, дайте мне знать, как я могу объединить определение цвета с использованием значений hsv (как в как узнать, обнаружен ли цвет на opencv) с моим исходным кодом.

Я новичок в обработке изображений, и любая помощь приветствуется.

Спасибо.

У вас есть образцы изображений? Какова ваша конкретная проблема для завершения кода?

Markus 05.05.2022 16:13

@Markus Да, я получил образцы изображений драгоценных камней от kaggle.com. В коде, который я пробовал, он обучает модель, получая имена папок. Но я хочу использовать цветовую модель hsv (нижние и верхние значения цветов) в процессе обучения, как в статье, которую я нашел. У меня есть проблемы с привязкой цветовой модели hsv к коду, который я пробовал.

jeni 05.05.2022 18:28

@Markus Моя главная цель - использовать цветовую модель hsv для определения цвета.

jeni 05.05.2022 18:56

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

Markus 05.05.2022 19:54

@Markus У меня есть набор данных в отдельных папках с именами папок Blue, Red, Yellow и т. д...... Я хочу использовать цветовую модель hsv для определения цветов. В этом случае мне нужно использовать что-то вроде этой статьи (stackoverflow.com/questions/58288014/…)?

jeni 06.05.2022 04:50

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

Markus 06.05.2022 07:55

@Markus Мой код находится в разделе «Исходный код» ... Я не добавлял код из ссылки в свой исходный код. Проблема, с которой я столкнулся, заключается в том, как я могу объединить код из ссылки с моим исходным кодом.

jeni 06.05.2022 08:33

@Markus Не могли бы вы, пожалуйста, дайте мне знать, как я могу определить цвет автоматически без отдельных папок?

jeni 06.05.2022 08:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код демонстрирует, как просмотреть все файлы в папке ./images и вернуть обнаруженные цвета:

import os
import numpy as np
import cv2

# map colour names to HSV ranges
color_list = [
    ['red', [0, 160, 70], [10, 250, 250]],
    ['pink', [0, 50, 70], [10, 160, 250]],
    ['yellow', [15, 50, 70], [30, 250, 250]],
    ['green', [40, 50, 70], [70, 250, 250]],
    ['cyan', [80, 50, 70], [90, 250, 250]],
    ['blue', [100, 50, 70], [130, 250, 250]],
    ['purple', [140, 50, 70], [160, 250, 250]],
    ['red', [170, 160, 70], [180, 250, 250]],
    ['pink', [170, 50, 70], [180, 160, 250]]
]


def detect_main_color(hsv_image, colors):
    color_found = 'undefined'
    max_count = 0

    for color_name, lower_val, upper_val in colors:
        # threshold the HSV image - any matching color will show up as white
        mask = cv2.inRange(hsv_image, np.array(lower_val), np.array(upper_val))

        # count white pixels on mask
        count = np.sum(mask)
        if count > max_count:
            color_found = color_name
            max_count = count

    return color_found


for root, dirs, files in os.walk('./images'):
    f = os.path.basename(root)

    for file in files:
        img = cv2.imread(os.path.join(root, file))
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        print(f"{file}: {detect_main_color(hsv, color_list)}")

Вывод с тремя образцами изображений в подпапке images:

ruby_3.jpg: red
sapphire blue_18.jpg: blue
sapphire pink_18.jpg: pink
sapphire purple_28.jpg: purple
sapphire yellow_9.jpg: yellow

Кредиты:

Для некоторых изображений он отображает четыре цвета или пять цветов. например, красный, желтый, зеленый, синий для одного изображения (исходный цвет которого синий). Есть ли способ решить эту проблему. Для большинства изображений отображается более 2 цветов, как показано ниже. sapphire blue_26.jpg ['красный', 'желтый', 'розовый', 'синий', 'фиолетовый', 'красный'] sapphire pink_20.jpg ['красный', 'желтый', 'розовый', 'синий', 'фиолетовый', 'красный'] сапфир yellow_4.jpg ['красный', 'желтый', 'зеленый']

jeni 06.05.2022 17:54

Да это можно решить. Мы могли бы вернуть только основной цвет, т. е. цвет, который встречается у большинства пикселей. Вам нужен только основной цвет? Можете ли вы поделиться примером изображения? Вы хотите, чтобы я скорректировал ответ, или вы хотите попробовать сами?

Markus 06.05.2022 18:39

Я получил набор данных от kaggle.com/datasets/lsind18/драгоценные камни-изображения. Я пытаюсь обнаружить следующие цвета: красный, синий, розовый, желтый и фиолетовый. (Для этого используются наборы данных «Рубиновый», «Синий сапфир», «Розовый сапфир», «Желтый сапфир» и «Пурпурный сапфир»). Да, я хочу, чтобы отображался только основной цвет. Я пытался решить, но безуспешно. Очень признателен, если вы могли бы помочь с настройкой.

jeni 06.05.2022 19:52

И если изображение не принадлежит ни к одному из определенных цветов, то будет отображаться как «Неопределенный».

jeni 06.05.2022 21:09

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

Markus 06.05.2022 21:16

... и "неопределенное".

Markus 06.05.2022 21:19

@Markus, должно быть, ломал голову, чтобы найти диапазоны всех этих цветов :) +1

Jeru Luke 06.05.2022 21:45

@Маркус извините за беспокойство. У меня уже есть обученная модель для определения цвета драгоценных камней с использованием cnn (исходный код доступен в stackoverflow.com/questions/72152635/…). И я пытаюсь обучить другую модель с использованием hsv и cnn для той же цели. Для этого я использую код, который Вы предложили выше. Можете ли вы сообщить мне, используя его, можно построить cnn?

jeni 07.05.2022 15:16

@jeni Да, почему бы и нет? Ты пробовал?

Markus 07.05.2022 16:29

@Markus Да, я пытался, но у меня есть некоторые проблемы. Позвольте мне поделиться тем, что я пробовал. И во время обучения модели бесполезно изменять размер и обрезать изображение?

jeni 07.05.2022 21:11

@jeni У меня еще нет опыта работы с cnn, и у меня нет советов по изменению размера или обрезке. Пожалуйста, создайте новый вопрос по конкретной проблеме, чтобы другие могли принять участие! Сила Stackoverflow в том, что на него будет смотреть много разных людей с разным опытом. Имейте в виду, что вы должны исправить свой вопрос, чтобы быть как можно более конкретным. Тогда вы получите быстрый и конкретный ответ.

Markus 07.05.2022 21:30

@Маркус хорошо, спасибо.. stackoverflow.com/questions/72156035/…

jeni 08.05.2022 06:43

@Markus Есть ли способ измерить точность приведенной выше модели обучения распознаванию цветов, которую вы предложили?

jeni 08.05.2022 12:05

@jeni Как определяется показатель точности?

Markus 08.05.2022 13:41

@Markus с количеством правильных прогнозов, сделанных с использованием обученной модели...

jeni 08.05.2022 16:54

@Markus Например, в модели, которую я обучил stackoverflow.com/questions/72152635/…, здесь я получаю уровень точности 78%. Аналогично в предложенной выше модели, как я могу определить уровень точности прогноза?

jeni 08.05.2022 16:57

@jeni Извините, но боюсь, что не смогу вам с этим помочь.

Markus 08.05.2022 23:04

Другие вопросы по теме