1. 程式人生 > >(8)種子填充演算法

(8)種子填充演算法

兩種連通區域

 四連通區域:從區域內一點出發,可通過上、下、左、右四個方向的移動組合,在不越出區域的前提下,能到達區域內的任意畫素


 八連通區域:從區域內每一畫素出發,可通過八個方向,即上、下、左、右、左上、右上、左下、右下移動的組合,在不越出區域的前提下,能到達區域內的任意畫素。


基本原理

從多邊形區域內部的某一畫素點(稱為種子)開始,由此出發找到區域內的其它所有畫素。

採用的邊界定義

區域邊界上所有畫素均具有某個特定的顏色值,區域內部所有畫素均不取這一特定顏色,而邊界外的畫素則可具有與邊界相同的顏色值。

演算法的執行過程:

從(x,y)開始,先檢測該點的顏色,若它與邊界色和填充色均不相同,則用填充色填充該點。然後檢測相鄰位置,以確定它們是否是邊界色和填充色,若不是,則填充該相鄰點。直到檢測完區域邊界範圍內的所有畫素為止。
 從當前點檢測相鄰畫素的方法:四連通或八連通
 從四個方向尋找下一個畫素,稱為四向演算法(只能填充四連通區域);
 從八個方向尋找下一個畫素,稱為八向演算法(可以填充八連通區域和四連通區域)。

四連通區域的種子填充遞迴演算法:

void ZhongZiTC4 (int seedx, int seedy, int fcolor, int bcolor)
{    
     int current = getpixel (seedx, seedy);
     if ((current != bcolor) && (current != fcolor))
     {	 putpixel (seedx, seedy, fcolor);
	 ZhongZiTC4 (seedx+1, seedy, fcolor, bcolor);  //右
	 ZhongZiTC4 (seedx–1, seedy, fcolor, bcolor);  //左
	 ZhongZiTC4 (seedx, seedy+1, fcolor, bcolor);  //上
	 ZhongZiTC4 (seedx, seedy–1, fcolor, bcolor);  //下
     }
}