一、cv2.inrange概述
cv2.inrange是OpenCV(Python版)的函数库中常用的一个函数,该函数可以帮助开发者实现指定范围内的颜色选择,也就是在图像处理中对指定区域的像素进行筛选。这个函数能快速的对图像的颜色、亮度等进行筛选输出符合要求的像素值集合,而且比较易于使用,常用于图像的前处理工作中,如目标颜色检测等,对于图像的关键颜色分离,该函数也是非常有用的。
二、cv2.inrange函数的调用方法
调用cv2.inrange函数时,我们需要注意几个重要的参数,我们来看看下面的代码:
import cv2
import numpy as np
image = cv2.imread('test.jpg')
lower = np.array([0, 0, 0]) # 下界
upper = np.array([255, 255, 255]) # 上界
mask = cv2.inRange(image, lower, upper) # 通过对比原图和上下界值,返回一个二值化的掩码图像
output = cv2.bitwise_and(image, image, mask=mask) # 通过 mask 将指定区域像素变成黑色
cv2.imshow('Output', output)
cv2.waitKey(0)
以上代码需要更改 lower 和 upper 参数值分别代表颜色的下限和上限,经过处理后的图像区域颜色会在这个范围内,而变成白色,不在范围内的颜色区域会变成黑色。
三、cv2.inrange的两个返回变量
在上例中,cv2.inRange函数返回了两个变量, mask 表示一个二值化的掩模图像, output表示经过 mask 处理后的新图像。
mask的作用是,通过对比原图和上下界值,返回一个二值化的掩码图像,该图像的黑白分界线就是上下界设定的阈值,这个阈值包括两种状态,满足(黑色)和不满足(白色)。当然,这个匹配的条件是由我们自己设定的,所以不同的条件下得到的图像也是有所不同的。
output函数是在原始图片基础上组合mask因素之后得到的新图像。在这个新图像中,只有指定范围内的颜色部分才能保留下来,不在指定范围内的部分则被变成黑色。output函数的一项重要作用主要用于遮挡,当我们只需要用到某个图上的特定部分时,可以使用output函数将不需要的部分遮挡住(即变成黑色),从而分离出需要的部分,用于之后的处理。
四、cv2.inrange函数的应用实例
下面我们可以通过一些实例来更好地理解cv2.inrange函数的具体应用:
1、颜色区间选取
假设我们有一张图片,图片中有蓝色的球和绿色的球。我们想要取出只有蓝球,将绿球去掉,可以通过以下代码实现:
import cv2
import numpy as np
# 读取图片
image = cv2.imread('test1.jpg')
# 将图像从BGR空间转换成HSV空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 设定蓝色的阈值
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
# 设定绿色的阈值
# 在 HSV 中,绿色的范围是 60-120
lower_green = np.array([40, 50, 50])
upper_green = np.array([70, 255, 255])
# 设定蓝色和绿色的掩码
blue_mask = cv2.inRange(hsv, lower_blue, upper_blue)
green_mask = cv2.inRange(hsv, lower_green, upper_green)
# 对图像进行掩模和反掩模计算
res_blue = cv2.bitwise_and(image, image, mask=blue_mask)
res_green = cv2.bitwise_and(image, image, mask=green_mask)
res_or = cv2.bitwise_or(res_blue, res_green)
cv2.imshow('blue', res_blue)
cv2.imshow('green', res_green)
cv2.imshow('or', res_or)
cv2.waitKey(0)
当我们对这张图像和以上代码进行处理时,绿色的部分会被过滤掉,而蓝色的部分则保留下来。
2、图片二值化
我们可以使用cv2.inrange函数将原图像转换成二值图像,利用一些其它的方式能更好地处理图像的亮度和颜色等信息,当然二值化也是一种通用的图像处理方法。
import cv2
import numpy as np
image = cv2.imread('test2.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 设定图片阈值
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
# 使用cv2.inRange转换成颜色阈值
lower = np.array([0])
upper = np.array([50])
mask = cv2.inRange(thresh, lower, upper)
# 应用mask
res = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('gray', gray)
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.waitKey(0)
在这个例子中,我们将原图片转化为灰度图并进行二值化。通过cv2.inRange函数,我们将特定的部分分割出来,然后处理。
五、总结
通过以上的分析,我们可以看到cv2.inrange函数在图像处理过程中的重要性。通过对上下界的设定,我们可以应用cv2.inrange函数快速准确地选择需要的区域,这对于初学者和有经验的开发者来说都是可以实现的。出于对图像处理技术的研究,本次讲解了cv2.inrange函数,相信读者在实践中也可以举一反三,应用到自己的项目中。