【opencv】目标识别——HSV颜色识别

本文解释了为何使用HSV而非RGB空间进行物体识别,并给出了在HSV空间内确定特定颜色范围的方法。文章还介绍了如何利用Photoshop辅助确定更为精确的颜色阈值,并提供了基于OpenCV的物体识别代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先解释为什么不在RGB中设置范围寻找物体信息,而是在HSV中:

因为RGB通道并不能很好地反映出物体具体的颜色信息 , 而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比,比如红色在HSV空间中H维度的范围为0~10和160~180 你跟我说在RGB中它的范围是什么呢?

 

 

下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

H:  0 — 180

S:  0 — 255

V:  0 — 255

在HSV空间各种颜色的范围

图来自:http://blog.csdn.net/taily_duan/article/details/51506776

 

但是这个范围相对我们要寻找或者识别的物体还是太大,容易误判,因此我们需要借助PS寻找更精确的范围

点击吸管工具那个图标,选择HSB颜色

但是HSV颜色空间却规定的是,H范围0~360,S范围0~1,V范围0~1 

PS中的HSV范围,H是0-360,S是0-1,V(B)是0-1

opencv中的HSV范围,H是0-180,S是0-255,V是0-255

因此需要转换一下

把PS中H的值除以2,S乘255,V乘255,可以得到对应的opencv的HSV值

 

在PS中某个物体上移动鼠标,可以大致看出物体颜色的HSV三个分量的范围,用这三个范围来识别物体

 

识别代码如下:

 

void hsvreg()
{
    Mat img = imread("蓝色笔筒.jpg",1);

    Mat imgHSV;  

    //蓝色笔筒颜色的HSV范围
    int iLowH = 100 /2;  
    int iHighH = 120 /2;  

    int iLowS = 50 *255/100;   
    int iHighS = 70 *255/100;  

    int iLowV = 40 *255/100;  
    int iHighV = 50 *255/100;  

    cvtColor(img, imgHSV, COLOR_BGR2HSV);//转为HSV

    imwrite("hsv.jpg",imgHSV);

    Mat imgThresholded;

    inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image  

    //开操作 (去除一些噪点)  如果二值化后图片干扰部分依然很多,增大下面的size
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));  
    morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);  
  
    //闭操作 (连接一些连通域)  
    morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);  
  
    namedWindow("Thresholded Image",CV_WINDOW_NORMAL);
    imshow("Thresholded Image", imgThresholded); 
    
    //这里是自定义的求取形心函数,当然用连通域计算更好
    //Point center;
    //center = GetCenterPoint(imgThresholded);//获取二值化白色区域的形心

    //circle(img, center, 100, Scalar(0,0,255), 5, 8, 0);//绘制目标位置
    imwrite("end.jpg", img);

    waitKey(0);
}

 

 

 

 

 

 

 

 

 

### 使用 OpenCVHSV 颜色空间实现物体识别 #### 方法概述 为了实现在图像中识别特定颜色的物体,通常会采用以下流程: - 将输入图像从 BGR 色彩模式转换为 HSV 色彩模式[^3]。 - 定义目标颜色对应的 HSV 值区间作为阈值条件。 - 应用这些阈值创建二值化掩码(mask),其中满足条件的部分被标记出来。 - 利用此掩码对原始图片做按位运算得到只含有指定色彩的对象部分。 这种方法能有效减少背景干扰并突出显示感兴趣的目标对象。下面给出一段 Python 实现代码示例来展示具体过程。 ```python import cv2 import numpy as np # 加载测试图象 image = cv2.imread('test_image.jpg') # 图像预处理:转成HSV格式 hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 设定蓝色范围 (可根据实际需求调整) lower_blue = np.array([100, 80, 50]) upper_blue = np.array([140, 255, 255]) # 创建掩膜 mask = cv2.inRange(hsv_img, lower_blue, upper_blue) # 对原图应用掩膜获取最终结果 result = cv2.bitwise_and(image, image, mask=mask) cv2.imshow('Original Image', image) cv2.imshow('Masked Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段程序首先读取了一张名为 `test_image.jpg` 的文件作为待处理图像;接着将其由默认加载方式下的 BGR 编码转变为更利于表达色彩特性的 HSV 表达形式;之后定义了一个代表蓝色调的 HSV 数值上下限,并据此构建出一个布尔型矩阵——即所谓的“掩膜”,该矩阵内凡是属于设定范围内像素位置处都设为白色(true),其余则置黑(false);最后一步则是利用这个掩膜去遮罩原来的彩色照片从而获得仅保留了所选颜色区域的新版本。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值