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