определить цвет колеса и распечатать его в консоли - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть изображения колес, и мне нужно распечатать цвет колеса из изображения. Обнаруживаемые цвета: черный, серый, серебристый, белый, бронзовый, синий, красный и зеленый.

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

Колеса всегда большие и расположены в центре. Они всегда колеса, а фон всегда solid. Это не может быть узором, полосатым или случайным, и цвет только белый или серый.

import numpy as np
import cv2
import sys

image = cv2.imread('/home/devop/Pictures/11.jpg')


color_boundaries = {
    "Red":    ([0,   0,   255], [127, 0,   255]),
    "Green": ([0 , 255 , 0], [0 , 255 , 0]),
    "Blue":   ([255, 38,  0],   [255, 38,  0]),
    "White": ([255 , 255 , 255],[255 , 255 , 255]),
    "Black": ([0 , 0 , 0],[0 , 0 , 0]),
    "Bronze": ([205,   127, 50], [205,   127, 50]),
    "Gray":   ([160, 160, 160], [160, 160, 160]),
    "Silver": ([192 , 192 , 192],[192 , 192 , 192])

}

for color_name, (lower, upper) in color_boundaries.items():
    # create NumPy arrays from the boundaries
    lower = np.array(lower, dtype = np.uint8)
    upper = np.array(upper, dtype = np.uint8)

    # find the colors within the specified boundaries and apply the mask
    mask = cv2.inRange(image, lower, upper)
    output = cv2.bitwise_and(image, image, mask = mask)

    if mask.any():
        print(f"{color_name}: {mask.sum()}")

Что я получил после выполнения программы:

White: 50822520
Black: 1020
Gray: 8925
Silver: 11985

Образец изображения:

image

1 Ответ

1 голос
/ 09 мая 2020

Чтобы получить надежное решение, я бы предложил не проверять все пиксели и сосредоточиться на подходе, когда вы используете цвет фона (который должен быть solid), чтобы изолировать интересующую область. Вот концепция:

  1. используйте некоторые идеи для определения фона
  2. выделите область колеса
  3. выполните необходимые анализы

Звучит просто, и на самом деле это так:

  1. если колеса не предназначены для ухабистой езды, вы можете использовать любой угол изображения, чтобы определить фон
  2. использовать пороговое значение цвета, чтобы получить все, кроме фон
  3. (необязательный шаг), который вы можете настроить для порога таким образом, чтобы исключить второстепенные детали
  4. проверить цвета в пределах определенной области (целевой цвет будет доминировать), используйте delta E , чтобы найти ближайший (также отметьте это )

Вот быстрый Po C:

1. Получить фон

enter image description here

2. Сегментация на основе цвета

enter image description here

3. Дополнительная настройка

enter image description here

Шаг 4 кажется довольно простым.

...