0


OpenCV inRange 函数使用详解

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

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

1 RGB转HSV

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

1.1 转换工具

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

RGB HSV 转换 | 菜鸟工具

1.2 公式转换

  1. rgb 221,0,27 可以转换成 hsv 的格式,具体的方法如下:
  2. 首先,我们需要将 rgb 值转换成浮点数,方法是将每个值除以 255。因此,rgb(221,0,27) 可以转换成 (0.8666666666666667, 0.0, 0.10588235294117647)。
  3. 然后,我们可以使用以下公式来计算 hsv 值:
  4. h = 色相,s = 饱和度,v = 明度
  5. maxc = max(r, g, b)
  6. minc = min(r, g, b)
  7. if maxc == minc:
  8. h = 0
  9. elif maxc == r:
  10. h = 60 * ((g - b) / (maxc - minc))
  11. elif maxc == g:
  12. h = 60 * (2 + (b - r) / (maxc - minc))
  13. else:
  14. h = 60 * (4 + (r - g) / (maxc - minc))
  15. if h < 0:
  16. h += 360
  17. s = 0 if maxc == 0 else (1 - minc / maxc)
  18. v = maxc
  19. 所以,rgb(221,0,27) 可以转换成 hsv(348.57142857142856, 1.0, 0.8666666666666667)。
  20. 注意:在计算 hsv 值时,色相 h 的单位是角度,饱和度 s 和明度 v 的单位都是百分比,它们的取值范围分别是 0 3600 1 0 1

2 代码实现

  1. import cv2
  2. from PIL import Image
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. # 按间距中的绿色按钮以运行脚本。
  6. if __name__ == '__main__':
  7. image = cv2.imread('D:/Jupyter_Notebooks/3.png')
  8. # 从RGB色彩空间转换到HSV色彩空间
  9. hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
  10. # 颜色范围下限
  11. lower_threshold = np.array([110, 254, 220])
  12. # 颜色范围上限
  13. upper_threshold = np.array([180, 255, 255])
  14. # 使用inRange函数检测颜色
  15. mask = cv2.inRange(hsv, lower_threshold, upper_threshold)
  16. # 对原图像和掩码进行位运算
  17. result = cv2.bitwise_and(image, image, mask=mask)
  18. # H、S、V范围二:
  19. cv2.imshow("result", mask)
  20. cv2.imshow("image", image)
  21. cv2.waitKey(0)
  22. cv2.destroyAllWindows()

3 ChatGPT

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

4 识别红色区域

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

4.1 红色范围

  1. 我们主要想识别 网易云 有道 的红色颜色,这个不理想所以需要调整取值范围,
  1. # 颜色范围下限
  2. lower_threshold = np.array([0, 255, 255])
  3. # 颜色范围上限
  4. upper_threshold = np.array([180, 255, 255])

4.2 V亮度调整

  1. 因为我们这个颜色是取的网易云的所以要想同时看到有道还需要调整 S饱和度
  1. # 颜色范围下限
  2. lower_threshold = np.array([0, 255, 200])
  3. # 颜色范围上限
  4. upper_threshold = np.array([180, 255, 255])

4.3 S饱和度调整

  1. 我们VS值都调整完了,发现火绒的颜色也在取值范围内,所以现在需要调整H的范围将火绒的黄红色去掉
  1. # 颜色范围下限
  2. lower_threshold = np.array([0, 254, 200])
  3. # 颜色范围上限
  4. upper_threshold = np.array([180, 255, 255])

4.4 H色调调整

  1. 可以发现现在较为完美的实现了 有道 网易云 红色区域的识别。
  1. # 颜色范围下限
  2. lower_threshold = np.array([120, 254, 200])
  3. # 颜色范围上限
  4. upper_threshold = np.array([180, 255, 255])

5 识别蓝色区域

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

5.1 蓝色范围

  1. 我们主要想识别 腾讯会议和 腾讯微云。
  1. # 颜色范围下限
  2. lower_threshold = np.array([104, 250, 250])
  3. # 颜色范围上限
  4. upper_threshold = np.array([105, 255, 255])

5.2 识别蓝色

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

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

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

5.3 识别蓝色

  1. 可以看到最终识别的掉过还是可以的部分杂点可以过滤一下
  1. # 颜色范围下限 210
  2. lower_threshold = np.array([10, 210, 255])
  3. # 颜色范围上限
  4. upper_threshold = np.array([20, 215, 255])


本文转载自: https://blog.csdn.net/qq_37529913/article/details/128415136
版权归原作者 双子座断点 所有, 如有侵权,请联系我们删除。

“OpenCV inRange 函数使用详解”的评论:

还没有评论