检测车轮颜色并在控制台打印出来

detecting wheel color and print it out in the console

我有轮子的图像,我需要从要检测的 image.The 颜色中打印出轮子的颜色,这些颜色是黑色、灰色、银色、白色、青铜色、蓝色、红色和绿色。

我首先定义颜色边界并检测颜色范围,然后在控制台上显示这些值。但是现在,我只想打印出车轮颜色,我不能取最高像素值,因为最高值将用于图像背景。

轮子总是很大而且位于中间。它们永远是轮子,背景永远是实心的。不能有图案,不能条纹,不能随机,颜色只能是白色或灰色。

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

示例图片:

为了获得可靠的解决方案,我建议避免验证所有像素,并在使用背景色(应该是纯色)隔离感兴趣区域时专注于方法。这是概念:

  1. 使用一些见解来识别背景
  2. 隔离轮区
  3. 进行必要的分析

听起来很简单,实际上是:

  1. 除非车轮专为颠簸行驶而设计,否则您可以使用图像的任何角落来识别背景
  2. 使用颜色阈值获取除背景以外的所有内容
  3. (可选步骤)您可能希望以排除次要部件的方式调整阈值
  4. 验证识别区域内的颜色(目标颜色将占主导地位),使用 delta E to find the closest one (also )

这是一个快速的 PoC:

1.获取背景

2。基于颜色的分割

3。可选调整

第 4 步似乎非常简单。