利用OpenCV进行颜色检测

HSV介绍

HSV是相对RGB的另一种颜色表示方式,它相对RGB而言,是一种比较直观的颜色模型。其中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

色调H:
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S:
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V:
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关,光照对此值影响最大。通常取值范围为0%(黑)到100%(白)。

代码:

OpenCV中由BGR转为HSV方法:
注意:OpenCV读取的图片格式为BGR格式,非RGB格式。

import cv2
img=cv2.imread('cat.jpg')
#读取一张图片
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#利用cv2.cvtColor将图片进行格式转化
#转化类型为cv2.COLOR_BGR2HSV
cv2.imshow("hsv", hsv)
cv2.waitKey(0)    
cv2.destroyAllWindows()

原图:
在这里插入图片描述
处理后:
在这里插入图片描述

利用cv2.inRange进行二值化处理

cv2.inRange介绍

此函数可实现图像的二值化处理功能,这点类似之前提到过的threshold()函数,但是threshold()函数只能对单一通道进行二值化处理,而inRange()可以对多个通道进行操作。使用inRange处理之前,需要确定好两个数组,即图像上限和图像下限。

img = cv2.inRange(hsv, lower, upper)

第一个参数:hsv指的是原图
第二个参数:lower指的是图像中低于这个lower的值,图像值变为0
第三个参数:upper指的是图像中高于这个upper的值,图像值变为0

注意:如果传入的图像是彩色的,即三维数组图像,则lower与upper里面分别有三个元素,并且二者必须都是数组类型

(lower, upper) 两个数组参数可以作为一个范围,如果图像的像素点在这个范围之内,像素点就变成255(即白色),如果图像的像素点在这个范围之外,像素点就变为0(即黑色)。

处理完成之后,图像变为二值图像,想要的图像颜色变为白色,其他颜色变为黑色,之后可以专门针对白色进行处理。

代码示例

提取该图水杯部分(即黑色部分):

在这里插入图片描述

import cv2
img=cv2.imread('cat3.jpg')
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower=np.array([0,0,0])
upper=np.array([180,255,46])
#提前确定黑色的hsv范围
img_r=cv2.inRange(img,lower,upper)
cv2.imshow("img_r",img_r)
cv2.waitKey(0)
cv2.destroyAllWindows()

处理后:

在这里插入图片描述
由于猫耳朵与后面角落有部分黑色,并且杯子本身黑色不纯(存在白点),会产生噪点,需要后续进行处理,消去噪音点

RGB通道与HSV通道在颜色检测中的区别

如果光源不稳定,光照变化较大(存在阴影或者亮斑),则利用HSV通道检测就比RGB检测高效得多。光照变化较大时,对RGB三个色道的参数影响都很大,在实际调参过程中会显得非常麻烦,而且效果不理想。
HSV中,由于H是颜色的色调基本不受光照影响(即不受阴影或者亮斑影响),而V(明度)主要体现了颜色明亮程度,可以主要调试V来应对光源的变化,并且调试效果比RGB色道要可靠。

文:齐鲁工业大学 云灵未来人工智能协会 AIDC017

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 利用OpenCV进行图像识别是一种常见的计算机视觉应用。OpenCV是一个开源计算机视觉库,支持多种编程语言,包括C++、Python等。它提供了丰富的图像处理和计算机视觉算法,可以用来进行图像识别、目标检测、人脸识别、手势识别等任务。 在进行图像识别时,首先需要加载和处理图像。OpenCV提供了读取、保存和处理图像的函数,可以对图像进行灰度化、二值化、滤波等预处理操作,以提高后续识别的准确性。 接下来,可以使用OpenCV提供的特征提取算法,如SIFT、SURF、HOG等,来提取图像的特征。这些算法可以提取出图像中的关键特征点或特征向量,用于识别或匹配。 然后,可以使用OpenCV提供的机器学习算法,如支持向量机(SVM)、K最近邻(KNN)等,来训练一个分类器或回归器。通过给分类器提供一系列已知的图像样本和其对应的标签,可以训练模型,使其可以自动识别未知图像。 最后,可以使用训练好的模型对新的图像进行识别。将新的图像输入到分类器中,分类器将输出一个标签,表示图像所属的类别。根据这个标签,可以判断图像中的物体或场景是什么。 总之,利用OpenCV进行图像识别可以实现多种应用,如车牌识别、人脸识别、文字识别等。通过选择合适的图像处理和机器学习算法,可以有效提高图像识别的准确性和效率。 ### 回答2: OpenCV是一个开源的计算机视觉库,常用于图像处理和计算机视觉任务。使用OpenCV进行图像识别可以通过以下步骤实现。 1. 导入OpenCV库:首先需要安装并导入OpenCV库,确保可以在代码中使用相关函数和类。 2. 加载图像:使用OpenCV的函数或方法加载待识别的图像文件。可以通过指定文件路径或者从摄像头实时获取图像。 3. 图像预处理:在进行图像识别之前,通常需要进行一些预处理操作。比如调整图像大小、灰度化处理、去除噪声等。这些预处理操作有助于提高识别准确率和效果。 4. 特征提取:通过OpenCV提供的函数或方法,从图像中提取出有用的特征信息。这些特征可以是图像的边缘、角点、颜色直方图等等,可以根据具体任务选择合适的特征。 5. 训练模型:使用提取出的特征数据,训练一个机器学习模型或者深度学习模型。可以选择使用OpenCV的机器学习模块,也可以使用其他深度学习框架如TensorFlow、PyTorch等。 6. 图像识别:使用训练好的模型对新的图像进行识别。将预处理和特征提取应用到待识别图像上,然后输入到模型中进行识别。根据不同的任务,可以得到不同的识别结果,比如物体识别、手势识别、人脸识别等。 7. 分析结果:根据识别结果进行分析,可以对图像内容进行标记、分类、计数等处理。根据具体需求,可以输出结果图像、生成报告或者执行其他进一步的操作。 总之,通过使用OpenCV进行图像识别,可以实现从加载图像到预处理、特征提取、模型训练和图像识别的完整过程,提供了强大的工具和函数库来支持各种图像识别任务。通过合理的处理和使用相关技术,可以实现高效准确的图像识别应用。 ### 回答3: OpenCV是一个开源的计算机视觉库,可以帮助我们进行图像和视频处理。通过使用OpenCV,我们可以实现图像识别的功能。 在使用OpenCV进行图像识别时,我们可以首先加载并读取待识别的图像。然后,可以应用不同的技术和算法对图像进行处理和分析。例如,我们可以使用特征提取算法,如SIFT(尺度不变特征变换)或SURF(加速稳健特征),来提取图像中的关键点和特征描述符。然后,可以使用这些特征描述符进行匹配,以识别图像中的物体或场景。 另外,我们还可以使用机器学习算法来训练图像分类器,以识别不同类别的图像。对于训练图像分类器,我们需要准备一组已标记的图像数据集,然后使用OpenCV提供的机器学习算法,如支持向量机(SVM)或卷积神经网络(CNN),进行训练和优化。训练完成后,我们就可以使用这个分类器对新的未知图像进行分类和识别。 此外,OpenCV还提供了其他功能,如人脸识别、目标跟踪、图像分割等。通过使用这些功能,我们可以进一步提高图像识别的准确性和性能。 综上所述,利用OpenCV进行图像识别可以通过特征提取和匹配、机器学习分类器等技术来实现。OpenCV作为一个强大的计算机视觉库,为我们提供了丰富的工具和算法,方便我们进行图像识别和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值