掃瞄線種子填充

2021-08-22 10:36:01 字數 1163 閱讀 9919

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

掃瞄線種子填充演算法可由下列四個步驟實現:

(1) 初始化乙個空的棧用於存放種子點,將種子點(x, y)入棧;

(2) 判斷棧是否為空,如果棧為空則結束演算法,否則取出棧頂元素作為當前掃瞄線的種子點(x, y),y是當前的掃瞄線;

(3) 從種子點(x, y)出發,沿當前掃瞄線向左、右兩個方向填充,直到邊界。分別標記區段的左、右端點座標為xleft和xright;

(4) 分別檢查與當前掃瞄線相鄰的y - 1和y + 1兩條掃瞄線在區間[xleft, xright]中的畫素,從xleft開始向xright方向搜尋,若存在非邊界且未填充的畫素點,則找出這些相鄰的畫素點中最右邊的乙個,並將其作為種子點壓入棧中,然後返回第(2)步;

void fill(int x,int y,colorref color)

while(getcolor(x2,seed.y)!=bordercolor&&getcolor(x2,sedd.y)!=color)

int left1=x1,right1=x2,

left2=left1,right2=right1;

//上下掃瞄

bool findnewseed=false;//處理無效點

while(left1<=right1)

else if(!findnewseed)

findnewseed=true;

if(findnewseed && left1==right1)

s.push(point(left1,seed.y-1);

left1++;

}findnewseed=false;//處理無效點

while(left2<=right2)

else if(!findnewseed)

findnewseed=true;

if(findnewseed && left2==right2)

s.push(point(left2,seed.y+1);

left2++;}}

}

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

今天來介紹一種利用堆疊實現的填充演算法,這種演算法相比於直接使用遞迴實現的填充演算法 如內點表示的四連通種子填充演算法 來說,它需要的堆疊大小不需要那麼龐大,下面是在mfc中實現方法。在任意不間斷區間 一條掃瞄線上的一組相鄰畫素 中,只取乙個種子畫素,填充當前掃瞄線上的該段區間,然後確定與這一段相鄰...

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

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

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...