OpenCV_連通區域分析(Connected Component Analysis/Labeling)
【摘要】
本文主要介紹在CVPR和圖像處理領域中較爲常用的一種圖像區域(Blob)提取的方法——連通性分析法(連通區域標記法)。文中介紹了兩種常見的連通性分析的算法:1)Two-pass;2)Seed-Filling種子填充,並給出了兩個算法的基於OpenCV的C++實現代碼。
一、連通區域分析
連通區域(Connected Component)一般是指圖像中具有相同像素值且位置相鄰的前景像素點組成的圖像區域(Region,Blob)。連通區域分析(Connected Component Analysis,Connected Component Labeling)是指將圖像中的各個連通區域找出並標記。
連通區域分析是一種在CVPR和圖像分析處理的衆多應用領域中較爲常用和基本的方法。例如:OCR識別中字符分割提取(車牌識別、文本識別、字幕識別等)、視覺跟蹤中的運動前景目標分割與提取(行人入侵檢測、遺留物體檢測、基於視覺的車輛檢測與跟蹤等)、醫學圖像處理(感興趣目標區域提取)、等等。也就是說,在需要將前景目標提取出來以便後續進行處理的應用場景中都能夠用到連通區域分析方法,通常連通區域分析處理的對象是一張二值化後的圖像。
二、連通區域分析的算法
從連通區域的定義可以知道,一個連通區域是由具有相同像素值的相鄰像素組成像素集合,因此,我們就可以通過這兩個條件在圖像中尋找連通區域,對於找到的每個連通區域,我們賦予其一個唯一的標識(Label),以區別其他連通區域。
連通區域分析有基本的算法,也有其改進算法,本文介紹其中的兩種常見算法:
1)Two-Pass法;2)Seed-Filling種子填充法;
Note:
a、這裏的掃描指的是按行或按列訪問以便圖像的所有像素,本文算法採用的是按行掃描方式;
b、圖像記爲B,爲二值圖像:前景像素(pixel value = 1),背景像素(pixel value = 0)
c、label從2開始計數;
d、像素相鄰關係:4-領域、8-領域,本文算法採用4-鄰域;
4—領域圖例 8—領域圖例
1)Two-Pass(兩遍掃描法)
兩遍掃描法,正如其名,指的就是通過掃描兩遍圖像,就可以將圖像中存在的所有連通區域找出並標記。思路:第一遍掃描時賦予每個像素位置一個label,掃描過程中同一個連通區域內的像素集合中可能會被賦予一個或多個不同label,因此需要將這些屬於同一個連通區域但具有不同值的label合併,也就是記錄它們之間的相等關係;第二遍掃描就是將具有相等關係的equal_labels所標記的像素歸爲一個連通區域並賦予一個相同的label(通常這個label是equal_labels中的最小值)。
下面給出Two-Pass算法的簡單步驟:
(1)第一次掃描:
訪問當前像素B(x,y),如果B(x,y) == 1:
a、如果B(x,y)的領域中像素值都爲0,則賦予B(x,y)一個新的label:
label += 1, B(x,y) = label;
b、如果B(x,y)的領域中有像素值 > 1的像素Neighbors:
1)將Neighbors中的最小值賦予給B(x,y):
B(x,y) = min{Neighbors}
2)記錄Neighbors中各個值(label)之間的相等關係,即這些值(label)同屬同一個連通區域;
labelSet[i] = { label_m, .., label_n },labelSet[i]中的所有label都屬於同一個連通區域(注:這裏可以有多種實現方式,只要能夠記錄這些具有相等關係的label之間的關係即可)
(2)第二次掃描:
訪問當前像素B(x,y),如果B(x,y) > 1:
a、找到與label = B(x,y)同屬相等關係的一個最小label值,賦予給B(x,y);
完成掃描後,圖像中具有相同label值的像素就組成了同一個連通區域。
下面這張圖動態地演示了Two-pass算法:
2)Seed Filling(種子填充法)
種子填充方法來源於計算機圖形學,常用於對某個圖形進行填充。思路:選取一個前景像素點作爲種子,然後根據連通區域的兩個基本條件(像素值相同、位置相鄰)將與種子相鄰的前景像素合併到同一個像素集合中,最後得到的該像素集合則爲一個連通區域。
下面給出基於種子填充法的連通區域分析方法:
(1)掃描圖像,直到當前像素點B(x,y) == 1:
a、將B(x,y)作爲種子(像素位置),並賦予其一個label,然後將該種子相鄰的所有前景像素都壓入棧中;
b、彈出棧頂像素,賦予其相同的label,然後再將與該棧頂像素相鄰的所有前景像素都壓入棧中;
c、重複b步驟,直到棧爲空;
此時,便找到了圖像B中的一個連通區域,該區域內的像素值被標記爲label;
(2)重複第(1)步,直到掃描結束;
掃描結束後,就可以得到圖像B中所有的連通區域;
下面這張圖動態地演示了Seed-Filling算法:
三、實驗演示
1)前景二值圖像
2)連通區域分析方法標記後得到的label圖像
Two-pass算法:
Seed-filling算法:
注:爲了顯示方便,將像素值乘以了一個整數進行放大。
3)color後的label圖像
Two-pass算法:
Seed-filling算法:
注:顏色是隨機生成的。
四、代碼
1)Two-pass算法的一種實現
說明:
基於OpenCV和C++實現,領域:4-領域。實現與算法描述稍有差別(具體爲記錄具有相等關係的label方法實現上)。
2)Seed-Filling種子填充方法
說明:
基於OpenCV和C++實現;領域:4-領域。
3)顏色標記(用於顯示)
4)測試程序
Reference
[1] http://en.wikipedia.org/wiki/Connected-component_labeling
[2] http://homepages.inf.ed.ac.uk/rbf/HIPR2/label.htm
[3] http://www.codeproject.com/Articles/336915/Connected-Component-Labeling-Algorithm
注: 原文鏈接http://blog.csdn.net/icvpr/article/details/10259577