Part11. 圖像的連通域以及連通域分析
在該系列第六篇文章中,曾經(jīng)介紹過連通的概念,下面再來回顧一下。
連通:若 S 是圖像中的一個像素子集,對于任意的 。如果存在一條由 S 中像素組成的從 p 到 q 的通路,則稱 p 在像素集 S 中與 q 連通。
連通域是指具有相同屬性的連通集合。例如,在一個二值圖像中,具有相同像素值的區(qū)域構(gòu)成一個連通域。
所以,連通和連通域是兩個不同的概念,連通域是連通的子集。連通域具有以下特性:
一個連通域中的所有像素都具有相同的性質(zhì)。
一個連通域中的任意兩個像素都可以通過連續(xù)的路徑連接起來。
一個連通域可以是單連通的,也可以是多連通的。
連通域分析是指在圖像中查找和標記連通域的算法。這是一種常用的圖像處理技術(shù),可以用于目標檢測、圖像分割和形狀識別等等。本文是基于二值圖像進行連通域的分析。
Part22. 連通域分析的算法
連通域分析的算法可以分為以下幾類:
基于標記的算法:該類算法首先將每個像素分配一個唯一的標記,然后使用某種策略將具有相同標記的像素連接起來。基于標記的算法包括兩遍掃描法、種子填充法和快速連通域查找法。
基于鄰域查找的算法:該類算法從圖像中的一個起始像素開始,逐個檢查其鄰域像素,如果鄰域像素具有相同像素值,則將其加入到當前連通域中。基于鄰域查找的算法包括深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)。
基于分割的算法:該類算法將圖像分割成多個區(qū)域,每個區(qū)域都具有相同的像素值。基于分割的算法包括圖論方法和區(qū)域生長法。
其中,基于標記的算法是比較常用的連通域分析的算法。
12.1 兩遍掃描法
兩遍掃描算法的步驟如下
第一遍掃描
從左到右,從上到下遍歷圖像。
將每個有效像素賦予一個唯一的標記。
第二遍掃描
再次從左到右,從上到下遍歷圖像。
檢查兩個相鄰像素是否具有相同的標記。
如果兩個相鄰像素具有相同的標記,則將它們連接起來。
two-pass.gif
22.2 種子填充法
種子填充算法的步驟如下:
初始化:將圖像中的所有像素標記為未訪問。
選擇一個起始像素作為種子。
將種子像素標記為已訪問。
檢查種子像素的鄰域像素。
如果鄰域像素具有相同的像素值,則將其標記為已訪問。
如果鄰域像素具有不同的像素值,則忽略。
重復步驟 4,直到圖像中的所有像素都被標記為已訪問或直到?jīng)]有未訪問的鄰域像素為止。
seed-filling.gif
Part33. OpenCV 自帶的連通域函數(shù)
OpenCV 提供了兩個函數(shù):connectedComponents()、connectedComponentsWithStats() 在二值圖像中查找連通域。
下面的例子,在圖中找到連通域并標記不同的顏色。
#include
#include
評論