OpenCV inRange 函数使用详解
本文是 OpenCV图像视觉入门之路的第6篇文章,本人详细的解决了RGB转HSV,HSV通过AI来进行HSV转 inRange() 函数的范围值操作,简单全面的解决了OpenCV对于图像中某个颜色的分析工作,本文通过识别红色区域和蓝色区域来编写示例程序和博客,也讲述了各种操作,例如:RGB转HSV、转换工具、公式转换、代码实现、猿如意中ChatGPT的使用、识别红色区域、调整V亮度、调整S饱和度、调整H色调、识别蓝色区域等等操作。
AI未来相信会在我们的日常工作中有更高的出现频率,也可以帮助我们提高工作学习效率,目前VSCode中的ChatGPT国内服务器已经停止使用,大家可以下载猿如意体验使用ChatGPT!
本文作者原创,未经允许禁止转载。
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 转换 | 菜鸟工具
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编程未来需要学会。
4 识别红色区域
我这里在桌面截取了一部分应用识别出RGB红色的颜色是221,0,27,我先在菜鸟教程 RGB转HSV颜色后问了AI HSV转RGB它回答 H 0-180 S、V 0-255
4.1 红色范围
我们主要想识别 网易云 和 有道 的红色颜色,这个不理想所以需要调整取值范围,
# 颜色范围下限
lower_threshold = np.array([0, 255, 255])
# 颜色范围上限
upper_threshold = np.array([180, 255, 255])
4.2 V亮度调整
因为我们这个颜色是取的网易云的所以要想同时看到有道还需要调整 S饱和度
# 颜色范围下限
lower_threshold = np.array([0, 255, 200])
# 颜色范围上限
upper_threshold = np.array([180, 255, 255])
4.3 S饱和度调整
我们V和S值都调整完了,发现火绒的颜色也在取值范围内,所以现在需要调整H的范围将火绒的黄红色去掉
# 颜色范围下限
lower_threshold = np.array([0, 254, 200])
# 颜色范围上限
upper_threshold = np.array([180, 255, 255])
4.4 H色调调整
可以发现现在较为完美的实现了 有道 网易云 红色区域的识别。
# 颜色范围下限
lower_threshold = np.array([120, 254, 200])
# 颜色范围上限
upper_threshold = np.array([180, 255, 255])
5 识别蓝色区域
识别腾讯会议 蓝色颜色范围是RGB(3,131,254),通过转HSV得出 0.5817,0.9882,0.9961 ChatGPT 转换
5.1 蓝色范围
我们主要想识别 腾讯会议和 腾讯微云。
# 颜色范围下限
lower_threshold = np.array([104, 250, 250])
# 颜色范围上限
upper_threshold = np.array([105, 255, 255])
5.2 识别蓝色
经过调整可以看到腾讯会议 和部分 ToDesk 颜色有一样的区域不过都过滤出来了,可以通过ROI截取功能截取掉多余的部分。
OpenCV ROI截取 、设置、保存_双子座断点的博客-CSDN博客_opencv截取roi
# 颜色范围下限 210
lower_threshold = np.array([10, 250, 252])
# 颜色范围上限
upper_threshold = np.array([20, 255, 255])
5.3 识别蓝色
可以看到最终识别的掉过还是可以的部分杂点可以过滤一下
# 颜色范围下限 210
lower_threshold = np.array([10, 210, 255])
# 颜色范围上限
upper_threshold = np.array([20, 215, 255])