1. 基本原理

1.1 彩色模型

数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。选择使用HSV模型的另一个因为是RGB通道并不能很好地反映出物体具体的颜色信息 , 而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。

1.2 HSV模型

因为时间关系,在此先写出模型关键参数,若日后有朝一日变强了再来补习理论知识。
HSV模型中颜色的参数分别是:
色调(H:hue)
饱和度(S:saturation)
亮度(V:value)

由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
(1)色调(H:hue):用角度度量,取值范围为0°~360°,
从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。
它们的补色是:黄色为60°,青色为180°,品红为300°;
(2)饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。
(3)亮度(V:value):取值范围为0(黑色)~255(白色)

1.3 RGB转成HSV

(不确定是否在未来能否用到,在此处作为学习笔记暂时记录,理论上可以通过PS来获取目标区域的准确HSV数值,但不排除未来是用机器学习后需要在程序内添加这种数值转换的函数。)

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。
设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。
要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度,方法如下:

max = max(R,G,B)
min = min(R,G,B)
if R == max:H = (G-B)/(max-min)
if G == max:H = 2+(B-R)/(max-min)
if B == max:H = 4+(R-G)/(max-min)
H = H * 60
if H < 0:H = H + 360
V = max(R,G,B)
S = (max-min)/max

OpenCV下有个函数可以直接将RGB模型转换为HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。经过实验,识别蓝色的取值是 H在100到140,S和V都在90到255之间。一些基本的颜色H的取值可以如下设置:
Orange 0-22,Yellow 22- 38,Green 38-75,Blue 75-130,Violet 130-160,Red 160-179

1.4 通过PS获取HSV值

在寻找关于HSV相关资料时发现并没有提供一个很方便可以直接查看的值(包括百科,事实上HSV模型的各种颜色的数值其实是在RBG的基础上通过算法进行转化得到的。)为了方便(偷懒)获取到精准的HSV模型颜色数值其实可以选择第二个方法:通过Ps软件来获取需要被识别物体的具体颜色数值。
参照表(仅供参考):

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


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值。

2.OpenCV(Python3)实现

Version1.0 提取结果不尽人意但是我会在未来一段时间里不断完善此代码以达到更好的效果。

源代码:

import cv2
import numpy
def nothing(*arg):pass
# Initial HSV GUI slider values to load on program start.
icol = (18, 0, 196, 36, 255, 255)
# Lower range colour sliders.
cv2.namedWindow('colorTest')
cv2.createTrackbar('lowHue', 'colorTest', icol[0], 255, nothing)
cv2.createTrackbar('lowSat', 'colorTest', icol[1], 255, nothing)
cv2.createTrackbar('lowVal', 'colorTest', icol[2], 255, nothing)
# Higher range colour sliders.
cv2.createTrackbar('highHue', 'colorTest', icol[3], 255, nothing)
cv2.createTrackbar('highSat', 'colorTest', icol[4], 255, nothing)
cv2.createTrackbar('highVal', 'colorTest', icol[5], 255, nothing)
# Raspberry pi file path example.
# frame = cv2.imread('/home/pi/python3/opencv/color-test/colour-circles-test.jpg')
# Windows file path example.
frame = cv2.imread('C:/Users/Administrator/Desktop/IMG_20200628_170115.jpg')while True:# Get HSV values from the GUI sliders.lowHue = cv2.getTrackbarPos('lowHue', 'colorTest')lowSat = cv2.getTrackbarPos('lowSat', 'colorTest')lowVal = cv2.getTrackbarPos('lowVal', 'colorTest')highHue = cv2.getTrackbarPos('highHue', 'colorTest')highSat = cv2.getTrackbarPos('highSat', 'colorTest')highVal = cv2.getTrackbarPos('highVal', 'colorTest')# Show the original image.cv2.imshow('frame', frame)# Blur methods available, comment or uncomment to try different blur methods.frameBGR = cv2.GaussianBlur(frame, (7, 7), 0)#frameBGR = cv2.medianBlur(frameBGR, 7)#frameBGR = cv2.bilateralFilter(frameBGR, 15 ,75, 75)# Show blurred image.cv2.imshow('blurred', frameBGR)# HSV (Hue, Saturation, Value).# Convert the frame to HSV colour model.hsv = cv2.cvtColor(frameBGR, cv2.COLOR_BGR2HSV)# HSV values to define a colour range.colorLow = numpy.array([lowHue, lowSat, lowVal])colorHigh = numpy.array([highHue, highSat, highVal])mask = cv2.inRange(hsv, colorLow, colorHigh)# Show the first maskcv2.imshow('mask-plain', mask)kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernal)mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernal)# Show morphological transformation maskcv2.imshow('mask', mask)# Put mask over top of the original image.result = cv2.bitwise_and(frame, frame, mask = mask)# Show final output imagecv2.imshow('colorTest', result)k = cv2.waitKey(5) & 0xFFif k == 27:break
cv2.destroyAllWindows()

总结:

迫于项目时间压力以及希望能对自己的学习能力有进一步的要求,我在尝试改变自己的学习方式,这编文章只是一个开始,并非本人完全原创在查找大量实例和技术理论后对各位前辈们的经验的一种自我总结。

参考文献:

[1]https://blog.csdn.net/qq_15947787/article/details/72784253 【opencv】目标识别——HSV颜色识别
[2]https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_trackbar/py_trackbar.html
[3]https://blog.csdn.net/weixin_39490421/article/details/85998984 opencv3.1 提取图像中某一像素点的HSV值并判断颜色

OpenCV(Python)颜色识别(一)相关推荐

  1. python 颜色识别_在python中构建颜色识别器

    python 颜色识别 In this post, I will show you how to build your own color recognizer using Python. This ...

  2. Opencv之颜色识别

    用Opencv之颜色识别 1.以下是我的基本流程: 读入图像 图像转成HSV 高斯滤波 筛选需要识别的颜色 腐蚀操作 找出轮廓 画出轮廓 接下来是我的总代码: import cv2 import nu ...

  3. opencv做颜色识别(python)

    使用Raspberry摄像头抓图然后进行颜色识别. #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import time from pica ...

  4. OpenCV形状颜色识别Java,Android

    纯java代码实现安卓的CV识别图形形状颜色 半年前开的帖,一直在忙 回来更新下. cv环境已经没有了,图就用以前的吧,代码我贴出来,凭记忆解释一下,算法实现的,我会说明逻辑 首先,环境是OpenCV ...

  5. python颜色识别_颜色检测python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 版权声明:本文为博主原创文章,未经博主允许不得转载. https:blog.cs ...

  6. python颜色识别原理_电脑控制手机 Python实现颜色识别功能

    原标题:电脑控制手机 Python实现颜色识别功能 用电脑控制手机好几年了,Total Control作为安卓手机的多控系统,是我用过各方面都比较稳定的一款软件了.通过脚本实现识别颜色是其强大功能之一 ...

  7. python颜色识别_浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

    [更新]主要提供两种方案: 方案一:(参考网上代码,感觉实用性不是很强)使用PIL截取图像,然后将RGB转为HSV进行判断,统计判断颜色,最后输出RGB值 方案二:使用opencv库函数进行处理.(效 ...

  8. 树莓派摄像头运用python颜色识别

    运用摄像头拍照 import cv2 import osoutput_dir ='/home/pi/Desktop/py' i = 1 cap = cv2.VideoCapture(0) while ...

  9. python颜色识别原理_python+opencv实现颜色检测、轮廓检测、颜色追踪

    准备工作 python配置numpy和openCv库 读取图像和视频图像cv2.imread(路径) cv2.imshow(窗口名称,输出对象) cv2.waitkey(等待时间)import cv2 ...

  10. opencv +python采集识别填涂卡(答题卡)数据

    在社科研究中的问卷调查,或者需要进行问卷答题的场景中,需要用纸质问卷采集答案,然后将问卷的答案输入电脑.这是一般的问卷采集答案的方法,如果问卷数量并不是很多能很快速的将问卷的结果输入到电脑中,但是如果 ...

最新文章

  1. cmd导入oracle库文件,cmd 导入oracle数据库
  2. tensorflow: Could not load dynamic library ‘cudart64_101.dll‘ 解决办法
  3. 计算机鼠标不好使,鼠标不好用 原因竟然让人哭笑不得
  4. VULKAN学习资料
  5. Cocos2dx利用intersectsRect函数检测碰撞
  6. 【学习笔记】第五章——I/O(设备分类、控制方式、软件层次结构、假脱机、缓冲)
  7. sklearn中的逻辑回归
  8. 质数因子 java_质数因子
  9. POJ 1182 食物链(带权并查集)
  10. 页面置换算法LRU(最近最少使用)的Java实现
  11. 医院药库管理系统 v6.26 下载
  12. ubuntu安装vmwaretools
  13. 选拔人才的原则和误区
  14. 大话设计模式之爱你一万年:第十八章 行为模式:中介者模式:那些年的情书-邮局传情:1. 中介者模式基本概念
  15. 转 Apache Ignite——新一代数据库缓存系统
  16. Alien Skin X7PS调色滤镜插件下载及PS调色滤镜教程
  17. Java连接Sql Server的过程及遇到的问题(极端新手向)
  18. 第九篇:稳定性之面向失败设计【可用性架构设计、可用性容灾】
  19. scroller基础知识点
  20. 智能新时代-不一样的人机交互体验

热门文章

  1. tsm9_Momentum_Ultimate Oscillators_MACDivergence index_Stochastic RSI_A/D Oscillator_RVI Vigor ADX
  2. Python 中 int 用法详解
  3. javaScript字符串比较
  4. Python爬虫实战——下载小说
  5. 2019年iOS开发者中心证书生成方法以及极光推送证书使用方法!
  6. SCI、EI、IEEE和中文期刊在查询中有什么区别?
  7. [CC2642r1] 问题笔记 记录使用过程中发现的问题
  8. JSON入门(Understanding JSON)
  9. python+adb 控制安卓手机拍照并传电脑
  10. 【理解数据结构】队列的实现(C语言)