OpenCV inRange 函数使用详解

这篇具有很好参考价值的文章主要介绍了OpenCV inRange 函数使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本文是 OpenCV图像视觉入门之路的第6篇文章,本人详细的解决了RGB转HSV,HSV通过AI来进行HSV转 inRange() 函数的范围值操作,简单全面的解决了OpenCV对于图像中某个颜色的分析工作,本文通过识别红色区域和蓝色区域来编写示例程序和博客,也讲述了各种操作,例如:RGB转HSV、转换工具、公式转换、代码实现、猿如意中ChatGPT的使用、识别红色区域、调整V亮度、调整S饱和度、调整H色调、识别蓝色区域等等操作。

        AI未来相信会在我们的日常工作中有更高的出现频率,也可以帮助我们提高工作学习效率,目前VSCode中的ChatGPT国内服务器已经停止使用,大家可以下载猿如意体验使用ChatGPT!

OpenCV inRange 函数使用详解

本文作者原创,未经允许禁止转载。

OpenCV inRange 函数使用详解目录

1 RGB转HSV

1.1 转换工具

1.2 公式转换

2 代码实现

3 ChatGPT

4 识别红色区域

4.1 红色范围

4.2 V亮度调整

4.3 S饱和度调整

4.4 H色调调整

5 识别蓝色区域

5.1 蓝色范围

5.2 识别蓝色

5.3 识别蓝色


1 RGB转HSV

        最近一直在看OpenCV图像识别相关部分,在看到inRange函数的时候有点头大,主要是HSV色彩区域取某个颜色的HSV值搞得完全蒙了,看别的博客和文章都是一张漏斗图各个取值范围完全懵了。

1.1 转换工具

        程序员最重要的是解决问题的思路和办法,这里是菜鸟教程的转换工具很方便,也有相应的对照表:

RGB HSV 转换 | 菜鸟工具

OpenCV inRange 函数使用详解

OpenCV inRange 函数使用详解

1.2 公式转换

rgb 221,0,27 可以转换成 hsv 的格式,具体的方法如下:

首先,我们需要将 rgb 值转换成浮点数,方法是将每个值除以 255。因此,rgb(221,0,27) 可以转换成 (0.8666666666666667, 0.0, 0.10588235294117647)。

然后,我们可以使用以下公式来计算 hsv 值:

h = 色相,s = 饱和度,v = 明度

maxc = max(r, g, b)
minc = min(r, g, b)

if maxc == minc:
h = 0
elif maxc == r:
h = 60 * ((g - b) / (maxc - minc))
elif maxc == g:
h = 60 * (2 + (b - r) / (maxc - minc))
else:
h = 60 * (4 + (r - g) / (maxc - minc))

if h < 0:
h += 360

s = 0 if maxc == 0 else (1 - minc / maxc)
v = maxc

所以,rgb(221,0,27) 可以转换成 hsv(348.57142857142856, 1.0, 0.8666666666666667)。

注意:在计算 hsv 值时,色相 h 的单位是角度,饱和度 s 和明度 v 的单位都是百分比,它们的取值范围分别是 0 到 360、0 到 1 和 0 到 1。

2 代码实现

import cv2
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    image = cv2.imread('D:/Jupyter_Notebooks/3.png')

    # 从RGB色彩空间转换到HSV色彩空间
    hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

    # 颜色范围下限
    lower_threshold = np.array([110, 254, 220])
    # 颜色范围上限
    upper_threshold = np.array([180, 255, 255])

    # 使用inRange函数检测颜色
    mask = cv2.inRange(hsv, lower_threshold, upper_threshold)

    # 对原图像和掩码进行位运算
    result = cv2.bitwise_and(image, image, mask=mask)

    # H、S、V范围二:
    cv2.imshow("result", mask)
    cv2.imshow("image", image)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

3 ChatGPT

        这里用到了ChatGPT,很感谢猿如意工具能集成ChatGPT并且目前还可以使用(VSCode 国内版的ChatGPT已经无法连接),面向AI编程未来需要学会。

OpenCV inRange 函数使用详解

4 识别红色区域

        我这里在桌面截取了一部分应用识别出RGB红色的颜色是221,0,27,我先在菜鸟教程 RGB转HSV颜色后问了AI HSV转RGB它回答 H 0-180 S、V 0-255

OpenCV inRange 函数使用详解

4.1 红色范围

        我们主要想识别 网易云 和 有道 的红色颜色,这个不理想所以需要调整取值范围,

    # 颜色范围下限
    lower_threshold = np.array([0, 255, 255])
    # 颜色范围上限
    upper_threshold = np.array([180, 255, 255])

OpenCV inRange 函数使用详解

4.2 V亮度调整

        因为我们这个颜色是取的网易云的所以要想同时看到有道还需要调整 S饱和度

    # 颜色范围下限
    lower_threshold = np.array([0, 255, 200])
    # 颜色范围上限
    upper_threshold = np.array([180, 255, 255])

OpenCV inRange 函数使用详解

4.3 S饱和度调整

        我们V和S值都调整完了,发现火绒的颜色也在取值范围内,所以现在需要调整H的范围将火绒的黄红色去掉

    # 颜色范围下限
    lower_threshold = np.array([0, 254, 200])
    # 颜色范围上限
    upper_threshold = np.array([180, 255, 255])

OpenCV inRange 函数使用详解

4.4 H色调调整

        可以发现现在较为完美的实现了 有道 网易云 红色区域的识别。

    # 颜色范围下限
    lower_threshold = np.array([120, 254, 200])
    # 颜色范围上限
    upper_threshold = np.array([180, 255, 255])

OpenCV inRange 函数使用详解

5 识别蓝色区域

        识别腾讯会议 蓝色颜色范围是RGB(3,131,254),通过转HSV得出 0.5817,0.9882,0.9961 ChatGPT 转换

OpenCV inRange 函数使用详解

OpenCV inRange 函数使用详解

5.1 蓝色范围

        我们主要想识别 腾讯会议和 腾讯微云。
 

    # 颜色范围下限
    lower_threshold = np.array([104, 250, 250])
    # 颜色范围上限
    upper_threshold = np.array([105, 255, 255])

OpenCV inRange 函数使用详解

5.2 识别蓝色

        经过调整可以看到腾讯会议 和部分 ToDesk 颜色有一样的区域不过都过滤出来了,可以通过ROI截取功能截取掉多余的部分。

OpenCV ROI截取 、设置、保存_双子座断点的博客-CSDN博客_opencv截取roi

    # 颜色范围下限    210
    lower_threshold = np.array([10, 250, 252])
    # 颜色范围上限
    upper_threshold = np.array([20, 255, 255])

OpenCV inRange 函数使用详解

5.3 识别蓝色

        可以看到最终识别的掉过还是可以的部分杂点可以过滤一下

    # 颜色范围下限    210
    lower_threshold = np.array([10, 210, 255])
    # 颜色范围上限
    upper_threshold = np.array([20, 215, 255])

OpenCV inRange 函数使用详解

 文章来源地址https://www.toymoban.com/news/detail-435297.html

到了这里,关于OpenCV inRange 函数使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV 图像重映射函数remap()实例详解

             OpenCV 图像重映射函数remap()对图像应用通用几何变换。其原型如下:         void remap(InputArray  src,                               OutputArray dst,                                InputArray  map1,                                InputArray map2,            

    2024年04月23日
    浏览(34)
  • OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

    1、掩膜(Mask)是什么 (1)从物理的角度来看: 光刻是指利用光学复制的方法,把pcb电路图,印制在光敏记录材料上(这个光敏材料就是很薄的一层膜,我称之为掩膜Mask),用掩膜Mask 遮盖硅片,把掩膜Mask 上精细的电路图,通过光线的曝光印制到硅片上,来制作芯片; (2)

    2024年02月16日
    浏览(40)
  • C/C++开发,opencv读写图像函数详解

    目录 一、cv::imread函数读取图像         1.1 imread函数         1.2 imread函数的参数解析         1.3  imread函数实践案例         1.4 编译及测试  二、cv::imwrite函数存储图像         2.1 cv::imwrite函数         2.2 imwrite函数参数解析         2.3 imwrite函数实践案

    2024年02月15日
    浏览(37)
  • 【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解

    在OpenCV图像加法cv2.add函数详解详细介绍了图像的加法运算。 除了这种加法外,OpenCV还提供了带权重的加法,即两副图像的像素通道值相加时各自按一定的权重比例取值来相加。 假设有2个图像矩阵src1和src2,在两个图像融合时,各自的权重分别为alpha和beta,则二者融合后的目

    2024年02月15日
    浏览(84)
  • 使用OpenCV的cv2.imread函数读取图像介绍

    在计算机视觉和图像处理应用中,读取图像是一个常见的操作。OpenCV是一个广泛使用的图像处理库,它提供了 cv2.imread 函数,用于读取图像。本文将详细介绍如何使用 cv2.imread 函数,包括参数和用法。 首先,确保你已经安装了OpenCV库。你可以使用以下命令来安装OpenCV(如果尚

    2024年02月05日
    浏览(72)
  • 【精选】使用opencv的resize函数进行等比例放大或缩小图像

    在 OpenCV 中,使用 resize() 函数可以对图像进行缩放操作。若要按比例扩大或缩小图像,可以通过指定目标大小,并结合原始图像的尺寸进行等比例扩大。 以下是一个示例代码,展示了如何在 Python 中使用 OpenCV 对图像进行等比例扩大: 这段代码首先读取原始图像,然后获取其

    2024年02月03日
    浏览(38)
  • opencv中绘制图像的函数

    OpenCV 中用于绘制不同图形的 C++ 函数的简要介绍: 绘制矩形框: image :目标图像 pt1  和  pt2 :矩形的对角线顶点坐标 color :矩形的颜色 thickness :线条的粗细,如果为负数,表示填充矩形 绘制文字: image :目标图像 text :要绘制的文本 org :文本的起始坐标 fontFace :字体

    2024年02月06日
    浏览(43)
  • ROS OpenCV 图像基本处理函数

    在ROS中结合OpenCV使用时, cv::imread() 函数 并非ROS本身的API,而是来自OpenCV库的函数,用于读取本地磁盘上的图像文件。 其用法如下: cv::Mat cv::imread(const string filename, int flags = IMREAD_COLOR); 参数说明:     filename: 字符串类型,表示要读取的图像文件的完整路径和名称。   

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包