簡體   English   中英

OpenCV inRange()適用於RGB,但不適用於HSV顏色空間

[英]OpenCV inRange() is working for RGB but not HSV color space

我已經以RGB和HSV格式生成了我的圖像的散點圖,並且正在使用inRange()來限制單色的發生,以免引起眼球。

為了獲得准確的RGB和HSV值,我使用paint.net的顏色選擇器獲取RGB值,然后使用RGB到HSV轉換器獲取HSV值。

在此處輸入圖片說明

像素顏色和散點圖通過以下方式生成:

img = cv2.imread('C:\\b_.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


pixel_colors = img.reshape((np.shape(img)[0]*np.shape(img)[1], 3))
norm = colors.Normalize(vmin=-1., vmax=1.)
norm.autoscale(pixel_colors)
pixel_colors = norm(pixel_colors).tolist()

h, s, v = cv2.split(img_hsv)
fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")

axis.scatter(h.flatten(), s.flatten(), v.flatten(), facecolors=pixel_colors, marker=".")
axis.set_xlabel("Hue")
axis.set_ylabel("Saturation")
axis.set_zlabel("Value")
plt.show()

我需要從圖像中提取黃色。 如前所述,我正在使用paint.net顏色選擇器來獲取淺黃色和深黃色的RGB值。 然后使用轉換器獲取inRange()函數的HSV值。

light_yellow = (60, 89, 97)    # HSV VALUES
dark_yellow = (61, 36.6, 43.9)

mask = cv2.inRange(img_hsv, light_yellow, dark_yellow)
result = cv2.bitwise_and(img, img, mask=mask)

但是生成的結果是黑色圖像,但是如果我直接使用淺黃色和深黃色的RGB值並使用RGB圖像而不是HSV轉換的圖像,則分割有效。

light_yellow = (249, 249, 125)    # RGB VALUES
dark_yellow = (111, 112, 71)

mask = cv2.inRange(img, light_yellow, dark_yellow)
result = cv2.bitwise_and(img, img, mask=mask)

在此處輸入圖片說明

盡管以上是RGB分割,但我認為HSV可能會得到改善。 為什么我的HSV范圍沒有輸出?

正如在cvtColor文檔中所表達的那樣 當它是CV_8U時,H值通常從0到360,它將被2除以從0-180的值。 S和V值通常為百分比(0-100%),范圍為0-255。

所以你的價值:

light_yellow = (60, 89, 97)    # HSV VALUES
dark_yellow = (61, 36.6, 43.9)

應該更像:

# (H/2, (S/100) * 255, (V/100) * 255) 
light_yellow = (30, 227, 247)    # HSV VALUES
dark_yellow = (31, 93, 112)

現在您遇到了另一個問題,inRanges會在上下限范圍內查找值,而不是淺黃色和深黃色。 因此,您的限制應為:

low = (30,93,112)
high = (31, 227,247)

mask = cv2.inRange(img_hsv, low, high)

還有一件事,我會為H顏色使用更大的范圍... 30-31很小,也許20-32更好?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM