[英]How to detect two different colors using `cv2.inRange` in Python-OpenCV?
如何定義兩種不同顏色的“下”和“上”范圍,例如紅色和藍色(因為紅色和藍色在 HSV 顏色中並不相鄰)
這個屬於紅色:
lower_red = np.array([160,20,70])
upper_red = np.array([190,255,255])
而這個屬於藍色:
lower_blue = np.array([101,50,38])
upper_blue = np.array([110,255,255])
我嘗試使用 if 條件組合它們或創建自己的函數但不起作用,你們能告訴我解決方案嗎?
P/s:Python 中的 OpenCV
當你得到兩個color
s 的掩碼時,然后使用cv2.bitwise_or
來獲得最終的掩碼。
import cv2
## Read
img = cv2.imread("sunflower.jpg")
## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
## mask of green (36,0,0) ~ (70, 255,255)
mask1 = cv2.inRange(hsv, (36, 0, 0), (70, 255,255))
## mask o yellow (15,0,0) ~ (36, 255, 255)
mask2 = cv2.inRange(hsv, (15,0,0), (36, 255, 255))
## final mask and masked
mask = cv2.bitwise_or(mask1, mask2)
target = cv2.bitwise_and(img,img, mask=mask)
cv2.imwrite("target.png", target)
來源:
找到綠色和黃色(范圍不是那么准確):
順便說一句,為了獲得更准確的范圍,這是我的相關答案中的參考地圖:
下圖顯示了 HSV 色彩空間,它使用色調、飽和度和值(或亮度)。
在 HSV 顏色空間中工作時,重要的是要記住這一點,並且諸如紅色和綠色之類的概念是一種轉換回不同數據類型的方式。
因此,您的上下邊界只能是該空間中的一個點,但可以包括紅色和藍色光譜的一部分,即紫色。 您需要選擇滿足您需要的任何處理輸出標准的閾值。
要么運行兩個單獨的循環,第一個循環對紅色進行閾值處理,第二個循環對藍色進行閾值處理,然后使用OpenCV
Blend 函數將兩個圖像混合在一起。 有關混合兩個顏色空間的信息,請參見此處。
# Make a copy of the image
image_copy = np.copy(image)
## TODO: Define the color selection boundaries in RGB values
# play around with these values until you isolate the blue background
lower_blue = np.array([200,0,0])
upper_blue = np.array([250,250,255])
# Define the masked area
mask = cv2.inRange(image_copy, lower_blue, upper_blue)
# Vizualize the mask
plt.imshow(mask,cmap='gray')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.