我试图从图像中提取红色.我有代码应用阈值只保留指定范围内的值:
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)
Run Code Online (Sandbox Code Playgroud)
但是,正如我检查的那样,红色可以在范围内具有Hue值,比如从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]
Run Code Online (Sandbox Code Playgroud)
它几乎满足了我的需求,而OpenCV的功能可能几乎完全相同,但如果有更好的方法(使用一些专用函数和编写更少的代码),请与我分享.:)