基於佇列和雜湊的種子填充演算法

2021-09-01 23:51:57 字數 3784 閱讀 1766

繼 之後,

我又對種子填充演算法進行了改進,主要利用了雜湊的思想,以空間換時間,把這個演算法的速度再次優化了。

這次的優化效果非常好,填充大面積區域稍有卡頓。

下面是效果圖:

核心**如下:雖然看起來很多,但是相同的內容很多,邏輯清晰。

void

fillarea

(int x,

int y)

;//雜湊表, 雜湊函式 h(key) = key.x + key.y * maxwidth

queue queue;

queue.

push

(x, y)

;while

(!queue.

isempty()

)//後繼

int xt = node-

>x;

int yt = node-

>y -1;

int xb = node-

>x;

int yb = node-

>y +1;

int xl = node-

>x -1;

int yl = node-

>y;

int xr = node-

>x +1;

int yr = node-

>y;

colorref colort =

getpixel

(xt, yt)

; colorref colorb =

getpixel

(xb, yb)

; colorref colorl =

getpixel

(xl, yl)

; colorref colorr =

getpixel

(xr, yr)

;int keyt = xt + yt * maxwidth;

int keyb = xb + yb * maxwidth;

int keyl = xl + yl * maxwidth;

int keyr = xr + yr * maxwidth;

if(colort != paintcolor && colort == color && filled[keyt]!=1

)if(colorb != paintcolor && colorb == color && filled[keyb]!=1

)if(colorl != paintcolor && colorl == color && filled[keyl]!=1

)if(colorr != paintcolor && colorr == color && filled[keyr]!=1

)//消已

putpixel

(node-

>x, node-

>y, paintcolor)

;delete node;

}}

**解釋:

類似於樹的層序遍布,這裡利用了乙個佇列結構

開始時,將種子點壓入。

每當填充並刪除乙個種子時,將其周圍的沒有填充的點作為新的種子壓入佇列中。

佇列結構是我自己寫的,如下:

struct node 

node

(int x,

int y)};

struct queue

void

push

(int x,

int y)

node*

pop(

)return temp;

}return0;

}bool

isempty()

};

#include

#include

using

namespace std;

//佇列

struct node

node

(int x,

int y)};

struct queue

void

push

(int x,

int y)

node*

pop(

)return temp;

}return0;

}bool

isempty()

};void

fillarea

(int x,

int y)

;//雜湊表, 雜湊函式 h(key) = key.x + key.y * maxwidth

queue queue;

queue.

push

(x, y)

;while

(!queue.

isempty()

)//後繼

int xt = node-

>x;

int yt = node-

>y -1;

int xb = node-

>x;

int yb = node-

>y +1;

int xl = node-

>x -1;

int yl = node-

>y;

int xr = node-

>x +1;

int yr = node-

>y;

colorref colort =

getpixel

(xt, yt)

; colorref colorb =

getpixel

(xb, yb)

; colorref colorl =

getpixel

(xl, yl)

; colorref colorr =

getpixel

(xr, yr)

;int keyt = xt + yt * maxwidth;

int keyb = xb + yb * maxwidth;

int keyl = xl + yl * maxwidth;

int keyr = xr + yr * maxwidth;

if(colort != paintcolor && colort == color && filled[keyt]!=1

)if(colorb != paintcolor && colorb == color && filled[keyb]!=1

)if(colorl != paintcolor && colorl == color && filled[keyl]!=1

)if(colorr != paintcolor && colorr == color && filled[keyr]!=1

)//消已

putpixel

(node-

>x, node-

>y, paintcolor)

;delete node;}}

intmain()

if(msg.umsg == wm_lbuttonup)

if(isdown)

if(msg.umsg == wm_rbuttondown)

}endbatchdraw()

;sleep(50

);}system

("pause");

closegraph()

;}

基於集合的種子填充演算法

通過實踐,我們不難發現,基礎的種子填充演算法根本沒法使用。常常遇到的問題是 stack overflow 棧溢位 一種可行的解決辦法是通過自己構建資料結構棧來將遞迴演算法改非遞迴演算法,但是實踐的執行結果還是極其緩慢。現在通過使用集合來優化這個演算法,雖然效率仍然不理想,但還是有一定現實意義 給學習...

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

種子填充演算法在驗證碼識別中的的應用

模擬精靈識別驗證碼的能用是強大的,乙個函式即可以去除雜色雜點,但是有時候驗證碼中有大量的干擾線,並且位置隨機變動的太歷害,這時候我們在處理驗證碼以前首先去除這些干擾線並準確的去除背景提取字元 下面是乙個模擬精靈初步處理後的驗證碼 已經去除了雜色 雜點 但是上面還是有干擾線 乙個可選的辦法是用中值濾波...