在 Python 中使用 OpenCV 進行影象顏色檢測
OpenCV 庫旨在幫助完成計算機視覺任務,並與各種程式語言相容。該庫實現了不同的有用演算法和技術來處理影象。
本教程將演示如何使用 Python 的 OpenCV 庫在影象中執行顏色檢測。
顏色檢測有多種應用。我們可以用它來區分現實生活中的物體。這也可以被認為是一種影象分割技術,因為我們嘗試根據相似的特徵來標記每個畫素。
我們將使用 HSV 顏色空間檢測顏色,它代表色相飽和度值。這是一個圓柱形顏色空間,在處理顏色資訊時非常有用。
Hue 決定顏色資訊,Saturation 表示顏色的強度,Value 根據顏色與黑色混合的多少決定亮度。
在 Python 中使用 OpenCV 庫進行影象顏色檢測
我們將使用 OpenCV 庫中的各種函式進行顏色檢測。讓我們在下面討論它們。
我們將檢測給定影象中的一種特定顏色,並在檢測到的片段周圍新增邊界。
我們需要將所需影象從 BGR 顏色空間轉換為 HSV。要在影象中執行此類轉換,我們可以使用 OpenCV 庫中的 cvtColor()
函式。
我們需要給定顏色的邊界,並返回影象中顏色所在位置的二進位制掩碼。OpenCV 的 inRange()
函式獲取給定影象並根據指定的上限和下限返回顏色當前所在位置的二進位制掩碼。
此蒙版是檢測到顏色的影象子集。
然後我們可以對這個二進位制掩碼應用形態學運算來過濾不需要的噪聲。我們將使用 OpenCV 庫中的 morphologyex()
函式來實現這一點。
它在膨脹後執行腐蝕以封閉物件中的小孔。
我們還需要使用這個建立的二進位制掩碼為影象新增邊界。
bitwise_and()
用於分割影象中與給定掩碼匹配的部分。使用 mask
引數提供掩碼。
它比較源影象中的每個畫素並匹配指定掩碼中的相應畫素。
為了給這個分割的影象新增邊界,我們將使用兩種方法,findContours()
和 drawContours()
。該輪廓可以被認為是沿著某些分割影象的邊界連線點的曲線。
第一個函式返回給定影象的所有輪廓的列表。我們將使用 drawcontours()
函式來繪製輪廓。
現在讓我們實現顏色檢測的程式碼,並在下圖中找到綠色。
程式碼:
import cv2
import numpy as np
img = cv2.imread('img3.jpeg')
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
bound_lower = np.array([25, 20, 20])
bound_upper = np.array([100, 255, 255])
mask_green = cv2.inRange(hsv_img, bound_lower, bound_upper)
kernel = np.ones((7,7),np.uint8)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_CLOSE, kernel)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)
seg_img = cv2.bitwise_and(img, img, mask=mask_green)
contours, hier = cv2.findContours(mask_green.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
output = cv2.drawContours(seg_img, contours, -1, (0, 0, 255), 3)
cv2.imshow("Result", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出:
現在讓我們簡要介紹一下實現的程式碼。
imread()
函式讀取影象。我們使用 cvtColor()
函式將該影象的顏色空間從 BGR 轉換為 HSV;注意函式中的 cv2.COLOR_BGR2HSV
引數。
然後我們指定上限和下限值來檢測影象中的綠色,並使用 inRange()
函式建立二進位制掩碼。
使用 morphologyEx()
函式從這個掩碼中去除噪聲兩次。
我們第一次使用 cv2.MORPH_CLOSE
引數過濾了黑色部分的白噪聲。第二次,我們使用 cv2.MORPH_CLOSE
從白色部分過濾黑噪聲。
然後我們在分割部分上畫出邊界。我們使用 findContours()
確定分割部分及其輪廓,並使用 drawContours()
方法繪製邊界。
まとめ
本教程討論瞭如何在 Python 中使用 OpenCV 執行顏色檢測。我們使用影象並檢測到與綠色匹配的部分。
有幾個與此相關的步驟。我們需要將影象轉換為正確的 HSV 顏色空間併為所需顏色建立遮罩。
然後我們需要過濾掉這個面具的噪音。然後將此掩碼與原始影象一起使用以分割檢測到的部分,並在其上繪製邊界。
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn