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


前言

基于cv2实现颜色分类


一、项目背景

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

二、图片示例

完整图片

在这里插入图片描述

模型识别后分割图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、运行环境

Python3.10.6
opencv-python4.10.0.84
numpy1.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分类模型的方式相比,省去了打标签训练的时间,更快速的实现了颜色分类的功能。

  • 45
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 基于区域生长算法和k-means聚类算法实现图像分割的MATLAB代码如下: ```matlab % 图像读取与预处理 I = imread('image.jpg'); % 读取图像 I = im2double(I); % 将图像转换为双精度格式 [rows, cols, ~] = size(I); % 获取图像的行数和列数 % k-means聚类 k = 3; % 设置聚类数目 pixelData = reshape(I, rows * cols, []); % 将图像像素数据重塑为N行3列的矩阵 [idx, ~] = kmeans(pixelData, k); % 执行k-means聚类算法 % 区域生长算法 threshold = 0.1; % 设置生长阈值 segmentedImg = zeros(rows, cols); % 创建用于存储分割结果的图像矩阵 % 对每个像素进行区域生长 for i = 1:rows for j = 1:cols if segmentedImg(i, j) == 0 % 如果当前像素未被分割 % 找到该像素所属的聚类类别 pixelCluster = idx((i - 1) * cols + j); % 初始化种子点队列 seedPoints = [i, j]; % 区域生长 while size(seedPoints, 1) > 0 % 弹出队列中的种子点 currentPixel = seedPoints(1, :); seedPoints(1, :) = []; % 判断当前像素是否已被分割 if segmentedImg(currentPixel(1), currentPixel(2)) == 0 % 计算当前像素与种子点的颜色差异 colorDifference = sum((pixelData((currentPixel(1) - 1) * cols + currentPixel(2), :) - pixelData((i - 1) * cols + j, :)) .^ 2); % 如果颜色差异小于阈值,则将当前像素标记为与种子点属于同一区域,并将其加入种子点队列 if colorDifference < threshold segmentedImg(currentPixel(1), currentPixel(2)) = pixelCluster; seedPoints = [seedPoints; currentPixel + [-1, 0]; currentPixel + [1, 0]; currentPixel + [0, -1]; currentPixel + [0, 1]]; end end end end end end % 显示分割结果 figure; imshow(segmentedImg, []); % 显示分割结果图像 colormap(jet(k)); % 设置颜色映射 colorbar; % 显示颜色刻度 ``` 以上代码实现了先使用k-means算法对图像进行聚类,然后利用区域生长算法进行图像分割。其中,`I`为原始图像,`k`为聚类数目,`threshold`为生长阈值,`segmentedImg`为分割结果图像。代码通过循环遍历每个像素,对未被分割的像素执行区域生长算法,将颜色差异小于阈值的像素标记为同一区域,并将其加入种子点队列,直至所有与种子点相连的像素都被分割为止。最后,显示分割结果图像。 ### 回答2: 图像分割是计算机视觉中的一个重要任务,它将图像中的像素划分为不同的区域或对象,以便进行后续的分析和处理。基于区域生长算法和K-means聚类算法是实现图像分割的经典方法之一。 区域生长算法的基本思想是从一个或多个种子像素开始,通过比较相邻像素间的相似度来逐步生长和扩展出具有相似特征的区域。这种方法适用于图像中有明显颜色或纹理差异的区域分割。在MATLAB中,可以使用regiongrowing函数实现基于区域生长算法的图像分割。下面是一个示例代码: ``` I = imread('image.jpg'); seeds = [100, 200; 150, 200]; % 种子像素位置 region = regiongrowing(I, seeds); figure; subplot(1,2,1); imshow(I); title('原始图像'); subplot(1,2,2); imshow(region); title('区域生长图像'); ``` K-means聚类算法是一种常用的无监督学习算法,它将图像中的像素分为K个不同的簇或类别,使得同一类像素具有相似的特征。这种方法适用于图像中有明显色彩分布的区域分割。在MATLAB中,可以使用kmeans函数实现基于K-means聚类算法的图像分割。下面是一个示例代码: ``` I = imread('image.jpg'); K = 2; % 聚类数 [idx, centers] = kmeans(double(I(:)), K); % 执行K-means聚类 segmented_img = reshape(idx, size(I)); segmented_centers = reshape(centers, [1, 1, K]); figure; subplot(1,2,1); imshow(I); title('原始图像'); subplot(1,2,2); imshow(segmented_img, segmented_centers); title('K-means图像'); ``` 以上是使用MATLAB实现基于区域生长算法和K-means聚类算法的图像分割的示例代码。根据实际需求,可以选择适用于具体图像的算法和参数,并进行进一步的优化和调整。 ### 回答3: 图像分割是数字图像处理领域的重要研究方向,区域生长算法和kmean聚类算法是常用的图像分割方法之一。下面是使用MATLAB代码实现基于区域生长算法和kmean聚类算法的图像分割示例: 区域生长算法实现图像分割的MATLAB代码示例: ```matlab function segmented_image = region_growing(image, seed_point, threshold) [row, col] = size(image); visited = false(row, col); segmented_image = zeros(row, col); queue = zeros(row * col, 2); queue_start = 1; queue_end = 1; queue(queue_end, :) = seed_point; queue_end = queue_end + 1; while(queue_start ~= queue_end) current_point = queue(queue_start, :); queue_start = queue_start + 1; if(visited(current_point(1), current_point(2))) continue; end visited(current_point(1), current_point(2)) = true; segmented_image(current_point(1), current_point(2)) = image(current_point(1), current_point(2)); neighbors = [(current_point(1)-1, current_point(2)), (current_point(1)+1, current_point(2)), (current_point(1), current_point(2)-1), (current_point(1), current_point(2)+1)]; for i = 1:4 neighbor_point = neighbors(i, :); if(neighbor_point(1) > 0 && neighbor_point(1) <= row && neighbor_point(2) > 0 && neighbor_point(2) <= col) neighbor_intensity = image(neighbor_point(1), neighbor_point(2)); if(abs(neighbor_intensity - image(current_point(1), current_point(2))) <= threshold) queue(queue_end, :) = neighbor_point; queue_end = queue_end + 1; end end end end end ``` kmean聚类算法实现图像分割的MATLAB代码示例: ```matlab function segmented_image = kmean_segmentation(image, k) [row, col] = size(image); reshaped_image = reshape(image, row * col, 1); [cluster_indices, cluster_centers] = kmeans(reshaped_image, k); segmented_image = reshape(cluster_indices, row, col); end ``` 以上代码分别是基于区域生长算法和kmeans聚类算法实现的图像分割方法的MATLAB示例。你可以根据自己的需要使用这些代码,并根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃苹果的牛顿顿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值