王全勝



摘要:顏色是物體的一種重要特征,人們可以依據(jù)顏色對(duì)物體進(jìn)行分類、判斷等。顏色識(shí)別很大程度上改變著人們的工作方式。使用計(jì)算機(jī)對(duì)顏色進(jìn)行識(shí)別,可以極大地提高工作效率,降低工作成本。本文就opencv中使用HSV模型對(duì)紅色識(shí)別過(guò)程中存在的識(shí)別不準(zhǔn)確、不全面的情況進(jìn)行了分析并提出解決方法,并在實(shí)踐中加以驗(yàn)證。
關(guān)鍵詞:opencv;顏色識(shí)別;紅色;hsv python
中圖分類號(hào):TP18? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)25-0112-02
計(jì)算機(jī)視覺是使用計(jì)算機(jī)的攝像設(shè)備采集圖像并進(jìn)行識(shí)別,并從圖像中獲取信息的人工智能系統(tǒng)。簡(jiǎn)單的說(shuō),就是不但讓計(jì)算機(jī)學(xué)會(huì)看,還讓他知道看到了什么。以人看到的圖像為例,我們可以從中辨認(rèn)出形狀、顏色、大小、亮度、色彩等。讓計(jì)算機(jī)辨認(rèn)出特定的顏色,就是顏色識(shí)別。顏色是物體的一種重要特征,人們可以依據(jù)顏色對(duì)物體進(jìn)行分類、判斷等。利用顏色特征,人們?cè)诤芏嘈袠I(yè)的應(yīng)用中獲得了便利。比如,在快遞行業(yè),依據(jù)不同的顏色對(duì)流水線上的物品進(jìn)行分揀;在農(nóng)業(yè),利用顏色識(shí)別判斷果蔬的成熟程度、對(duì)異常作物進(jìn)行定位、藥物噴灑和進(jìn)行田間雜草和作物的區(qū)分(智能除草);在公共安全方面,對(duì)火焰顏色的識(shí)別。大到衛(wèi)星遙感監(jiān)控山火,小到倉(cāng)庫(kù)火災(zāi)預(yù)警,顏色識(shí)別很大程度上改變著人們的工作方式。使用計(jì)算機(jī)對(duì)顏色進(jìn)行識(shí)別,可以極大地提高工作效率,降低工作成本。視覺識(shí)別技術(shù)目前在工業(yè)檢測(cè)、生物醫(yī)學(xué)、X射線圖像增強(qiáng)、遙感圖像分析和空間技術(shù)等方面具有廣泛的應(yīng)用價(jià)值。
1 顏色識(shí)別的方法
顏色識(shí)別主要有兩種方法,一種利用顏色模型識(shí)別,另一種采用訓(xùn)練分類器的方法識(shí)別,第一種方法穩(wěn)定性并不高,經(jīng)常調(diào)節(jié)白平衡,即Gamma值,來(lái)適應(yīng)色溫的變化,第二種方法也會(huì)受到未分類的特殊情況的影響,根據(jù)具體應(yīng)用情況,擇優(yōu)選擇。彩色圖像的顏色模型有很多種形式,RGB、YUV、HSV、CMYK等,其中在圖像處理以RGB最為直觀理解且顯示器系統(tǒng)采用就是此類模型,而HSV更符合人眼的顏色分辨,通常在HSV顏色空間下進(jìn)行顏色識(shí)別。HSV分別指色相、飽和度、亮度。色相就是“是什么顏色”,飽和度就是顏色有多濃,亮度就是圖像的明暗程度。
以HSV模型為例,它將顏色空間的模型對(duì)應(yīng)于圓柱坐標(biāo)系中的一個(gè)圓錐形子集,圓錐的頂面對(duì)應(yīng)于V=1。它包含RGB模型中的R=1,G=1,B=1 三個(gè)面,所代表的顏色較亮。色彩H由繞V軸的旋轉(zhuǎn)角給定。紅色對(duì)應(yīng)于角度0°,綠色對(duì)應(yīng)于角度120°,藍(lán)色對(duì)應(yīng)于角度240°。
識(shí)別顏色的算法是讀取照片像素點(diǎn)的顏色,轉(zhuǎn)換成HSV模型中的值,看它是否在要識(shí)別的顏色區(qū)間內(nèi)。把在此顏色區(qū)間內(nèi)的點(diǎn)的集合作為掩模,與原照片按位進(jìn)行與運(yùn)算,就得出了要尋找的顏色區(qū)域。舉個(gè)例子。我們要識(shí)別藍(lán)色的范圍,就把像素點(diǎn)轉(zhuǎn)換成HSV模型。對(duì)照?qǐng)D一,看是否H(色相)在100至124之間,S(飽和度)是否在43至255之間,V(亮度)是否在46至255之間。如果同時(shí)滿足這三個(gè)條件,我們就認(rèn)為這個(gè)像素點(diǎn)是藍(lán)色。這比較好理解。在實(shí)際的識(shí)別中,根據(jù)光線不同,這三個(gè)值會(huì)有稍許偏差。
2 識(shí)別紅色的特殊之處
在使用無(wú)人機(jī)機(jī)載攝像頭對(duì)色塊進(jìn)行識(shí)別、判斷形狀的過(guò)程中我們發(fā)現(xiàn)紅色的識(shí)別成功率明顯小于其他顏色。通過(guò)抓取掩模我們看到,本應(yīng)是紅色的區(qū)域掩模沒有完全覆蓋。通過(guò)圖一的表我們可以看到紅色的范圍并不是連續(xù)的范圍。它的H分布在0至10以及156至180。這兩個(gè)范圍的顏色都是紅色,因?yàn)槠浞植荚贖SV模型中不連續(xù),所以我們?cè)诮o定顏色區(qū)間時(shí)只能給定其中一個(gè)。
3 掩模的抓取
我們使用python的opencv來(lái)做了實(shí)驗(yàn)。首先,我們選擇了一張有色彩漸變的圖片作為實(shí)驗(yàn)素材。
如圖2,我們選擇了一張聯(lián)想的彩色羽毛壁紙作為素材。將0至10范圍內(nèi)的紅色掩模(圖3)和156至180范圍內(nèi)的紅色掩模(圖4)進(jìn)行了對(duì)比。
如圖4所示,兩組掩碼并不重合,但對(duì)應(yīng)在圖2上的區(qū)域都是紅色。只要將兩塊區(qū)域合并再與圖二做按位與操作,就能得到圖二中的紅色區(qū)域。
4 算法
有了想法,我們用python寫了一段代碼來(lái)實(shí)現(xiàn)。代碼中使用了opencv和numpy。
import cv2
import numpy as np
def color_area(img, colors, thresholds):
"""
Args:
img:經(jīng)過(guò)濾波的BGR圖像
colors(list):需要分割的顏色
thresholds(dict):顏色的閾值
Returns:
mask(dict):{"顏色"(str):掩膜(二值圖)}
"""
masks = {}
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)? ? #將圖像轉(zhuǎn)換成HSV模型
for color in colors:
low = thresholds[color][0]
high = thresholds[color][1]
mask = cv2.inRange(img_hsv,low,high)
s = np.sum(mask)? # 判斷掩膜是否全黑(沒有對(duì)應(yīng)顏色)
if s == 0 :
mask = None
masks[color] = mask