c 實現掃瞄線種子填充演算法

2021-09-28 17:20:50 字數 1088 閱讀 4452

今天來介紹一種利用堆疊實現的填充演算法,這種演算法相比於直接使用遞迴實現的填充演算法(如內點表示的四連通種子填充演算法)來說,它需要的堆疊大小不需要那麼龐大,下面是在mfc中實現方法。

在任意不間斷區間(一條掃瞄線上的一組相鄰畫素)中,只取乙個種子畫素,填充當前掃瞄線上的該段區間,然後確定與這一段相鄰的上下兩條掃瞄線位於區域內的區段,並依次把他們儲存起來,反覆進行這個過程,直到所儲存的每個區段都填充完畢

初始化:堆疊置空,將種子點入棧。

出棧:若棧空則結束,否則棧頂元素(x,y)出棧,並以y值作為當前掃瞄線號。

填充並確定種子點所在區段:從種子(x,y)出發,沿當前掃瞄線向左、向右兩個方向逐個畫素填充,直到遇到邊界畫素為止。分別標記區段的左、右端點座標為xl和xr。

確定新的種子點:在區間[xl,xr]中檢查與當前掃瞄線y相鄰的上下兩條掃瞄線上的畫素。若存在非邊界、未填充的畫素,則把每一區間的最右畫素作為種子點壓入堆疊,返回第2步。否則直接返回第2步。

橫座標i從xl+1開始,當小於xr時進行下面的迴圈:

當以(i,y+1)為座標的畫素點顏色不為邊界顏色且也未被填充時,即說明找到乙個未填充區域,此時要尋找區域最右端座標。

令j=i+1

以(j,y+1)為座標的畫素點顏色不是邊界顏色時,迴圈執行j++,否則退出迴圈(此時說明到達該區間的最右端)

令i=j-1(i下一次尋找的座標從當前區間的最右畫素點開始)

i++返回步驟1

//在當前掃瞄線上下兩端尋找新的種子

//stack為系統堆疊

void

findnewseed

(stack

& s,

int left,

int right,

int y, colorref bcolor, colorref ncolor)}}

//掃瞄線種子填充演算法

void

scanlineflood

(int x,

int y, colorref bcolor, colorref ncolor)

}

若有不對的地方請指正,不勝感激!!!

掃瞄線種子填充

掃瞄線種子填充演算法的基本過程如下 當給定種子點 x,y 時,首先分別向左和向右兩個方向填充種子點所在掃瞄線上的位於給定區域的乙個區段,同時記下這個區段的範圍 xleft,xright 然後確定與這一區段相連通的上 下兩條掃瞄線上位於給定區域內的區段,並依次儲存下來。反覆這個過程,直到填充結。掃瞄線...

C語言實現的掃瞄線種子填充演算法

include graphics.h include stdio.h include alloc.h include dos.h include conio.h creat a stack struct stack node typedef stack node stack list typedef...

多邊形區域填充演算法 掃瞄線種子填充演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!1.3掃瞄線種子填充演算法 1.1和1.2節介紹的兩種種子填充演算法的優點是非常簡單,缺點是使用了遞迴演算法,這不但需要大量棧空間來儲存相鄰的點,而且效率不高。為了減少演算法中的遞迴呼叫,節省棧空間的使用,人們提出了很多改進演算法,其中一種就是掃瞄...