当前位置: 首页 > news >正文

OpenCV-Python图像处理:用inRange刷选图像中指定颜色对象案例

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░

一、引言

在图像识别处理中,有时需要将图像中指定颜色对的对象抠图出来,此时使用HSV空间结合inRange函数即可以做到。

二、相关背景知识

2.1、HSV颜色空间

关于HSV颜色空间的资料到处都有,可以参考《HSV颜色识别-HSV基本颜色分量范围》和《Python图像处理:OpenCV HSV和标准表示法的区别以及转换》。老猿不重复介绍,只简单概述四点:

  1. HSV颜色空间对颜色的表述非常符合人眼识别颜色的情况,表达起来更加直观,其中H表示色彩、S表示饱和度、V表示明度,分别代表了人眼对颜色的感知:“这是什么颜色?深浅如何?明暗如何?”,正因为如此,对感知颜色的物体识别时,HSV颜色空间比RGB空间具有独特优势;
  2. OpenCV的HSV表示法和标准的表示法不同,具体的请参考上面第二篇博文的介绍;
  3. 在OpenCV的HSV颜色表示法内,从《Python图像处理:OpenCV HSV和标准表示法的区别以及转换》提供的表格来看,经过实验测试的彩色(非黑、白、灰)的饱和度最小值最好是43开始、最大值255,明度最小值最好是46开始,最大255,而某个颜色范围的H最大和最小值差距基本上在10-30之间,大部分在10-14之间,这个范围我们可以用于颜色识别的处理;
  4. 从OpenCV的BGR空间转换到HSV空间,可以使用cvtColor带转换类型为COLOR_BGR2HSV。

2.2、关于inRange函数

inRange函数是OpenCV提供的用于检测图像矩阵的元素各通道值是否介于两个指定的矩阵或标量lowerb和upperb对应通道值之间,如果检测图像的某个像素的各个通道值分别大于等于lowerb对应元素或标量的各个通道值且小于等于upperb对应元素或标量的各个通道值,则结果矩阵对应元素的各个通道被设置为255,否则被设置为0。

调用语法: dst = inRange(src, lowerb, upperb, dst=None)

三、案例

3.1、案例说明

在本案例中,将采用展示指定图像,指定后用鼠标左键点击该图像中需要单独选择的图像的颜色,选择后则另外弹出一个窗口展示原图像中与选择点颜色相同的图像内容,其他部分被置为黑色,最后按ESC退出。

3.2、案例代码

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')

3.3、运行结果

选择点击蓝球,结果如下:
在这里插入图片描述
选择点击手,结果如下:
在这里插入图片描述
但如果选择下面的白色文字,则显示效果不太如意,大家可以想想原因,不知道的可以到"老猿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

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

相关文章:

  • PyQt事件信号实战:为QTableWidget提供键盘事件
  • OpenCV-Python图像处理:区分前景背景权重的图像融合案例
  • 2020年总结:平安辞旧岁,老牛自奋蹄!
  • OpenCV-Python图像处理:插值方法及使用resize函数进行图像缩放
  • Python3装饰器的隐秘角落
  • 一种利用Python库解决视频课程检测窗口是否活动的简单方法
  • 人工智能数学基础6:极限、极限运算、ε-δ语言、ε-N语言、级数和函数连续性
  • 人工智能数学基础专栏目录
  • 人工智能数学基础8:两个重要极限及夹逼定理
  • 人工智能数学基础9:集合相关概念
  • 人工智能数学基础10:域、函数及相关概念
  • 人工智能数学基础-线性代数1:向量及向量加减法与数乘
  • 人工智能数学基础-线性代数2:向量的点积、內积、数量积和外积
  • 人工智能数学基础-线性代数3:线性空间、线性相关及基
  • 请大家支持老猿参加2020年博客之星年度评选,谢谢!
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android交互
  • angular2 简述
  • Apache Pulsar 2.1 重磅发布
  • IDEA 插件开发入门教程
  • js中的正则表达式入门
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Rancher-k8s加速安装文档
  • 编写符合Python风格的对象
  • 前端学习笔记之观察者模式
  • 嵌入式文件系统
  • 微信小程序--------语音识别(前端自己也能玩)
  • elasticsearch-head插件安装
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (黑马C++)L06 重载与继承
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三十五)大数据实战——Superset可视化平台搭建
  • (实战篇)如何缓存数据
  • (一)认识微服务
  • .bat文件调用java类的main方法
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net 流——流的类型体系简单介绍
  • .net 使用ajax控件后如何调用前端脚本
  • .net6 webapi log4net完整配置使用流程
  • .NET大文件上传知识整理
  • @Conditional注解详解
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [CTO札记]如何测试用户接受度?
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [ICCV2017]Neural Person Search Machines
  • [LeetCode]—Anagrams 回文构词法