區域填充演算法

2021-09-08 23:49:21 字數 4191 閱讀 2323

區域填充即給出乙個區域的邊界,要求對邊界範圍內的所有象素單元賦予指定的顏色**。區域填充中最常用的是多邊形填色,本節中我們就以此為例討論區域填充演算法。

多邊形填色即給出乙個多邊形的邊界,要求對多邊形邊界範圍的所有象素單元賦予指定的色**。要完成這個任務,乙個首要的問題,是判斷乙個象素是在多邊形內還是外。數學上提供的方法是「掃瞄交點的奇偶數判斷」法:

1、將多邊形畫在紙上。

2、用一根水平掃瞄線自左而右通過多邊形而與多邊形之邊界相交。掃瞄線與邊界相交奇次數後進入該多邊形,相交偶次數後走出該多邊形。圖2.3.1示出這類情況:掃瞄線與多邊形相交四點。相交a點之**多邊形;交b點(第2交點)之後出多邊形;交c點(第3交點)之後又入多邊形;交d點(第4交點)之後又出多邊形。

上述方法似乎能完滿地解決問題,但事實並非如此,因為直線在光柵化後變成了占有單位空間的離散點。圖2.3.1中的a點處和b、c處,在光柵化後變成圖2.3.2所示的情況。此時,使用上述判斷法則,在a、b、c處發現錯判現象。在a處,掃瞄線通過一點後以為入多邊形,其實此時已出多邊形。結果是在a點之後的掃瞄線段上全都錯誤地填上色。在b和c處,因為光柵化後,使得掃瞄線通過交點的個數發生變化而同樣導致填色錯誤。因此,原始的奇偶判斷方法需要加以周密地改善,才能成為計算機中實用的填色演算法。

填色演算法分為兩大類:

1、掃瞄線填色(scan-line filling)演算法。這類演算法建立在多邊形邊邊界的向量形式資料之上,可用於程式填色,也可用互動填色。

2、種子填色(seed filling)演算法。這類演算法建立在多邊形邊邊界的圖象形式資料之上,並還需提供多邊形界內一點的座標。所以,它一般只能用於人機互動填色,而難以用於程式填色。

區域填充即給出乙個區域的邊界,要求對邊界範圍內的所有象素單元賦予指定的顏色**。區域填充可以分兩步走,第一步先確定需要填充那些象素,第二步確定用什麼顏色來填充。區域填充中最常用的是多邊形填色。

填色演算法分為兩大類: 1、掃瞄線填色(scan-line filling)演算法。這類演算法建立在多邊形邊邊界的向量形式資料之上,可用於程式填色,也可用互動填色。 2、種子填色(seed filling)演算法。這類演算法建立在多邊形邊邊界的圖象形式資料之上,並還需提供多邊形界內一點的座標。所以,它一般只能用於人機互動填色,而難以用於程式填色。

1>.掃瞄線填色演算法

掃瞄線填色演算法的基本思想是:

用水平掃瞄線從上到下掃瞄由點線段構成的多段構成的多邊形。每根掃瞄線與多邊形各邊產生一系列交點。將這些交點按照x座標進行分類,將分類後的交點成對取出,作為兩個端點,以所填的色彩畫水平直線。多邊形被掃瞄完畢後,填色也就完成。

一、演算法的基本思想

多邊形以n, x_array, y_array形式給出,其中x_array,y_array中存放著多邊形的n個頂點的x, y座標。掃瞄線填色演算法的基本思想是:

用水平掃瞄線從上到下掃瞄由點線段構成的多段構成的多邊形。每根掃瞄線與多邊形各邊產生一系列交點。將這些交點按照x座標進行分類,將分類後的交點成對取出,作為兩個端點,以所填的色彩畫水平直線。多邊形被掃瞄完畢後,填色也就完成。

上述基本思想中,有幾個問題需要解決或改善。它們是:

1. 左、右頂點處理 當以1, 2, 3的次序畫多邊形外框時,多邊形的左頂點和右頂點如圖2.3.3 (a)、(b)所示的頂點2。它們具有性質:

左頂點2:y1y2>y3

其中y1, y2, y3是三個相鄰的頂點的y座標。

(a)左頂點 (b)右頂點

typedef struct each_entry;

each_entry sides[max_point];

int x[max_point], y[max_point];

int side_count, first_s, last_s, scan, bottomscan, x_int_count, r;

fill_area(count, x, y)

int count, x[ ], y[ ];

}void put_in_sides_list(entry, x1, y1, x2, y2, next_y);

int entry, x1, y1, x2, y2, next_y;

}/* 以下為插入活性表操作. */

maxy = (y1 > y2)? y1: y2;

while (( entry >1) && (maxy > sides [entry -1]. y_top))

sides[entry]. y_top=maxy;

sides[entry]. delta_y =abs(y2-y1)+1;

if (y1>y2)

sides[entry]. x_int =x1;

else

void sort_on_bigger_y(n)

int n;

}void process_x_intersections(scan, first_s, last_s)

int scan, first_s, last_s;}}

void draw_lines(scan, x_int_count, index)

int scan, x_int_count, index;

}void update_sides_list( )}}

程式2.3.1 掃瞄線填色程式

1、sort_on_bigger_y子程式的主要功能是按照輸入的多邊形,建立起活性邊表。操作步驟是:對每條邊加以判斷:如非水平邊則呼叫put_in_side_list子程式放入活性邊來;如是水平邊則直接畫出。

2、put_in_sides_list子程式的主要功能是將一條邊存入活性邊表之內。操作步驟是:對該邊判別是否左頂點或右頂點,如果將入邊之終點刪去,按照y_top的大小在活性邊表中找到該點的合適位置,在該邊的位置中填入資料。

3、update_first_and_last子程式的主要功能是重新整理活性邊表的first和last兩根指標的所指位置,以保證指標指出啟用邊的範圍。

4、process_x_intersections子程式的主要功能是對活性邊表中的啟用邊(即位於first和last之間的,並且? y? 0的邊)按照x_int的大小排序。操作步驟是:從first到last,對每一根? y? 0的邊,呼叫sort_on_x子程式排入活性邊表中合適位置。

5、sort_on_x子程式主要功能是將一條邊side[entry],在活性邊表的first到entry之間按x_int的大小插入合適位置。操作步驟是:檢查位於entry的邊的x_int是否小於位置entry-1的邊的x_int,如是,呼叫swap子程式交換兩條邊的彼此位置。

6、swap子程式的主要功能是交換活性邊表中兩條相鄰位置邊的彼此位置。

7、draw_lines子程式的主要功能是在一條掃瞄線位於多邊形內的部分,填上指定的色彩。操作步驟是:在活性邊表的啟用邊範圍內,依次取出δy¹ 0兩邊的x_int,作為兩個端點(x1, scan),(x2, scan),畫一條水平線。

8、update_sides_list子程式的主要功能是重新整理活性邊表內啟用邊的值:δy=dy-1

x_int=x_int_x_chang_per_scan;2>種子填色演算法

種子填色又稱邊界填色(boundary filling)。它的功能是:給出多邊形光柵化後的邊界位置及邊界色**boundary,以及多邊形之內的一點x, y位置,要求將

種子填色又稱邊界填色(boundary filling)。它的功能是:給出多邊形光柵化後的邊界位置及邊界色**boundary,以及多邊形之內的一點x, y位置,要求將顏色color填滿多邊形。

通常採用的填法有兩種:四鄰法(4-connected)和八鄰法。四鄰法是已知x, y(圖2.3.6(a)的黑色象素)是多邊形內的一點,據此向上下左右四個方向測試(圖2.3.6(a)中打勾的象素)、填色、擴散。四鄰法的缺點是有時不能通過狹窄區域,因而不能填滿多邊形。如圖2.3.6(b)所示,左下角方形中的種子(打點的象素)不能擴散到右上角的方形中,因為採用四鄰法通不過中間的狹窄區域。八鄰法是已知x, y(圖2.3.6 (c)中黑色的象素)為多邊形內的一點,即種子,據此可向周圍的八個方向(圖2.3.6(c)中打勾的象素)測試、填色、擴散。八鄰法的缺點是有時要填出多邊形的邊界。如圖2.3.6(d)所示的邊界,按八鄰法就會將色彩塗出多邊形。由於填不滿往往比塗出更易於補救,因此四鄰法比八鄰法用的更普通。

四鄰法種子填色基本程式如程式2.3.2所示。這種程式書寫簡潔,但執行效率不高,因為包含有多餘的判斷。在它的基礎上可以寫出各種改進的演算法[8]。

void seed_filling (x, y, fill_color, boundary_color)

int x, y, fill_color, boundary_color;

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

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

matplotlib 區域填充

import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import datetime 解決能顯示中文 plt.rcparams font.sans serif simhei 指定預設字型 simhei為...

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

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