numpy 是否可以使用cv2.inRange()隔离BGR颜色渐变?

jyztefdp  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在编写一个程序,该程序观察屏幕上显示0到100之间的数字的区域。当数字为100时,该区域显示绿色文本;当数字为0时,该区域显示红色文本。随着数字从100开始减小,该区域缓慢地从纯绿色渐变为纯红色。
以下是一些例子:
第一次
100就是rgb(0, 255, 0)
84rgb(73, 255, 0)
65rgb(172, 255, 0)
41rgb(255, 213, 0)
17就是rgb(255, 88, 0)
0就是rgb(255, 0, 0)

问题

是否可以使用cv2.inRange(img, lower, upper)隔离此范围内的 * 任何/所有 * 颜色,其中lowerupper[B, G, R]形式的numpy数组?如果有合适的范围,您能解释为什么它有效吗?
我有这样的代码:

import cv2
import numpy as np

image = cv2.imread("image_of_text.png")

# Generate mask for color range
lower = [0, 0, 0]
upper = [0, 0, 0]
mask = cv2.inRange(image, np.array(lower), np.array(upper))

# Create black mask
h, w = image.shape[:2]
mask_b = np.zeros([h, w, 1], dtype=np.uint8)

# Combine masks
mask = cv2.bitwise_or(mask_b, mask)
cv2.imshow('result', mask)
cv2.waitKey(0)

我宁愿避免HSV范围,因为我的程序的其余部分不太适合在飞行中切换颜色空间。

vsikbqxv

vsikbqxv1#

我在写问题的时候就解决了这个问题。
据我所知,我们需要分离两个独立的范围:
绿色--〉lower = rgb(0, 255, 0)upper = rgb(255, 255, 0)
红色--〉lower = rgb(255, 0, 0)upper = rgb(255, 255, 0)
编码:

import cv2
import numpy as np

image = cv2.imread("image_of_text.png")

upper = [0, 255, 255]  # uppper is same for both

# Green range
lower = [0, 255, 0]
mask_g = cv2.inRange(image, np.array(lower), np.array(upper))

# Red range
lower = [0, 0, 255]
mask_r = cv2.inRange(image, np.array(lower), np.array(upper))

# Create black mask
h, w = image.shape[:2]
mask_b = np.zeros([h, w, 1], dtype=np.uint8)

# Combine masks
mask = cv2.bitwise_or(mask_b, mask_g)
mask = cv2.bitwise_or(mask, mask_r)
cv2.imshow('result', mask)
cv2.waitKey(0)

通过查看我在问题中列出的文本颜色,我注意到两个中间数字都接近rgb(255,255,0),但由于该渐变有两个不同的端点,因此我需要指定两个独立的下限,而它们都具有相同的上限。

相关问题