在图像识别处理中,有时需要将图像中指定颜色对的对象抠图出来,此时使用HSV空间结合inRange函数即可以做到。
关于HSV颜色空间的资料到处都有,可以参考《HSV颜色识别-HSV基本颜色分量范围》和《Python图像处理:OpenCV HSV和标准表示法的区别以及转换》。老猿不重复介绍,只简单概述四点:
inRange函数是OpenCV提供的用于检测图像矩阵的元素各通道值是否介于两个指定的矩阵或标量lowerb和upperb对应通道值之间,如果检测图像的某个像素的各个通道值分别大于等于lowerb对应元素或标量的各个通道值且小于等于upperb对应元素或标量的各个通道值,则结果矩阵对应元素的各个通道被设置为255,否则被设置为0。
dst = inRange(src, lowerb, upperb, dst=None)
在本案例中,将采用展示指定图像,指定后用鼠标左键点击该图像中需要单独选择的图像的颜色,选择后则另外弹出一个窗口展示原图像中与选择点颜色相同的图像内容,其他部分被置为黑色,最后按ESC退出。
import cv2
import numpy as np
from opencvPublic import readImgFile
def OnMouseAction(event,x,y,flags,imginf): #图像展示界面的鼠标响应函数,用于根据点击图像像素的值来设置要选择的颜色
img,title = imginf
if event == cv2.EVENT_LBUTTONDOWN:
print("左键点击")
#cv2.circle(img,(x,y),5,(255,0,0))
pointRange = img[y:y+10,x:x+10]
HSV = cv2.cvtColor(pointRange,cv2.COLOR_BGR2HSV)
pointColor = HSV[0,0]
HMin = pointColor[0]-7 if (pointColor[0]-10)>0 else 0
HMax = pointColor[0]+7 if (pointColor[0]+10)<180 else 180
SMin = 43
SMax = 255
VMin = 46
VMax = 255
setTrackClor(title,(HMin,SMin,VMin),(HMax,SMax,VMax))
def setTrackClor(title,hsvMin,hsvMax): #根据选择的像素颜色设置窗口的轨迹条位置
HMin,SMin,VMin = hsvMin
HMax,SMax,VMax = hsvMax
cv2.setTrackbarPos('HMin', title,HMin)
cv2.setTrackbarPos('HMax', title,HMax)
def adjustSelectColor(value):pass #空函数,为了createTrackbar传值
def getSpecPointColor(title):#根据轨迹条的值来确认颜色的范围
HMin = cv2.getTrackbarPos('HMin', title)
HMax = cv2.getTrackbarPos('HMax', title)
SMin = 43
SMax = 255
VMin = 46
VMax = 255
return (HMin,SMin,VMin),(HMax,SMax,VMax)
def colorSelectRange(img,title):#展示图像并挑选要选择图像内容对应的颜色,挑选后显示该颜色对应的图像内容
cv2.namedWindow(title)
cv2.createTrackbar('HMin', title, 0, 180, adjustSelectColor)
cv2.createTrackbar('HMax', title, 0, 180, adjustSelectColor)
cv2.setMouseCallback(title, OnMouseAction, (img,title))
cv2.imshow(title,img)
minHsv = maxHsv = (0,0,0)
while True:
ch = cv2.waitKey(500)
if (ch & 0xFF) ==27:
return minHsv, maxHsv
elif ch==-1:
preminHsv,premaxHsv = minHsv, maxHsv
minHsv,maxHsv = getSpecPointColor(title)
if (minHsv!=preminHsv) or (maxHsv!=premaxHsv):
if premaxHsv == (0, 0, 0): continue
print(f"已经选择对应图像颜色HSV范围:{minHsv}--{maxHsv}")
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(imgHSV, np.array(minHsv), np.array(maxHsv))
imgResult = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("result img", imgResult)
def main(imgFName):#主程序
information = "老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号"
img = readImgFile(imgFName, False) #自定义读入图片文件的函数,具体功能请参考:https://blog.csdn.net/LaoYuanPython/article/details/111351901
minHsv, maxHsv = colorSelectRange(img,'select color by specpoint')
print(f"已经选择对应图像颜色HSV范围:{minHsv}--{maxHsv}。\n更多学习资料请参考:\n {information}")
main(r'f:\pic\手握蓝球.JPG')
选择点击蓝球,结果如下:
选择点击手,结果如下:
但如果选择下面的白色文字,则显示效果不太如意,大家可以想想原因,不知道的可以到"老猿Python"的微信公众号寻找答案。
按ESC退出后,程序控制台的文字输出如下:
左键点击
已经选择对应图像颜色HSV范围:(103, 43, 46)--(117, 255, 255)
左键点击
已经选择对应图像颜色HSV范围:(7, 43, 46)--(21, 255, 255)
左键点击
已经选择对应图像颜色HSV范围:(7, 43, 46)--(21, 255, 255)。
更多学习资料请参考:
老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号
本文介绍了通过使用inRange在HSV颜色空间中识别指定颜色的图像内容,文中概要介绍了HSV颜色空间中进行指定颜色对象识别的要点,使用的inRange函数的语法和功能,并提供了一个可以读取指定图像文件,用鼠标选择对应图像位置后显示该图像中与选择位置颜色相同的内容。
昨天到今天休假两天,既要处理家里事情,又要处理单位事情,还要写测试代码和博文。写博不易,敬请支持!
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。