早上用百度搜了一下“顏色識(shí)別”皮壁,多少有了一點(diǎn)大致的概念撩荣,還是老辦法铣揉,動(dòng)手做,多實(shí)驗(yàn)餐曹,往前走逛拱,還請(qǐng)各位老師多多指點(diǎn)。
OpenCV(百度百科)
是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù)台猴,可以運(yùn)行在Linux朽合、Windows俱两、Android和Mac OS操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成曹步,同時(shí)提供了Python宪彩、Ruby、MATLAB等語(yǔ)言的接口讲婚,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法尿孔。OpenCV用C++語(yǔ)言編寫,它的主要接口也是C++語(yǔ)言筹麸,但是依然保留了大量的C語(yǔ)言接口活合。該庫(kù)也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口物赶。這些語(yǔ)言的API接口函數(shù)可以通過在線文檔獲得白指。如今也提供對(duì)于C#、Ch酵紫、Ruby,GO的支持告嘲。
OpenCV于1999年由Intel建立,如今由Willow Garage提供支持憨闰。OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù)状蜗,可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上鹉动。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成轧坎,同時(shí)提供了Python、Ruby泽示、MATLAB等語(yǔ)言的接口缸血,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。OpenCV 擁有包括 500 多個(gè)C函數(shù)的跨平臺(tái)的中械筛、高層 API捎泻。它不依賴于其它的外部庫(kù)——盡管也可以使用某些外部庫(kù)。OpenCV 為Intel? Integrated Performance Primitives(IPP)提供了透明接口埋哟。這意味著如果有為特定處理器優(yōu)化的 IPP 庫(kù)笆豁,OpenCV 將在運(yùn)行時(shí)自動(dòng)加載這些庫(kù)。 (注:OpenCV 2.0版的代碼已顯著優(yōu)化赤赊,無(wú)需IPP來(lái)提升性能闯狱,故2.0版不再提供IPP接口)
OpenCV概述
其全稱是Open source Computer Vision Library,開放源代碼計(jì)算機(jī)視覺庫(kù)抛计。也就是說(shuō)哄孤,它是一套關(guān)于計(jì)算機(jī)視覺的開放源代碼的API函數(shù)庫(kù)。這也就意味著:
(1)不管是科學(xué)研究吹截,還是商業(yè)應(yīng)用瘦陈,都可以利用它來(lái)作開發(fā);
(2)所有API函數(shù)的源代碼都是公開的凝危,你可以看到其內(nèi)部實(shí)現(xiàn)的程序步驟;
(3)你可以修改OpenCV的源代碼晨逝,編譯生成你需要的特定API函數(shù)蛾默。但是,作為一個(gè)庫(kù)咏花,它所提供的趴生,僅僅是一些常用的,經(jīng)典的昏翰,大眾化的算法的API苍匆。
一個(gè)典型的計(jì)算機(jī)視覺算法,應(yīng)該包含以下一些步驟:
(1)數(shù)據(jù)獲扰锞铡(對(duì)OpenCV來(lái)說(shuō)浸踩,就是圖片);
(2)預(yù)處理;
(3)特征提取;
(4)特征選擇;
(5)分類器設(shè)計(jì)與訓(xùn)練;
(6)分類判別;
而OpenCV對(duì)這六個(gè)部分统求,分別(記住這個(gè)詞)提供了API检碗。
基于OpenCV的顏色識(shí)別
彩色模型
數(shù)字圖像處理中常用的采用模型是RGB(紅,綠码邻,藍(lán))模型和HSV(色調(diào)折剃,飽和度,亮度)像屋,RGB廣泛應(yīng)用于彩色監(jiān)視器和彩色視頻攝像機(jī)怕犁,我們平時(shí)的圖片一般都是RGB模型。而HSV模型更符合人描述和解釋顏色的方式己莺,HSV的彩色描述對(duì)人來(lái)說(shuō)是自然且非常直觀的奏甫。
HSV模型
HSV模型中顏色的參數(shù)分別是:色調(diào)(H:hue),飽和度(S:saturation)凌受,亮度(V:value)阵子。由A. R. Smith在1978年創(chuàng)建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。
色調(diào)(H:hue):用角度度量胜蛉,取值范圍為0°~360°挠进,從紅色開始按逆時(shí)針方向計(jì)算,紅色為0°誊册,綠色為120°,藍(lán)色為240°奈梳。它們的補(bǔ)色是:黃色為60°,青色為180°,品紅為300°解虱;
飽和度(S:saturation):取值范圍為0.0~1.0,值越大漆撞,顏色越飽和殴泰。
亮度(V:value):取值范圍為0(黑色)~255(白色)于宙。
RGB轉(zhuǎn)成HSV
設(shè) (r, g, b) 分別是一個(gè)顏色的紅、綠和藍(lán)坐標(biāo)悍汛,它們的值是在 0 到 1 之間的實(shí)數(shù)捞魁。設(shè) max 等價(jià)于 r, g 和 b 中的最大者。設(shè) min 等于這些值中的最小者离咐。要找到在 HSV 空間中的 (h, s, v) 值谱俭,這里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是飽和度和亮度宵蛀。 OpenCV下有個(gè)函數(shù)可以直接將RGB模型轉(zhuǎn)換為HSV模型昆著,OpenCV中H∈ [0, 180), S ∈ [0, 255]术陶, V ∈ [0, 255]凑懂。我們知道H分量基本能表示一個(gè)物體的顏色,但是S和V的取值也要在一定范圍內(nèi)梧宫,因?yàn)镾代表的是H所表示的那個(gè)顏色和白色的混合程度接谨,也就說(shuō)S越小,顏色越發(fā)白塘匣,也就是越淺脓豪;V代表的是H所表示的那個(gè)顏色和黑色的混合程度,也就說(shuō)V越小忌卤,顏色越發(fā)黑扫夜。大致識(shí)別藍(lán)色的取值是 H在100到140,S和V都在90到255之間埠巨。
OpenCV顏色識(shí)別思路
1历谍、創(chuàng)建滑動(dòng)條:用來(lái)調(diào)節(jié)閾值,識(shí)別出不同顏色辣垒。
2望侈、顏色空間轉(zhuǎn)換:將RGB轉(zhuǎn)換為HSV模型,于是可以通過不同顏色的HSV的閾值不同來(lái)識(shí)別出該種顏色勋桶。Opencv中使用cvtcolor()可實(shí)現(xiàn)脱衙。一般彩色圖像都是RGB顏色空間,而HSV色彩空間模型是一種在人們生活中甚至更常用的顏色系統(tǒng)例驹,在電視遙控器上捐韩、在畫畫的調(diào)色板中、在看電視時(shí)調(diào)整亮度時(shí)都很常見鹃锈,因?yàn)樗先藗兠枋鲱伾姆绞健鞘裁搭伾缧病㈩伾卸嗌睢㈩伾卸嗔潦赫P枰⒁獾氖墙稣趏pencv中垢油,H、S圆丹、V值范圍分別是[0,180)滩愁,[0,255),[0,255)辫封,而非實(shí)際模型[0,360]硝枉,[0,1],[0,1]倦微。
3妻味、直方圖均衡化:由于光線的影響,手機(jī)讀取的每一幀圖片可能存在太亮或者太暗的問題璃诀,直方圖均衡化可以將每個(gè)區(qū)間的像素點(diǎn)分布更均衡弧可,使圖像的層次感更強(qiáng)。Opencv中可以用equalizeHist()函數(shù)實(shí)現(xiàn)劣欢。直方圖均衡化就是將原始的直方圖拉伸棕诵,使之均勻分布在全部灰度范圍內(nèi),從而增強(qiáng)圖像的對(duì)比度凿将。直方圖均衡化的中心思想是把原始圖像的的灰度直方圖從比較集中的某個(gè)區(qū)域變成在全部灰度范圍內(nèi)的均勻分布
4校套、二值化:將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,這樣將使整個(gè)圖像呈現(xiàn)出明顯的黑白效果牧抵。對(duì)灰度圖像進(jìn)行二值化處理笛匙,可以突出一定范圍的信息。它是將像素點(diǎn)顏色值在所設(shè)定區(qū)間內(nèi)(如a-b)的設(shè)定為255犀变,在范圍外的設(shè)為0.但是對(duì)于ab和的不同取值妹孙,二值化的效果會(huì)有很大的不同。
5获枝、開操作:用來(lái)去除圖像中的噪點(diǎn)蠢正,即干擾信息。Opencv中可以使用getStructuringElement()函數(shù)來(lái)進(jìn)行相應(yīng)設(shè)置省店。開操作是基于圖像的膨脹和腐蝕而言的嚣崭,膨脹就是對(duì)圖像高亮部分進(jìn)行“領(lǐng)域擴(kuò)張”,效果圖擁有比原圖更大的高亮區(qū)域懦傍;腐蝕是原圖中的高亮區(qū)域被蠶食雹舀,效果圖擁有比原圖更小的高亮區(qū)域。而開操作是對(duì)圖像先腐蝕再膨脹粗俱,用來(lái)消除小物體说榆。其數(shù)學(xué)原理是定義一個(gè)卷積核B,將其與目標(biāo)圖像進(jìn)行卷積,就可以達(dá)到相應(yīng)效果签财。不同形狀和大小的核會(huì)出現(xiàn)不同的效果稍味。
6、閉操作 :進(jìn)行開操作之后可能會(huì)有一些斷開的區(qū)域荠卷,閉操作可以將這些未聯(lián)通的區(qū)域進(jìn)行封閉,使圖像更完整烛愧。閉操作是開操作的相反油宜,先膨脹再腐蝕,用于排除小型黑洞怜姿,其原理與開操作相同慎冤。
手頭正好有個(gè)魔方,有五種顏色沧卢,就拿它當(dāng)識(shí)別顏色的實(shí)驗(yàn)道具了蚁堤。
打開MaixPy IDE,選擇工具——機(jī)器視覺——闋值編輯器
打開源圖像位置但狭,選擇幀緩沖區(qū)
調(diào)整LAB闋值披诗,主要是在二進(jìn)制圖像欄,白色像素是被跟蹤的像素
徹底搞懂Lab 顏色空間
名稱
在開始之前立磁,先明確一下Lab顏色空間(Lab color space)的名字:
Lab的全稱是CIELAB呈队,有時(shí)候也寫成CIE Lab*
這里的CIE代表International Commission on Illumination(國(guó)際照明委員會(huì)),它是一個(gè)關(guān)于光照唱歧、顏色等的國(guó)際權(quán)威組織宪摧。
通道
Lab是由一個(gè)亮度通道(channel)和兩個(gè)顏色通道組成的。在Lab顏色空間中颅崩,每個(gè)顏色用L几于、a、b三個(gè)數(shù)字表示沿后,各個(gè)分量的含義是這樣的:
L*代表亮度
a*代表從綠色到紅色的分量
b*代表從藍(lán)色到黃色的分量
Perceptual uniform
Lab是基于人對(duì)顏色的感覺來(lái)設(shè)計(jì)的沿彭,更具體地說(shuō),它是感知均勻(perceptual uniform)的得运。Perceptual uniform的意思是膝蜈,如果數(shù)字(即前面提到的L、a熔掺、b這三個(gè)數(shù))變化的幅度一樣饱搏,那么它給人帶來(lái)視覺上的變化幅度也差不多。Lab相較于RGB與CMYK等顏色空間更符合人類視覺置逻,也更容易調(diào)整:想要調(diào)節(jié)亮度(不考慮Helmholtz–Kohlrausch effect推沸,見下注)就調(diào)節(jié)L通道,想要調(diào)節(jié)只色彩平衡就分別調(diào)a和b。
注:Helmholtz–Kohlrausch effect是人眼的一種錯(cuò)覺——當(dāng)色彩飽和度高時(shí)鬓催,顏色會(huì)看起來(lái)更亮肺素。
設(shè)備無(wú)關(guān)
Lab有個(gè)很好的特性——設(shè)備無(wú)關(guān)(device-independent)。也就是說(shuō)宇驾,在給定了顏色空間白點(diǎn)(white point)(下圖中表示了一種顏色空間的白點(diǎn))之后倍靡,這個(gè)顏色空間就能明確地確定各個(gè)顏色是如何被創(chuàng)建和顯示的,與使用的顯示介質(zhì)沒有關(guān)系课舍。 需要注意的是塌西,Lab定義的是相對(duì)于白點(diǎn)的顏色,只有定義完白點(diǎn)是什么顏色(比如定義為CIE standard illuminant D50)筝尾,我們才能知道其他的顏色捡需。
數(shù)值范圍
理論上說(shuō),L筹淫、a站辉、b*都是實(shí)數(shù),不過實(shí)際一般限定在一個(gè)整數(shù)范圍內(nèi):
L越大损姜,亮度越高饰剥。L為0時(shí)代表黑色,為100時(shí)代表白色薛匪。
a和b為0時(shí)都代表灰色捐川。
a*從負(fù)數(shù)變到正數(shù),對(duì)應(yīng)顏色從綠色變到紅色逸尖。
b*從負(fù)數(shù)變到正數(shù)古沥,對(duì)應(yīng)顏色從藍(lán)色變到黃色。
我們?cè)趯?shí)際應(yīng)用中常常將顏色通道的范圍-100~+100或-128127之間娇跟。
可視化
可以看到岩齿,Lab*一共有三個(gè)分量,因此可以在三維空間中呈現(xiàn)苞俘。 在二維空間中盹沈,常用chromaticity diagram來(lái)可視化它,也就是固定亮度L吃谣,看a和b的變化乞封。注意,這些可視化不是精確的岗憋,只是能幫助人理解肃晚。
LAB顏色模型
是根據(jù)Commission International Eclairage(CIE)在1931年所制定的一種測(cè)定顏色的國(guó)際標(biāo)準(zhǔn)建立的。于1976年被改進(jìn)仔戈,并且命名的一種色彩模式关串。Lab顏色模型彌補(bǔ)了RGB和CMYK兩種色彩模式的不足拧廊。它是一種設(shè)備無(wú)關(guān)的顏色模型,也是一種基于生理特征的顏色模型晋修。 Lab顏色模型由三個(gè)要素組成吧碾,一個(gè)要素是亮度(L),a 和b是兩個(gè)顏色通道墓卦。a包括的顏色是從深綠色(低亮度值)到灰色(中亮度值)再到亮粉紅色(高亮度值)倦春;b是從亮藍(lán)色(低亮度值)到灰色(中亮度值)再到黃色(高亮度值)。因此落剪,這種顏色混合后將產(chǎn)生具有明亮效果的色彩溅漾。
Lab模式既不依賴光線,也不依賴于顏料著榴,它是CIE組織確定的一個(gè)理論上包括了人眼可以看見的所有色彩的色彩模式。Lab模式彌補(bǔ)了RGB和CMYK兩種色彩模式的不足屁倔。同RGB顏色空間相比脑又,Lab是一種不常用的色彩空間。它是在1931年國(guó)際照明委員會(huì)(CIE)制定的顏色度量國(guó)際標(biāo)準(zhǔn)的基礎(chǔ)上建立起來(lái)的锐借。1976年问麸,經(jīng)修改后被正式命名為CIELab。它是一種設(shè)備無(wú)關(guān)的顏色系統(tǒng)钞翔,也是一種基于生理特征的顏色系統(tǒng)严卖。這也就意味著,它是用數(shù)字化的方法來(lái)描述人的視覺感應(yīng)布轿。Lab顏色空間中的L分量用于表示像素的亮度哮笆,取值范圍是[0,100],表示從純黑到純白;a表示從紅色到綠色的范圍汰扭,取值范圍是[127,-128]稠肘;b表示從黃色到藍(lán)色的范圍,取值范圍是[127,-128]萝毛。下圖所示為L(zhǎng)ab顏色空間的圖示项阴;
Lab顏色空間比計(jì)算機(jī)顯示器甚至比人類視覺的色域都要大??,表示為L(zhǎng)ab的位圖比RGB或CMYK位圖獲得同樣的精度需要要求更多的像素?cái)?shù)據(jù)笆包。Lab模式所定義的色彩最多环揽,且與光線及設(shè)備無(wú)關(guān)并且處理速度與RGB模式同樣快,比CMYK模式快很多庵佣。因此歉胶,可以放心大膽的在圖象編輯中使用Lab模 式。而且秧了,Lab模式在轉(zhuǎn)換成CMYK模式時(shí)色彩沒有丟失或被替換跨扮。因此,最佳避免色彩損失的方法是:應(yīng)用Lab模式編輯圖象,再轉(zhuǎn)換為CMYK模式打印 輸出衡创。
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之一:find red blob 動(dòng)態(tài)識(shí)別紅色塊
嘗試選擇最佳的顏色跟蹤闕值帝嗡,通過滑動(dòng)條來(lái)調(diào)節(jié)閾值,在二進(jìn)制圖像上紅色塊高亮(顯示白色)璃氢。
實(shí)測(cè)得出的LAB值為:55, 70, 42, 65, 52, 8
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之一:find red blob 動(dòng)態(tài)識(shí)別紅色塊
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序:find red blob 動(dòng)態(tài)識(shí)別紅色塊
import sensor
import image
import lcd
import time
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
red_threshold??= (55, 70, 42, 65, 52, 8)
while True:
? ? img=sensor.snapshot()
? ? blobs = img.find_blobs([green_threshold])
? ? if blobs:? ?
? ?? ???for b in blobs:
? ?? ?? ?? ?tmp=img.draw_rectangle(b[0:4])
? ?? ?? ?? ?tmp=img.draw_cross(b[5], b[6])
? ?? ?? ?? ?c=img.get_pixel(b[5], b[6])
? ? lcd.display(img)
做實(shí)驗(yàn)的魔方哟玷,有5種顏色
運(yùn)行后可看到框圈和+號(hào),已能準(zhǔn)確識(shí)別
陰天里窗戶前的實(shí)驗(yàn)場(chǎng)景
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之二:find green blob 動(dòng)態(tài)識(shí)別綠色塊
獲取綠色的LAB闕值為 0, 88, -42, -6, -9, 13
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之二:find green blob 動(dòng)態(tài)識(shí)別綠色塊
import sensor
import image
import lcd
import time
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
green_threshold??= (0, 88, -42, -6, -9, 13)
while True:
? ? img=sensor.snapshot()
? ? blobs = img.find_blobs([green_threshold])
? ? if blobs:? ?
? ?? ???for b in blobs:
? ?? ?? ?? ?tmp=img.draw_rectangle(b[0:4])
? ?? ?? ?? ?tmp=img.draw_cross(b[5], b[6])
? ?? ?? ?? ?c=img.get_pixel(b[5], b[6])
? ? lcd.display(img)
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之三:find orange blob 動(dòng)態(tài)識(shí)別橙色塊
獲取橙色的LAB闕值為 0, 80, 66, -20, 80, 50(與紅色有交集)
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之三:find orange blob 動(dòng)態(tài)識(shí)別橙色塊
import sensor
import image
import lcd
import time
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
orange_threshold??= (0, 80, 66, -20, 80, 50)
while True:
? ? img=sensor.snapshot()
? ? blobs = img.find_blobs([orange_threshold])
? ? if blobs:
? ?? ???for b in blobs:
? ?? ?? ?? ?tmp=img.draw_rectangle(b[0:4])
? ?? ?? ?? ?tmp=img.draw_cross(b[5], b[6])
? ?? ?? ?? ?c=img.get_pixel(b[5], b[6])
? ? lcd.display(img)
藍(lán)色的LAB闕值為 0, 80, -128, 35, -128, -18
黃色的LAB闕值為 88, 95, 0, -44, 93, 48
說(shuō)明:
本實(shí)驗(yàn)案例以一只普通魔方的色彩為準(zhǔn)(陰天光線)一也,得出的實(shí)驗(yàn)數(shù)據(jù)(LAB闕值)僅供參考
藍(lán)色 (0, 80, -128, 35, -128, -18)
紅色 (55, 70, 42, 65, 52, 8)
綠色 (0, 88, -42, -6, -9, 13)?
橙色 (0, 80, 66, -20, 80, 50)
黃色 (88, 95, 0, -44, 93, 48)
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之四:識(shí)別圖片上的紅心和花心部分
打開MaixPy IDE巢寡,選擇工具——機(jī)器視覺——闋值編輯器——源圖像位置——圖像文件(識(shí)別電腦上的圖片)
細(xì)心調(diào)整六個(gè)滑動(dòng)條的數(shù)值,參考結(jié)果見下圖二進(jìn)制圖像
識(shí)別紅心和花心的LAB闕值為 (0, 80, 90, 24, 75, -10)
#MicroPython動(dòng)手做(08)——零基礎(chǔ)學(xué)MaixPy之識(shí)別顏色
#實(shí)驗(yàn)程序之四:識(shí)別圖片上的紅心和花心部分
import sensor
import image
import lcd
import time
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
Five_threshold??= (0, 80, 90, 24, 75, -10)
while True:
? ? img=sensor.snapshot()
? ? blobs = img.find_blobs([Five_threshold])
? ? if blobs:
? ?? ???for b in blobs:
? ?? ?? ?? ?tmp=img.draw_rectangle(b[0:4])
? ?? ?? ?? ?tmp=img.draw_cross(b[5], b[6])
? ?? ?? ?? ?c=img.get_pixel(b[5], b[6])
? ? lcd.display(img)