連通域分析其實是一個路徑搜尋問題,搜尋方式就看聯通的規則(4聯通:上下左右算是聯通,8聯通:上下左右還有四個對角)
01矩陣背景是0,黑色的,有色區域是1,白色的,從圖像的左上角(最外圍的邊要去掉)進行周遊,将找到的第一個值為1的像素點作為起點,對他進行連通域搜尋,将搜尋到的整個連通域内的像素點标為2(為了避免與本來的顔色1沖突)
繼續搜尋像素值為1的點(之前聯通域分析過的已經将像素值改為大于1的值,是以像素值為1的就是還沒有分析過的),直到整個圖像周遊完成
周遊方法:
找到起點後初始化一個棧,存放連通域的點坐标(pair),将起點的橫縱坐标壓入棧中,連通域的标記值自增(第一個連通域的标記值為2,從2開始,第二個連通域的标記值為3,以此類推)
當棧不為空時,從棧頂取點,讀出他的橫縱坐标,在Label圖中,根據橫縱坐标對連通域進行對應标記值的指派,然後将該點出棧,同時按照聯通規則,根據坐标找到它的相鄰像素點,看相鄰像素點的值是否為1,如果是1,則是連通域,将這個點入棧(判斷時記得要加上邊界條件,防止點下标溢出,我的代碼偷懶了沒有加,正常要加上 0<=Row<BinaryImg.rows&&0<=Col<BinaryImg.cols)
代碼