最近在做乙個東西,需要使用字元的分割,如下圖所示
可以看到這裡的每個字元互相之間是沒有粘連的,那麼如何把他們分割開來呢?乙個很簡單的想法就是通過連通域進行分割,每個字元是乙個連通域,不同字元之間是不同的連通域,因為這裡沒有粘連,所以處理起來是非常方便的。
那麼重點就來了,如何實現連通域的分割呢?
原來的打算是通過掃瞄影象,通過尋找不同字元的邊緣定位不同的字元,但是我發現對於「o」這種字元,由於他有外邊緣和內邊緣之分,在實現的過程中還要不斷的判斷,非常麻煩,糾結了很久最後沒有想出簡單的方法規避這個問題,最終也沒有動手去實現。
這裡介紹一種簡單易於實現的方法實現連通域分割,對於我這裡的這幅影象是二值影象,我可以通過找到乙個未訪問過的前景畫素點以後,就不斷的遍歷與之相鄰的且未經遍歷的前景畫素點,直到無法找到這樣的畫素點,則乙個連通域遍歷結束。
下面的演算法的流程:
1、掃瞄影象,直到當前畫素為前景畫素且未被訪問過,將該畫素點入棧cd。
(1)出棧,把當前畫素中的鄰域的未被訪問的前景畫素點壓入棧;
(2)重複(1)中操作,直到棧空,至此找到乙個連通域;
2、重複1中的操作,直到遍歷完所有影象。
這種方法對影象就進行了一次遍歷就可以找到所有的連通域,速度快且原理簡單易於實現。下面給出實現的**:
void getconnecteddomain(mat& src, vector& boundingbox)//boundingbox為最終結果,存放各個連通域的包圍盒}}
rect rect(point2f(mincol, minrow), point2f(maxcol + 1, maxrow + 1));
boundingbox.push_back(rect);
}} }
}
最終結果如下圖所示:
與1連通的點的個數
這道題是並查集的典型應用 兩個點聯通即可以表示兩個點在同乙個集合中 我們需要對不同的集合進行維護 使用並查集是比較優化的方式 需要注意的是題目中儲存每個節點的數量的s陣列,只對根節點的s是有效的 include using namespace std const int n 1e4 10 int n...
8連通 4連通的洪氾填充以及邊界填
運用八連通邊界填充演算法 進行多邊形的填充 1 首先通過顏色混合的方式形成乙個圖形包中函式的對多邊形的填充,如下圖所示 注 主要 如下 實現多邊形的簡單填充 include include void init void void linesegment void int main int argc,...
八連通填充演算法
最近做了個圈地的遊戲,根據玩家行走路徑和自己的領地區域圈出自己的新領地。自己在演算法這方面比較薄弱,這次也趁機修煉了一波,寫下自己的心得和感悟在這裡。可能寫的不好,希望看到的僅供參考,不足之處和錯誤之處多謝指正。八連通演算法其實就是給定乙個種子點,通過迴圈查詢以自己為中心的3 3其他八個點,滿足要求...