OpenCV 檢測顏色

Ammar Ali 2022年5月17日
OpenCV 檢測顏色

本教程將討論在 Python 中使用 OpenCV 的 inRange() 函式檢測影象中的顏色。

在 Python 中使用 OpenCV 的 inRange() 函式檢測影象上的顏色

我們可以使用 OpenCV 的 inRange() 函式檢測和提取影象中存在的顏色。有時,出於某種原因,我們想從影象中刪除或提取顏色。

我們可以使用 OpenCV 的 inRange() 函式來建立顏色掩碼,或者換句話說,我們可以使用該顏色的範圍來檢測顏色。顏色以 RGB 三元組值格式儲存在彩色影象中。

要建立它的蒙版,我們必須使用該顏色的明暗版本的 RGB 三元組值。例如,在 BRG 影象中,如果我們要提取紅色,我們可以使用 (0,0,50) 表示淺紅色,使用 (255,50,50) 表示深紅色來建立紅色蒙版.

我們可以傳遞影象和上下 BRG 值來建立蒙版。

例如,讓我們讀取包含一些不同顏色的圓圈的影象,並建立一個紅色蒙版和一個綠色蒙版。請參閱下面的程式碼。

import cv2

img = cv2.imread("download.png")

# mask of red color
mask1 = cv2.inRange(img, (0, 0, 50), (50, 50, 255))

# mask of blue color
mask2 = cv2.inRange(img, (50, 0, 0), (255, 50, 50))

cv2.imshow("Original Image", img)
cv2.imshow("mask red color", mask1)
cv2.imshow("mask blue color", mask2)
cv2.waitKey(0)

輸出:

使用 inrange 製作蒙版

我們可以將這兩個蒙版與原始影象進行比較,以瞭解它們是否包含正確的顏色。我們可以看到掩碼一在紅色之上,而掩碼二在藍色之上。

inRange() 函式建立一個與原始影象相似的新二值影象。如你所見,蒙版影象中只有白色和黑色兩種顏色。

inRange() 函式將顏色的值設定為 1,如果顏色存在於給定的顏色範圍內,則設定為白色,如果顏色不存在於指定的顏色範圍內,則設定為 0。上圖採用 BRG 色標。

這就是我們在 inRange() 函式中使用 BRG 值的原因,但我們也可以將影象轉換為其他色標,例如 HSV,在這種情況下,我們將使用 HSV 標度值來建立蒙版。現在讓我們從影象中提取紅色和藍色。

要提取這兩種顏色,我們必須使用 OpenCV 的 bitwise_or() 函式將兩個蒙版組合起來以建立一個蒙版。之後,我們可以使用 OpenCV 的 bitwise_and() 函式從影象中提取顏色,使用影象作為第一個和第二個引數,掩碼作為第三個引數。

請參閱下面的程式碼。

import cv2

img = cv2.imread("download.png")

# mask of red color
mask1 = cv2.inRange(img, (0, 0, 50), (50, 50, 255))

# mask of blue color
mask2 = cv2.inRange(img, (50, 0, 0), (255, 50, 50))

# final mask
mask = cv2.bitwise_or(mask1, mask2)
target = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow("Original Image", img)
cv2.imshow("mask red color", mask1)
cv2.imshow("mask blue color", mask2)
cv2.imshow("mask of both colors", mask)
cv2.imshow("target colors extracted", target)
cv2.waitKey(0)

輸出:

從影象中提取顏色

從給定的影象中成功提取了紅色和藍色,如上一張影象所示。要將一種顏色空間轉換為另一種顏色空間,我們可以使用 OpenCV 的 cvtColor() 函式。

如果我們有一張帶有 HSV 顏色空間的影象,我們必須使用 HSV 值來建立蒙版。在 HSV 中,顏色具有定義顏色的三個值 Hue、Saturation 和 Value。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相關文章 - Python OpenCV

相關文章 - OpenCV Image