使用OpenCV進(jìn)行目標(biāo)提取詳細(xì)教程(附python代碼演練)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

今天的文章將討論并指導(dǎo)你識別圖像中的對象,使用 OpenCV 對這些對象進(jìn)行遮罩處理。讓我們開始吧!
HSV 色標(biāo)
請花一點(diǎn)時(shí)間觀察下面的圖片。每個(gè)圖塊似乎是不同的顏色,對吧?但是有一個(gè)有趣的地方:如果我們仔細(xì)思考,實(shí)際上可以將它們都?xì)w為綠色。然而,如果我們仔細(xì)觀察,我們會注意到它們是不同的綠色調(diào)。這是怎么回事呢?
綠色色調(diào)
盡管這些瓷磚具有相同的總體顏色,但它們有不同的組成部分,構(gòu)成了它們各自的特定綠色調(diào)。正如我們之前討論的那樣,這些組成部分被稱為紅色、綠色和藍(lán)色(RGB)。因此,雖然它們都屬于綠色類別,但它們的RGB組合是不同的,從而形成我們觀察到的不同綠色調(diào)。
但是,請等一下,這背后是否還有更多的東西?這個(gè)有趣的現(xiàn)象背后是否還有其他原因?確實(shí)如此!
你以前一定在畫圖軟件中見過這個(gè)選項(xiàng)卡。
定義繪畫上的自定義顏色
你可以看到,除了 (R)ed、(G)reen、(B)lue 之外,還有 3 個(gè)參數(shù),分別是 (H)ue、(S)at 和 (L)um(HSL 色調(diào))。
由于 HSL 和 HSV,我們可以實(shí)現(xiàn)如此多種色調(diào)。HSV 代表色相、飽和度和值。讓我們談?wù)?HSV,這對我們在 OpenCV 中的工作很有用。
HSV 色錐
H = 色調(diào):當(dāng)我們談?wù)撋{(diào)時(shí),我們談?wù)摰氖亲罴兇獾念伾问健O胂肽阍诓屎缰锌吹降念伾t色、橙色、黃色、綠色、藍(lán)色、靛藍(lán)和紫色。每一種都是不同的色調(diào),代表特定的光波長。
色調(diào)的范圍是 0 到 360 度。
S = 飽和度:飽和度是指顏色的鮮艷程度和強(qiáng)度。高度飽和的顏色鮮艷而豐富,而不飽和的顏色則顯得更加柔和或淺色。飽和度賦予顏色深度和影響力。
飽和度的范圍為 0–1(或 0–255)。
V = 值:顏色值與顏色的亮度或暗度有關(guān)。它由物體反射或吸收的光量決定。高值的顏色是亮的,而低值的顏色是暗的。值在創(chuàng)造對比和增加視覺構(gòu)圖的深度方面起著至關(guān)重要的作用。
值的范圍為 0–1(或 0–255)。
讓我們了解為什么需要將 BGR 圖像轉(zhuǎn)換為 HSV 顏色。
改進(jìn)的顏色處理
簡化的基于顏色的分析
對光照變化的魯棒性
與人類感知的兼容性
現(xiàn)在我們將了解如何在 Spyder OpenCV 中使用 HSV 圖像。
對象遮罩
假設(shè)你有 3 張車牌照。
我們正在嘗試提取這些車輛的車牌號。我們可以用 BGR 圖像來實(shí)現(xiàn)嗎?
我們當(dāng)然不能。這背后的原因是,我們在這里看到的橙色/黃色是由 (R)ed、(G)reen、(B)lue 的不同成分組成的,并且它們不是恒定的。此外,圖像之間的亮度、飽和度和曝光度也完全不同。
每幅圖像中橙色的 RBG 成分
因此很明顯,我們無法從 BGR 圖像中提取某種顏色。我們需要將此 BGR 圖像轉(zhuǎn)換為 HSV 圖像。讓我們看看如何做到這一點(diǎn)。
#import necessary libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
#using opencv to read an image
#BGR Image
plate_image_1 = cv2.imread("C:/users/public/pictures/numberp_1.png")
讓我們想象一下這個(gè)plate_image_1。
cv2.namedWindow("BGR Image", cv2.WINDOW_NORMAL);
cv2.imshow("BGR Image",plate_image_1);
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
現(xiàn)在讓我們將此plate_image_1 轉(zhuǎn)換為HSV 格式。為此,我們使用cv2.cvtColor() 。我們可以使用此函數(shù)將 BGR/RGB 轉(zhuǎn)換為 HSV、RGB 轉(zhuǎn)換為 BGR、在 RGB/BGR 和灰度之間轉(zhuǎn)換以及更多選項(xiàng)。
HSV_im_1 = cv2.cvtColor(plate_image_1,cv2.COLOR_BGR2HSV)
讓我們想象一下這個(gè) HSV 圖像。
使用 OpenCV 將 BGR 圖像轉(zhuǎn)換為 HSV 色標(biāo)
這對我們來說確實(shí)很奇怪,我們將看看如何從中提取橙色/黃色。
之前我們討論過圖像之間的亮度、飽和度和曝光完全不同。為了解決這個(gè)問題,我們?yōu)橐崛〉念伾x了一個(gè)范圍。準(zhǔn)確地說,我們按照自己的意愿為某種顏色定義了上邊界和下邊界。
這是通過查看 HSV 色錐來完成的。
首先,我們確定色相的范圍。色調(diào)范圍從 0 到 360。每 30 度我們就會得到一種不同的顏色。讓我們看看它的橙色。
通過粗略估計(jì) 15-20 度的下色相和 40-50 度的上色相,我們可以清楚地確定包含橙色每種色調(diào)的范圍。
對于飽和度和明度,我們獲得從 0 到 1 的整個(gè)范圍,以適應(yīng)圖像中的全部亮度變化。這樣可以準(zhǔn)確表示色譜內(nèi)較亮或較暗的色調(diào)。
讓我們在 Spyder 中定義它。
Orange_UB = np.array([40,255,255])
Orange_LB = np.array([20,0,0])
現(xiàn)在我們定義一個(gè)遮罩來跟蹤圖像中的橙色。這是通過使用 cv2.inRange() 來完成的。我們介紹了上界和下界以及執(zhí)行遮罩所需的圖像。
mask = cv2.inRange(HSV_im_1,Orange_LB,Orange_UB)
讓我們想象一下這個(gè)遮罩。
cv2.namedWindow("HSV Orange masked", cv2.WINDOW_NORMAL);
cv2.imshow("HSV Orange masked",mask);
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
就快到了!!我們可以幾乎清楚地看到車牌,但也有其他不必要的像素被掩蓋。我們?nèi)绾蝺?yōu)化我們的遮罩?我們需要改變飽和度和值的范圍,直到我們得到一個(gè)令人滿意的遮罩。
差不多了!讓我們對其進(jìn)行更多微調(diào)。
看起來不錯??!
這就是我們從圖像中提取特定顏色(范圍)的對象的方法。
完整代碼
#import necessary libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
#using opencv to read an image #BGR Image
plate_image_1 = cv2.imread("C:/users/public/pictures/numberp_1.png")
#converting BGR to HSV
HSV_im_1 = cv2.cvtColor(plate_image_1,cv2.COLOR_BGR2HSV)
#defining HSV range
Orange_UB = np.array([40,255,245])
Orange_LB = np.array([20,55,180])
#masking
mask = cv2.inRange(HSV_im_1,Orange_LB,Orange_UB)
#visualizing
cv2.namedWindow("HSV Orange masked", cv2.WINDOW_NORMAL);
cv2.imshow("HSV Orange masked",mask);
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。
下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


