前言
基于cv2实现颜色分类
一、项目背景
在研究某安客空间推理验证码时,已基于YOLOv8训练目标检测模型识别出物体位置、分类及朝向,因为打标签太过耗时,所以没有训练检测实例颜色的模型,在此基于cv2,利用算法对物体颜色进行分类。
二、图片示例
完整图片
模型识别后分割图片
三、运行环境
Python | 3.10.6 |
opencv-python | 4.10.0.84 |
numpy | 1.26.4 |
四、颜色检测、分类
检测思路
具体步骤如下:
- 转换颜色空间:将图像从BGR颜色空间转换为HSV颜色空间,以便更好地识别颜色。
- 定义颜色范围:定义红色、绿色、蓝色和黄色在HSV颜色空间中的下限和上限。
- 创建颜色掩码:使用cv2.inRange()函数为每种颜色创建一个掩码,以区分图像中的不同颜色。
- 计算像素数:使用cv2.countNonZero()函数计算每种颜色的像素数。
- 确定最突出的颜色:比较每种颜色的像素数,找出最大的像素数,即最突出的颜色。
- 返回结果:根据最突出的颜色,返回相应的颜色名称。如果最大像素数对应多种颜色或无法识别颜色,则返回"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)是图像处理中的一种技术,用于从图像中提取特定颜色的区域。
在这个函数中,颜色掩码被用来隔离图像中的特定颜色。
以下是创建颜色掩码的具体步骤:
- 定义颜色范围:首先定义了红色、绿色、蓝色和黄色在HSV颜色空间中的下限和上限。例如,红色的下限定义为[0, 120, 70],上限定义为[10, 255, 255]。
- 创建掩码:使用cv2.inRange()函数创建掩码。这个函数会生成一个二值图像(黑白图像),其中白色像素表示HSV值在定义的颜色范围内,黑色像素表示不在范围内。
- mask_red = cv2.inRange(hsv, lower_red, upper_red):这行代码创建了一个红色的掩码,其中hsv是转换后的HSV图像,lower_red和upper_red分别是红色的HSV下限和上限。
类似地,还有mask_green、mask_blue和mask_yellow。- 计算像素数:使用cv2.countNonZero()函数计算每个掩码中非零(即白色)像素的数量,这代表了图像中该颜色的像素数量。
- 通过这种方式,颜色掩码帮助我们从原始图像中筛选出特定颜色的区域,并进一步分析这些区域的特征。
五、总结:
以上就是本文的内容,利用颜色掩码计算每种颜色的像素数量,像素数量最多的颜色,则为实例最突出的颜色;
与Yolov8分类模型的方式相比,省去了打标签训练的时间,更快速的实现了颜色分类的功能。