python-opencv中的cv2.inRange函数用法说明

作者:hjxu2016 时间:2022-09-29 23:39:08 

本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分

具体就调用了cv2的两个函数,一个是rgb转hsv的函数

具体用法


hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)

然后利用cv2.inRange函数设阈值,去除背景部分


mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,

函数很简单,参数有三个

第一个参数:hsv指的是原图

第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0

第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0

而在lower_red~upper_red之间的值变成255


lower_red = np.array([20, 20, 20])
upper_red = np.array([200, 200, 200])
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,lower~upper==>255

就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255

具体用法如下


hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
lower_red = np.array([20, 20, 20])
upper_red = np.array([200, 200, 200])
# mask -> 1 channel
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0

补充:色彩阀值化处理——openCV-python中inRange()等相关函数实测

色彩阀值化

在图像处理的过程中,使用各种形态学操作或者滤波的方式来突显我们关注的元素,同时降低噪声并减少干扰我们提取关键元素的影响项。除了这些方法外,我们可以在原图中先依据颜色的特征,提取出更为关键的像素。就像车道检测时,一般车道只有两种颜色:黄色和白色。所以我们可以在 RGB 色彩空间(Color Space) 对这两种颜色进行过滤从而提取出车道线的像素。

色彩空间:使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。有利用原色相混的比例表示的色彩空间,如 RGB (Red, Green, Blue) 颜色空间; 也有利用不同的概念表示的色彩空间,如 HSV (色相 hue, 饱和度 saturation, 明度 value) 以及 HSL (色相 hue,饱和度 saturation,亮度 lightness/luminance) 。

在OpenCV中,RGB三通道的图像的读取 cv2.imread() 的结果是以 BGR 顺序排列的,而在使用matplotlib的 plt.imread() 时, 读取的通道排列顺序则为 RGB 。因此此处应当注意区别。

openCV中cv2.inRange()函数是实现该功能的关键,我们先看看官网对该函数的定义:


dst = cv.inRange( src, lowerb, upperb[, dst] )

检测数组元素是否位于其他两个元素之间。

该函数检测范围方式如下:

对于单通道输入的每个元素:

python-opencv中的cv2.inRange函数用法说明

对于双通道输入:

python-opencv中的cv2.inRange函数用法说明

同样应用于四通道

也就是说,如果src (I)在指定的1D, 2D, 3D,…框内则dst(I)为255,否则为0。当下边界和/或上边界参数为标量时,应省略上述公式中在上、下边界处的索引(I)。

各参数详细含义:

src 输入的数组

lowerb 下边界数组或标量.

upperb 上边界数组或标量.

dst 与src和CV_8U类型大小相同的输出数组。

接下来将结合简单的例子通过python更好地理解这个函数:


import matplotlib.pyplot as plt
import numpy as np
import cv2
# 对图片进行读取
img_cv2 = cv2.imread('D:\\test\\CVtest.jpg')
print(img_cv2)

为了方便理解,我用画板工具画了一个5×5像素点的红 * 片。上述代码运行结果为:


[[[ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]]
[[ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]]
[[ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]]
[[ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]]
[[ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]
 [ 36  27 237]]]

读者可以自行测试一下,B=36,G=27,R=237为红色。


# 创建RGB色彩空间
color_Low1 = np.array([30,27,237])
color_Low2 = np.array([39,27,237])
color_High = np.array([40,27,237])
# 对图片进行阀值化处理
img_dst1 = cv2.inRange(img_cv2,color_Low1,color_High)
img_dst2 = cv2.inRange(img_cv2,color_Low2,color_High)
#对结果进行打印
print(img_dst1,'\n', img_dst2)
# 运行结果分别为
[[255 255 255 255 255]
[255 255 255 255 255]
[255 255 255 255 255]
[255 255 255 255 255]
[255 255 255 255 255]]
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]

可以看出,当图片中的像素点落在色彩空间时,输出结果全是255,当像素点不落在色彩空间是,输出结果全是0。对最终结果进行显示:


#对图像进行展示
cv2.imshow("origin_img",img_cv2)
cv2.imshow("dst_img1",img_dst1)
cv2.imshow("dst_img2",img_dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终结果为一个红色、一个黑色的、一个白色的小点。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/hjxu2016/article/details/77834599

标签:python,opencv,cv2.inRange
0
投稿

猜你喜欢

  • PHP json_encode中文乱码解决方法

    2023-07-12 20:20:14
  • 豆瓣可以做而且值得做的几件事情

    2009-04-24 12:07:00
  • Python subprocess模块常见用法分析

    2023-05-22 18:48:44
  • 教你使用python做一个“罚点球”小游戏

    2022-10-12 00:09:03
  • SQL Server数据库入门学习总结

    2012-08-21 11:01:33
  • 微软建议的ASP性能优化28条守则(1)

    2008-02-22 16:54:00
  • python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例

    2023-06-20 22:10:04
  • JavaScript 实现模态对话框 源代码大全

    2023-08-22 20:32:24
  • 使用Python实现简单的学生成绩管理系统

    2022-04-28 11:33:07
  • NumPy中的维度Axis详解

    2021-02-12 12:39:35
  • 如何使用python对图片进行批量压缩详解

    2022-12-05 04:22:25
  • 6个Python办公黑科技,助你提升工作效率

    2022-11-15 14:31:21
  • Python 用户输入和while循环的操作

    2023-07-22 22:17:33
  • 找不到类型或命名空间名称“Server”(是否缺少 using 指令或程序集引用?)

    2023-07-07 21:50:15
  • 使用Numpy读取CSV文件,并进行行列删除的操作方法

    2023-05-05 03:26:11
  • ASP在线转flv+缩略图

    2007-08-27 16:18:00
  • 最新Python APScheduler 定时任务详解

    2021-05-03 21:58:53
  • 支付宝lab logo设计创意发想

    2009-11-12 12:44:00
  • PHP+redis实现添加处理投票的方法

    2023-11-22 04:38:19
  • ASP实现下载系统防盗链方法

    2008-02-01 14:05:00
  • asp之家 网络编程 m.aspxhome.com