寒江雪 邊界標誌演算法

2021-07-24 16:30:54 字數 1652 閱讀 3638

邊界標誌演算法對多邊形的每條邊進行掃瞄並對該畫素打上標誌。然後再利用掃瞄線掃瞄該多邊形,對於與多邊形相交的掃瞄線依從左到右的順序,逐個訪問該掃瞄線上的畫素。使用乙個布林值量inside來表示當前點是否在多邊形內。inside的初值為假,每當當前訪問的畫素是被打上邊標誌的點時,就把inside取反。對未標誌的畫素,inside不變。若訪問當前畫素時,inside為真,說明該畫素在多邊形內,則把該畫素置為填充色。

偽**如下:

void edgemark_fill(polydef,color) }

根據偽**在c++中實現:

void

cgraphicdlg::edgemarkfill(colorref

edgecolor, colorref

fillcolor, int

ymin, int

ymax, int

xmin, int

xmax)

if (inside)

drawrectange(j, i, 0, 0, fillcolor); }

}return

void(); }

效果圖如下:

可以發現明顯的「漏水」現象。

為什麼呢?我們將邊界放大觀察,請看大圖

可以看見圖中連續的標誌畫素點。如果其為偶數,就會導致inside在這一邊經歷兩次變換,如果在掃瞄到邊界前是填充,再變換兩次,還是填充,就導致了「漏水」現象。

為了解決這個問題

引入乙個布林值,flag,初始化為false

flag==true——即使當前點被標記為邊界色,也不能改變inside。如果當前點不是邊界,則改變flag為false

flag==false——當前點被標記為邊界色,則會改變inside。如果當前點不是邊界,則會改變inside,且flag變為true

改進後的**如下:

void

cgraphicdlg::edgemarkfill(colorref

edgecolor, colorref

fillcolor, int

ymin, int

ymax, int

xmin, int

xmax)

else

if (!res&&flag)

if (inside&&!res)

drawrectange(j, i, 0, 0, fillcolor); }

}return

void(); }

效果圖:

然而頂部密集的部分,還是漏了。至於這個問題,懇請高人指點啊。

最後放上兩張放大圖

寒江雪 區域填充演算法 掃瞄線

區域填充遞迴演算法已經領教過了。記憶體消耗大,時間效率低,經典的深搜思想。為了解決這個問題,於是有人提出了種子填充掃瞄線演算法。其實就是深搜不行,換寬搜 bfs 該演算法假設已知其中乙個畫素點,然後從這個畫素點出發,去尋找周圍可以著色的點。這個已知點,我們稱其為種子點。每一輪著色之後,記錄下著色的區...

邊界跟蹤演算法之內邊界跟蹤

如何獲取乙個目標的邊界資訊呢?首先要說的是,邊界跟蹤演算法是在區域已經分出 影象已經是二值圖或已經標註的圖 但邊界卻是未知的。如何獲取乙個目標的邊界資訊呢?我將自己學習經驗分享給大家。演算法描述如下 內邊界跟蹤 圖3 4鄰域查詢方向 圖4 8鄰域查詢方向 圖5描述圖5 假設綠色框為我們所要處理目標物...

寒江雪 凸多邊形矩形裁切演算法

最近都在準備著考試,沒有寫部落格,今天忙裡偷閒,寫點關於裁切演算法的文字。這次要幹的事情是給定乙個凸多邊形的點描述和矩形的點描述,按著矩形來對多邊形區域進行裁切。大概如下圖所示 藍色矩形是裁剪框,相當於photoshop裡的選區,紅色多邊形是影象,裁剪後在紅色以外的部分被剪掉,相交邊用橙色線條表示。...