inRange是OpenCV中的图像阈值函数,用于将图像中的像素值限制在指定的范围内。它的输入和输出如下所述:
dst = cv2.inRange(src, lowerb, upperb[, dst])
输入值:
- src:输入图像,可以是灰度图像或彩色图像。
- lowerb:表示下界的阈值,可以是一个标量值或与输入图像通道数相同的数组。对于灰度图像,lowerb是一个标量值。对于彩色图像,你可以通过传递一个数组,每个元素分别表示每个通道的下界阈值。
- upperb:表示上界的阈值,与lowerb的类型相同,指定上界阈值。对于灰度图像,upperb是一个标量值。对于彩色图像,你可以通过传递一个数组,每个元素分别表示每个通道的上界阈值。
- dst(可选):输出图像,用于存储计算得到的阈值图像。它应该具有与输入图像相同的尺寸和数据类型。
返回值:
- dst:阈值图像,与输入图像具有相同的尺寸和数据类型。如果提供了dst参数,则返回值与dst相同。
inRange函数的作用是根据指定的下界和上界阈值,将输入图像中的像素值限制在这个范围内。它会将满足条件的像素设置为255(白色),不满足条件的像素设置为0(黑色),从而形成一个二值图像。这种二值图像常用于图像分割、目标提取等任务中。下面是一个示例代码,演示如何使用inRange函数将输入图像中的像素值限制在指定范围内,并输出阈值图像:
import cv2
import numpy as np
# 加载图像
image = cv2.imread('path/to/image.jpg')
# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围(例如,提取蓝色对象)
lower_blue = np.array([100, 50, 50]) # 下界阈值
upper_blue = np.array([130, 255, 255]) # 上界阈值
# 应用颜色范围阈值
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 显示阈值图像
cv2.imshow('Thresholded Image', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例中,我们首先将图像转换为HSV颜色空间,然后定义了蓝色对象的颜色范围。通过调用inRange函数并传递HSV图像和颜色范围阈值,我们得到了一个阈值图像mask,其中满足蓝色范围的像素被设置为255(白色),不满足范围的像素被设置为0(黑色)。最后,我们显示了阈值图像。
其中最为关键的是要找到合适的lowerb和upperb,这个在CAMShift算法中非常关键。补充HSV知识点,HSV(Hue, Saturation, Value)是一种常用的颜色空间,它基于颜色的感知属性。HSV 颜色空间将颜色分为三个主要组成部分:
- 色调(Hue):色调表示颜色的基本属性,如红色、蓝色、绿色等。它以角度的形式表示,取值范围通常是 0 到 360 度,对应于色轮上的不同位置。色调值决定了颜色的类型。
- 饱和度(Saturation):饱和度表示颜色的鲜艳程度或纯度。较高的饱和度表示颜色更鲜艳,而较低的饱和度表示颜色更灰暗或接近无色。饱和度的取值范围通常是 0 到 100%,其中 0% 表示灰色或无色,100% 表示完全饱和的纯色。
- 亮度(Value):亮度表示颜色的明暗程度。较高的亮度值表示颜色更明亮,而较低的亮度值表示颜色更暗。亮度的取值范围通常是 0 到 100%,其中 0% 表示黑色,100% 表示最大亮度的白色。