傳統的機器視覺(jué)通常包括兩個(gè)步驟——預處理和物體檢測。而溝通二者的橋梁則是圖像分割(Image Segmentation)[1]。圖像分割通過(guò)簡(jiǎn)化或改變圖像的表示形式,使得圖像更易于分析。
舉個(gè)例子,食品加工廠(chǎng)新進(jìn)了一批肉雞,想通過(guò)視覺(jué)檢測其美味程度。機器在預處理優(yōu)化完圖像之后,要先把圖像中的雞肉和背景分開(kāi),并對感興趣的區域單獨進(jìn)行分析,才能做出快速準確的判斷。
食品加工廠(chǎng)的視覺(jué)處理
然而,圖像分割對愚蠢的AI來(lái)說(shuō)并不容易。聰明的人類(lèi)一眼就能看出下圖中哪些東西能吃、哪些不能吃。但計算機要把這些東西分開(kāi)卻得花費一番功夫。
原圖
圖像分割結果
最簡(jiǎn)單的圖像分割方法是二值化(Binarization)。二值圖像每個(gè)像素只有兩種取值:要么純黑,要么純白。
彩色圖、灰度圖、二值圖對比
由于二值圖像數據足夠簡(jiǎn)單,許多視覺(jué)算法都依賴(lài)二值圖像。通過(guò)二值圖像,能更好地分析物體的形狀和輪廓。二值圖像也常常用作原始圖像的掩模(又稱(chēng)遮罩、蒙版,Mask):它就像一張部分鏤空的紙,把我們不感興趣的區域遮掉。進(jìn)行二值化有多種方式,其中最常用的就是采用閾值法(Thresholding)進(jìn)行二值化。
在計算機視覺(jué)里,一般用矩陣來(lái)表示圖像。也就是說(shuō),無(wú)論你的圖片看上去多么好吃,對計算機來(lái)說(shuō)都不過(guò)是個(gè)矩陣而已。
在這個(gè)矩陣里,每一個(gè)像素就是矩陣中的一個(gè)元素。在三通道的彩色圖像中,這個(gè)元素是由三個(gè)數字組成的元組。
彩色三通道圖像
而對于單通道的灰度圖像來(lái)說(shuō),這個(gè)元素就是一個(gè)數字。這個(gè)數字代表了圖像在這個(gè)點(diǎn)的亮度,數字越大像素點(diǎn)也就越亮,在常見(jiàn)的八位單通道色彩空間中,0代表全黑,255代表全白。

單通道的灰度圖
閾值法是指選取一個(gè)數字,大于它就視為全白,小于它就視為全黑。就像教室里的燈管開(kāi)關(guān),我們輕輕地推動(dòng)它,如果突然間超過(guò)了某個(gè)閾值,燈就啪的一聲亮了。
根據閾值選取方式的不同,可以分為全局閾值和局部閾值。
全局閾值
Global Method
全局閾值,指的是對整個(gè)圖像中的每一個(gè)像素都選用相同的閾值。我們可以在Photoshop的圖像-調整-閾值里體驗這一操作:

Photoshop里的閾值
可以看到閾值色階從1到255的移動(dòng)過(guò)程中,圖像變黑的區域越來(lái)越多。當閾值數字在某個(gè)特定范圍內的時(shí)候,紅米腸的輪廓清晰可辨。

正確的二值化使紅米腸輪廓清晰可辨
在生產(chǎn)線(xiàn)環(huán)境下,光照是已知的,常常會(huì )設定一個(gè)固定的數字來(lái)作為全局閾值。但是在室外或者機器人比賽中,光照條件往往更加復雜*。

RoboMaster賽場(chǎng)的絢麗燈光
*此圖采用了夸張手法,RoboMaster是個(gè)很正規的比賽,絕對不會(huì )在比賽的時(shí)候這么難為大家的。
同樣是奧利奧冰激凌,在白天和晚上,攝像頭看到的畫(huà)面可能不太一樣,常數閾值無(wú)法同時(shí)適應這兩種情況。

明暗不同的畫(huà)面
對于畫(huà)面比較暗的晚上,我們需要一個(gè)比較低的閾值,比如說(shuō)設定閾值為50,它在晚上能很清楚地把黑白兩種顏色分開(kāi),但是到了白天就是一片白(左邊);如果我們把閾值設置得比較高,比如說(shuō)172,在白天能順利分割,但在晚上就是一片黑(右邊)。我們需要能夠適應復雜環(huán)境的算法。

左邊閾值=50,右邊閾值=172
其實(shí),稍作分析我們可以發(fā)現,這張圖像中的顏色差異還是比較明顯的,只有深淺兩種顏色。因此,無(wú)論是在白天還是黑夜,它的色階直方圖都應該是兩個(gè)明顯的波峰,分別代表深色和淺色的區域。只是色階直方圖在白天會(huì )整體向右偏移,而在夜晚整體向左偏移。

圖像的色階直方圖
如果選擇兩個(gè)波峰之間的波谷作為閾值,就能輕松地把這兩類(lèi)像素分開(kāi)。但是圖像的直方圖往往是不連續的,有非常多尖峰和抖動(dòng),要找到準確的極值點(diǎn)十分困難。
日本工程師大津展之為這個(gè)波谷找到了一個(gè)合適的數學(xué)表達,并于1979年發(fā)表[2]。這個(gè)二值化方法稱(chēng)為大津算法(Otsu’s method)。大津算法類(lèi)似于一維Fisher判別分析的離散化模擬。通過(guò)窮舉法找到一個(gè)閾值數字,把這些像素切成兩類(lèi),使得這兩類(lèi)像素的亮度的類(lèi)內方差最小。類(lèi)內方差指的是兩類(lèi)像素的方差的加權和,這里權指的是這類(lèi)像素點(diǎn)數量占整個(gè)圖像像素點(diǎn)數量的比值。
也許你的畫(huà)面不會(huì )只有兩坨差異較大的顏色,比如這款雪糕的就有三個(gè)尖峰。

三色雪糕(取雪糕部位的直方圖)
這時(shí)候,只需對大津算法稍加擴展也可以完成。對大津算法的多級推廣成為多大津算法(multi Otsu method)[3]。
局部閾值*
Local Method
*又稱(chēng)自適應閾值,Adaptive Thresholding
比賽中常常會(huì )有聚光燈照在一個(gè)特定區域,產(chǎn)生局部受光、局部不受光的畫(huà)面。

局部受光的圖像
對于局部受光的圖像進(jìn)行全局閾值,可能會(huì )出現“無(wú)論設置什么閾值參數,都無(wú)法滿(mǎn)足全圖要求”的尷尬。比如上面這幅圖像,直接進(jìn)行全局閾值時(shí),左上半邊的壽司全都顯露出來(lái)時(shí),右下半邊還是一片黑色。

局部受光圖像的全局閾值處理
這個(gè)時(shí)候我們就要用到局部閾值來(lái)處理了。其實(shí),人的眼睛也是自帶了這一步操作的。我們判定一個(gè)東西顏色深淺,往往會(huì )受到物體周邊的顏色影響,這也就是為什么黑人的牙齒看上去更白。
局部閾值法假定圖像在一定區域內受到的光照比較接近。它用一個(gè)滑窗掃描圖像,并取滑窗中心點(diǎn)亮度與滑窗內其他區域(稱(chēng)為鄰域, neighborhood area)的亮度進(jìn)行比較。如果中心點(diǎn)亮度高于鄰域亮度*,則將中心點(diǎn)標記為白色,否則標記為黑色。

局部閾值的滑窗
*這里提到的是局部閾值的基本方法,對于實(shí)際使用中常見(jiàn)的其他局部閾值方法,請參閱Chow-Kaneko自適應閾值法 [4]。
局部閾值的應用非常廣泛,特別是對白紙黑字的處理非常有效。光學(xué)字符識別(OCR)和二維碼掃描的算法中,很多都用了局部閾值操作。
比如下面這張二維碼就是一張典型的局部受光圖像:

掃掃看,局部受光的二維碼
如果對這張圖片采用全局閾值(例如下圖采用大津算法進(jìn)行分割),是無(wú)論如何都無(wú)法正確分割的。

全局方法不能處理局部受光圖像
而采用局部閾值方法就能很好地分割圖像。從圖片里可以明顯觀(guān)察到,局部閾值方法對于一大片干凈區域的細節比較敏感,所以紙面上多出了很多我們原本注意不到的斑點(diǎn)。

局部方法分割二維碼
◆◆◆
實(shí)際運用中,我們要根據需求選擇不同的二值化方法,沒(méi)有哪個(gè)方法是絕對完美的。
例如,在識別敵方機器人時(shí),由于裝甲片燈條是自發(fā)光物體,受環(huán)境光影響較小,為了提高程序運行效率,我們采用固定數字作為全局閾值:

基地自動(dòng)反擊
在能量機關(guān)的識別中,由于能量機關(guān)只有黑白兩種顏色,我們采用了大津算法及其多種變體:

大能量機關(guān)各區域的二值圖
而在空中機器人讀取基地區二維碼的時(shí)候又用到了局部閾值方法:

空中機器人識別基地
今天所講的內容只是圖像分割的冰山一角,作為視覺(jué)領(lǐng)域最古老的問(wèn)題之一,時(shí)至今日仍有非常多圖像分割的新算法被提出。
除了基于閾值的圖像分割方法外,常用的分割方法還可以基于邊緣(如Yanowitz-Bruckstein自適應閾值方法[5])、區域(如區域生長(cháng)算法[6])等,它們在衛星圖像處理、交通控制系統、工業(yè)生產(chǎn)監控、醫療影像等領(lǐng)域發(fā)揮著(zhù)巨大的作用。

腦部組織圖像分割
策劃 | 視覺(jué)組
圖文 | 宣傳組
本文所述閾值方法的OpenCV實(shí)現,請訪(fǎng)問(wèn):
https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html
聯(lián)系客服