文章目录

  • 前言
  • 一、项目背景
  • 二、图片示例
  • 完整图片
  • 模型识别后分割图片
  • 三、运行环境
  • 四、颜色检测、分类
  • 检测思路
  • 代码实现
  • 颜色掩码
  • 五、总结:



前言

基于cv2实现颜色分类


一、项目背景

在研究某安客空间推理验证码时,已基于YOLOv8训练目标检测模型识别出物体位置、分类及朝向,因为打标签太过耗时,所以没有训练检测实例颜色的模型,在此基于cv2,利用算法对物体颜色进行分类。

二、图片示例

完整图片

基于CV2实现颜色分类,附完整代码_目标检测

模型识别后分割图片

基于CV2实现颜色分类,附完整代码_人工智能_02


基于CV2实现颜色分类,附完整代码_颜色空间_03


基于CV2实现颜色分类,附完整代码_人工智能_04


基于CV2实现颜色分类,附完整代码_目标检测_05


基于CV2实现颜色分类,附完整代码_颜色空间_06


基于CV2实现颜色分类,附完整代码_人工智能_07


基于CV2实现颜色分类,附完整代码_分类_08


基于CV2实现颜色分类,附完整代码_人工智能_09


基于CV2实现颜色分类,附完整代码_目标检测_10


基于CV2实现颜色分类,附完整代码_YOLO_11

三、运行环境

Python

3.10.6

opencv-python

4.10.0.84

numpy

1.26.4

四、颜色检测、分类

检测思路

具体步骤如下:

  1. 转换颜色空间:将图像从BGR颜色空间转换为HSV颜色空间,以便更好地识别颜色。
  2. 定义颜色范围:定义红色、绿色、蓝色和黄色在HSV颜色空间中的下限和上限。
  3. 创建颜色掩码:使用cv2.inRange()函数为每种颜色创建一个掩码,以区分图像中的不同颜色。
  4. 计算像素数:使用cv2.countNonZero()函数计算每种颜色的像素数。
  5. 确定最突出的颜色:比较每种颜色的像素数,找出最大的像素数,即最突出的颜色。
  6. 返回结果:根据最突出的颜色,返回相应的颜色名称。如果最大像素数对应多种颜色或无法识别颜色,则返回"Unknown Color"。

代码实现

import cv2
import numpy as np


def detect_color(image_path):
    # 读取图像
    img = cv2.imread(image_path)

    # 转换到HSV颜色空间
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 定义HSV范围
    # 注意:这些范围可能需要根据你的实际图像进行调整
    lower_red = np.array([0, 120, 70])
    upper_red = np.array([10, 255, 255])

    lower_green = np.array([35, 100, 50])
    upper_green = np.array([85, 255, 255])

    lower_blue = np.array([90, 40, 50])
    upper_blue = np.array([140, 255, 255])

    lower_yellow = np.array([20, 100, 100])
    upper_yellow = np.array([30, 255, 255])

    # 创建颜色掩码
    mask_red = cv2.inRange(hsv, lower_red, upper_red)
    mask_green = cv2.inRange(hsv, lower_green, upper_green)
    mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
    mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)

    # 计算每种颜色的像素数
    red_count = cv2.countNonZero(mask_red)
    green_count = cv2.countNonZero(mask_green)
    blue_count = cv2.countNonZero(mask_blue)
    yellow_count = cv2.countNonZero(mask_yellow)

    # 确定最突出的颜色
    max_count = max(red_count, green_count, blue_count, yellow_count)

    if max_count == red_count:
        return "Red"
    elif max_count == green_count:
        return "Green"
    elif max_count == blue_count:
        return "Blue"
    elif max_count == yellow_count:
        return "Yellow"
    else:
        return "Unknown Color"


color = detect_color("cropped_image_9.png")
print(color)

注意事项
HSV范围可能需要根据你的实际图像进行调整, 以包含较浅或较深的颜色

颜色掩码

颜色掩码(Color Mask)是图像处理中的一种技术,用于从图像中提取特定颜色的区域。

在这个函数中,颜色掩码被用来隔离图像中的特定颜色。

以下是创建颜色掩码的具体步骤:

  1. 定义颜色范围:首先定义了红色、绿色、蓝色和黄色在HSV颜色空间中的下限和上限。例如,红色的下限定义为[0, 120, 70],上限定义为[10, 255, 255]。
  2. 创建掩码:使用cv2.inRange()函数创建掩码。这个函数会生成一个二值图像(黑白图像),其中白色像素表示HSV值在定义的颜色范围内,黑色像素表示不在范围内。
  3. mask_red = cv2.inRange(hsv, lower_red, upper_red):这行代码创建了一个红色的掩码,其中hsv是转换后的HSV图像,lower_red和upper_red分别是红色的HSV下限和上限。
    类似地,还有mask_green、mask_blue和mask_yellow。
  4. 计算像素数:使用cv2.countNonZero()函数计算每个掩码中非零(即白色)像素的数量,这代表了图像中该颜色的像素数量。
  5. 通过这种方式,颜色掩码帮助我们从原始图像中筛选出特定颜色的区域,并进一步分析这些区域的特征。

五、总结:

以上就是本文的内容,利用颜色掩码计算每种颜色的像素数量,像素数量最多的颜色,则为实例最突出的颜色;
与Yolov8分类模型的方式相比,省去了打标签训练的时间,更快速的实现了颜色分类的功能。