當前位置:首頁 » 操作系統 » 種子填充演算法

種子填充演算法

發布時間: 2022-01-27 09:40:23

❶ 掃描線種子填充演算法中,每次壓入棧的像素最多有幾個

19" 寬屏 16Bits 顏色 1440*900*2 =2M 1M =Screen/2;100M =50Screen
19" 寬屏 24Bits 顏色 1440*900*3 = 3888000=3M 1M =Screen/3;100M =33Screen

19" 寬屏 32Bits 顏色 1440*900*4 = 3888000=4M 1M =Screen/4;100M =25Screen

23" 寬屏 32Bits 顏色 1920*1080*4=8M 1M =Screen/8;100M =12Screen
堆棧不宜過大,64M已經很大了。
圖像數據還是放在堆空間吧!

❷ 求一個C語言實現的種子填充多邊形演算法程序

/*如果是用線填充,程序如下。如果是用點填充需要用到堆棧和系統底層庫函數或者用畫點函數putpixel()。 下面實例是用掃描線填充長方形,開始要輸入長方形的左上頂點坐標和右下頂點坐標以及填充掃描線的間距(>=1),如果間距等於1,就是完全填充(實填充)。 一個完整的c程序如下,程序在win-tc和tc2.0下都調試通過。 */ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<graphics.h> void draw(int x1,int y1,int x2,int y2,int delta) {int nx1,ny1,nx2,ny2; nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2; while((ny1>=y1)&&(nx2<=x2)) {line(nx1,ny1,nx2,ny2); ny1-=delta; nx2+=delta; } if(nx2>x2) {ny2-=nx2-x2; nx2=x2; while(ny1>y1) {line(nx1,ny1,nx2,ny2); ny1-=delta; ny2-=delta; } nx1+=y1-ny1; ny1=y1; while(nx1<x2) {line(nx1,ny1,nx2,ny2); nx1+=delta; ny2-=delta; } } else {nx1+=y1-ny1; ny1=y1; while(nx2<x2) {line(nx1,ny1,nx2,ny2); nx2+=delta; nx1+=delta; } ny2-=nx2-x2; nx2=x2; while(ny2>y1) {line(nx1,ny1,nx2,ny2); ny2-=delta; nx1+=delta; } } } int main(void) {int x1,y1,y2,x2,delta; int driver=DETECT,mode; printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of rectangle and delta:\n"); scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta); initgraph (&driver,&mode,"C:\\TC"); /*這里*/ rectangle(x1,y1,x2,y2); draw(x1,y1,x2,y2,delta); gotoxy(1,1); printf("Press any key to exit!"); getch(); closegraph(); return 0; } /*說明:將main()函數中的initgraph(&gdriver,&gmode,"");中的""更改為你的TC安裝目錄,一般tc必須安裝在c盤根目錄下,所以就是initgraph(&gdriver,&gmode,"C:\\TC");如你的TC安裝目錄為D盤的Tools目錄下的TC目錄,那麼上述語句改為: initgraph(&gdriver,&gmode,"D:\\Tools\\TC"); 同時保證在D:\\Tools\\TC目錄里有文件EGAVGA.BGI,萬一不行,將本程序復制到你的TC安裝目錄下再運行。 */

❸ 下面是一個4通向的種子填充演算法 但是運行時老是堆棧溢出, 小弟急求大神相助啊.

1、參數x、y由double類型改為int型。

2、方法中x、y限定最小值、最大值。

voidseed(intx,inty,Colornow,Colorfill){
Colorcurrentcolor;
currentcolor=bmp->GetPixel(x,y);
if(currentcolor==now){
bmp->SetPixel(x,y,fill);
if(x<MAX_X){
seed(x+1,y,now,fill);
}
if(x>MIN_X){
seed(x-1,y,now,fill);
}
if(x<MAX_Y){
seed(x,y+1,now,fill);
}
if(x>MIN_Y){
seed(x,y-1,now,fill);
}
}
}

❹ 種子填充演算法的時間復雜度和空間復雜度分析

從塗色的角度講,區域內的n個點,每一個點只被塗了一次色,沒有重復塗,所以可以認為時間復雜度是O(n);空間復雜度也為O(n),雖然有些點重復棧

❺ 填充演算法的種子填充演算法

種子填充演算法又稱為邊界填充演算法。其基本思想是:從多邊形區域的一個內點開始,由內向外用給定的顏色畫點直到邊界為止。如果邊界是以一種顏色指定的,則種子填充演算法可逐個像素地處理直到遇到邊界顏色為止。
種子填充演算法常用四連通域和八連通域技術進行填充操作。
從區域內任意一點出發,通過上、下、左、右四個方向到達區域內的任意像素。用這種方法填充的區域就稱為四連通域;這種填充方法稱為四向連通演算法。
從區域內任意一點出發,通過上、下、左、右、左上、左下、右上和右下八個方向到達區域內的任意像素。用這種方法填充的區域就稱為八連通域;這種填充方法稱為八向連通演算法。
一般來說,八向連通演算法可以填充四向連通區域,而四向連通演算法有時不能填充八向連通區域。例如,八向連通填充演算法能夠正確填充如圖2.4a所示的區域的內部,而四向連通填充演算法只能完成如圖2.4b的部分填充。
圖2.4 四向連通填充演算法
a) 連通域及其內點 b) 填充四連通域
四向連通填充演算法:
a) 種子像素壓入棧中;
b) 如果棧為空,則轉e);否則轉c);
c) 彈出一個像素,並將該像素置成填充色;並判斷該像素相鄰的四連通像素是否為邊界色或已經置成多邊形的填充色,若不是,則將該像素壓入棧;
d) 轉b);
e) 結束。
四向連通填充方法可以用遞歸函數實現如下:
演算法2.3 四向連通遞歸填充演算法:
void BoundaryFill4(int x, int y, long FilledColor, long BoundaryColor)
{
long CurrentColor;
CurrentColor = GetPixelColor(x,y);
if (CurrentColor != BoundaryColor && CurrentColor != FilledColor)
{
SetColor(FilledColor);
SetPixel (x,y);
BoundaryFill4(x+1, y, FilledColor, BoundaryColor);
BoundaryFill4(x-1, y, FilledColor, BoundaryColor);
BoundaryFill4(x, y+1, FilledColor, BoundaryColor);
BoundaryFill4(x, y-1, FilledColor, BoundaryColor);
}
}
上述演算法的優點是非常簡單,缺點是需要大量棧空間來存儲相鄰的點。一個改進的方法就是:通過沿掃描線填充水平像素段,來處理四連通或八連通相鄰點,這樣就僅僅只需要將每個水平像素段的起始位置壓入棧,而不需要將當前位置周圍尚未處理的相鄰像素都壓入棧,從而可以節省大量的棧空間。

❻ 簡述邊界表示的四連通區域的種子填充演算法的基本思想和執行步驟

一、種子填充演算法思想:
首先填充種子所在的尚未填充的一區段,然後確定與這一區段相鄰的上下兩條掃描線上位於該區段內是否存在需要填充的新區段,如果存在,則依次把每個新區段最右端的象素作為種子放入堆棧。反復這個過程,直到堆棧為空。
二、種子填充演算法步驟:
1、初始化堆棧。
2、種子壓入堆棧。
3、While(堆棧非空)從堆棧彈出種子象素。

❼ 求八向聯通的種子填充演算法代碼,用C/C++

bool pop(int &x, int &y)
{
if(stackPointer > 0)
{
int p = stack[stackPointer];
x = p / h;
y = p % h;
stackPointer--;
return 1;
}
else
{
return 0;
}
}

bool push(int x, int y)
{
if(stackPointer < stackSize - 1)
{
stackPointer++;
stack[stackPointer] = h * x + y;
return 1;
}
else
{
return 0;
}
}
void floodFill8Stack(int x, int y, int newColor, int oldColor)
{
if(newColor == oldColor) return; //avoid infinite loop
emptyStack();

if(!push(x, y)) return;
while(pop(x, y))
{
screenBuffer[x][y] = newColor;
if(x + 1 < w && screenBuffer[x + 1][y] == oldColor)
{
if(!push(x + 1, y)) return;
}
if(x - 1 >= 0 && screenBuffer[x - 1][y] == oldColor)
{
if(!push(x - 1, y)) return;
}
if(y + 1 < h && screenBuffer[x][y + 1] == oldColor)
{
if(!push(x, y + 1)) return;
}
if(y - 1 >= 0 && screenBuffer[x][y - 1] == oldColor)
{
if(!push(x, y - 1)) return;
}
if(x + 1 < w && y + 1 < h && screenBuffer[x + 1][y + 1] == oldColor)
{
if(!push(x + 1, y + 1)) return;
}
if(x + 1 < w && y - 1 >= 0 && screenBuffer[x + 1][y - 1] == oldColor)
{
if(!push(x + 1, y - 1)) return;
}
if(x - 1 >= 0 && y + 1 < h && screenBuffer[x - 1][y + 1] == oldColor)
{
if(!push(x - 1, y + 1)) return;
}
if(x - 1 >= 0 && y - 1 >= 0 && screenBuffer[x - 1][y - 1] == oldColor)
{
if(!push(x - 1, y - 1)) return;
}
}
}

或者去下面網址看看
http://hi..com/%B1%FE%CF%E6/blog/item/9014b7c3c8b52f100ff4775c.html

❽ C語言種子填充法填充圓求助

編譯能通過,但是執行出問題,或者執行的效果和自己想像的不一樣,就需要調試。看看這個:
http://tieba..com/f?kz=779255997
希望對你有幫助。

❾ 用隊列實現種子填充演算法的非遞歸

一、種子填充演算法(Seed Filling)
如果要填充的區域是以圖像元數據方式給出的,通常使用種子填充演算法(Seed Filling)進行區域填充。種子填充演算法需要給出圖像數據的區域,以及區域內的一個點,這種演算法比較適合人機交互方式進行的圖像填充操作,不適合計算機自動處理和判斷填色。根據對圖像區域邊界定義方式以及對點的顏色修改方式,種子填充又可細分為幾類,比如注入填充演算法(Flood Fill Algorithm)、邊界填充演算法(Boundary Fill Algorithm)以及為減少遞歸和壓棧次數而改進的掃描線種子填充演算法等等。
所有種子填充演算法的核心其實就是一個遞歸演算法,都是從指定的種子點開始,向各個方向上搜索,逐個像素進行處理,直到遇到邊界,各種種子填充演算法只是在處理顏色和邊界的方式上有所不同。在開始介紹種子填充演算法之前,首先也介紹兩個概念,就是「4-聯通演算法」和「8-聯通演算法」。既然是搜索就涉及到搜索的方向問題,從區域內任意一點出發,如果只是通過上、下、左、右四個方向搜索到達區域內的任意像素,則用這種方法填充的區域就稱為四連通域,這種填充方法就稱為「4-聯通演算法」。如果從區域內任意一點出發,通過上、下、左、右、左上、左下、右上和右下全部八個方向到達區域內的任意像素,則這種方法填充的區域就稱為八連通域,這種填充方法就稱為「8-聯通演算法」。如圖1(a)所示,假設中心的藍色點是當前處理的點,如果是「4-聯通演算法」,則只搜索處理周圍藍色標識的四個點,如果是「8-聯通演算法」則除了處理上、下、左、右四個藍色標識的點,還搜索處理四個紅色標識的點。兩種搜索演算法的填充效果分別如如圖1(b)和圖1(c)所示,假如都是從黃色點開始填充,則「4-聯通演算法」如圖1(b)所示只搜索填充左下角的區域,而「8-聯通演算法」則如圖1(c)所示,將左下角和右上角的區域都填充了。

圖(1) 「4-聯通」和「8-聯通」填充效果

並不能僅僅因為圖1的填充效果就認為「8-聯通演算法」一定比「4-聯通演算法」好,應該根據應用環境和實際的需求選擇聯通搜索方式,在很多情況下,只有「4-聯通演算法」才能得到正確的結果。
1.1 注入填充演算法(Flood Fill Algorithm)
注入填充演算法不特別強調區域的邊界,它只是從指定位置開始,將所有聯通區域內某種指定顏色的點都替換成另一種顏色,從而實現填充效果。注入填充演算法能夠實現顏色替換之類的功能,這在圖像處理軟體中都得到了廣泛的應用。注入填充演算法的實現非常簡單,核心就是遞歸和搜索,以下就是注入填充演算法的一個實現:

164 void FloodSeedFill(int x, int y, int old_color, int new_color)
165 {
166 if(GetPixelColor(x, y) == old_color)
167 {
168 SetPixelColor(x, y, new_color);
169 for(int i = 0; i < COUNT_OF(direction_8); i++)
170 {
171 FloodSeedFill(x + direction_8[i].x_offset,
172 y + direction_8[i].y_offset, old_color, new_color);
173 }
174 }
175 }

for循環實現了向8個聯通方向的遞歸搜索,秘密就在direction_8的定義:

15 typedef struct tagDIRECTION
16 {
17 int x_offset;
18 int y_offset;
19 }DIRECTION;

79 DIRECTION direction_8[] = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1},{0, -1}, {-1, -1} };

這個是搜索類演算法中常用的技巧,無需做太多說明,其實只要將其替換成如下direction_4的定義,就可以將演算法改成4個聯通方向填充演算法:

80 DIRECTION direction_4[] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };

圖2就是應用本演算法實現的「4-聯通」和「8-聯通」填充效果:

熱點內容
管理java版本 發布:2024-11-15 11:44:03 瀏覽:629
ndk編譯的程序如何執行 發布:2024-11-15 11:43:18 瀏覽:626
輕應用伺服器適合搭建網站嗎 發布:2024-11-15 11:36:08 瀏覽:246
c語言的百分號 發布:2024-11-15 11:34:24 瀏覽:31
一加五安卓8什麼時候推送 發布:2024-11-15 11:19:40 瀏覽:854
暗影騎士擎有哪些配置 發布:2024-11-15 11:13:46 瀏覽:598
方舟主機專用伺服器是什麼意思 發布:2024-11-15 11:12:23 瀏覽:8
創維最早的伺服器是什麼 發布:2024-11-15 11:11:35 瀏覽:864
手機配置太低怎麼下載原聲 發布:2024-11-15 11:03:31 瀏覽:905
21款奧迪a6配置有哪些 發布:2024-11-15 11:03:20 瀏覽:120