python - 使用 Python 和 OpenCV 在图像中查找红色

标签 python image opencv image-processing hsv

我正在尝试从图像中提取红色。我有应用阈值以仅保留指定范围内的值的代码:

img=cv2.imread('img.bmp')
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,50,50]) #example value
upper_red = np.array([10,255,255]) #example value
mask = cv2.inRange(img_hsv, lower_red, upper_red)
img_result = cv2.bitwise_and(img, img, mask=mask)

但是,正如我检查的那样,红色的色调值可以在 0 到 10 范围内,也可以在 170 到 180 范围内。因此,我想保留这两个范围中的任何一个值。我尝试将阈值设置为 10 到 170 并使用 cv2.bitwise_not() 函数,但随后我也得到了所有白色。我认为最好的选择是为每个范围创建一个掩码并同时使用它们,所以我必须在继续之前以某种方式将它们连接在一起。

有没有一种方法可以使用 OpenCV 连接两个掩码?还是有其他方法可以实现我的目标?

编辑。我带来的不是很优雅,但可行的解决方案:

image_result = np.zeros((image_height,image_width,3),np.uint8)

for i in range(image_height):  #those are set elsewhere
    for j in range(image_width): #those are set elsewhere
        if img_hsv[i][j][1]>=50 \
            and img_hsv[i][j][2]>=50 \
            and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170):
            image_result[i][j]=img_hsv[i][j]

它几乎满足了我的需求,OpenCV 的函数可能做的差不多,但是如果有更好的方法(使用一些专用函数并编写更少的代码)请与我分享。 :)

最佳答案

我只是将蒙版加在一起,然后使用 np.where 来蒙版原始图像。

img=cv2.imread("img.bmp")
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# lower mask (0-10)
lower_red = np.array([0,50,50])
upper_red = np.array([10,255,255])
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)

# upper mask (170-180)
lower_red = np.array([170,50,50])
upper_red = np.array([180,255,255])
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)

# join my masks
mask = mask0+mask1

# set my output img to zero everywhere except my mask
output_img = img.copy()
output_img[np.where(mask==0)] = 0

# or your HSV image, which I *believe* is what you want
output_hsv = img_hsv.copy()
output_hsv[np.where(mask==0)] = 0

这比遍历图像的每个像素要快得多,可读性也要好得多。

关于python - 使用 Python 和 OpenCV 在图像中查找红色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30331944/

相关文章:

python - 排除通用 CRUD View 中的字段

Python:用于 Python2.7 和 Python3.x 的最新 GUI 调试器,没有 IDE

image - 从 3 个静态摄像机的角度来看如何恢复其在 3d 空间中的位置?

java - RGB 到 HSV 转换

opengl - 使用 2 个摄像头进行头部姿势估计

python - 在列表列表中按索引查找最小值/最大值

python - ,= 运算符

python - 用Python创建动态论坛签名生成器

jQuery 等待 AJAX 页面完全加载

python - 在 python 中使用 openCV 检测睁眼或闭眼