



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)一個(gè)多邊形區(qū)域遞歸種子填充算法
本篇文章給大家分享的是有關(guān)Android中怎么實(shí)現(xiàn)一個(gè)多邊形區(qū)域遞歸種子填充算法,在下覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著在下一起來看看吧。一、種子填充算法(SeedFilling)如果要填充的區(qū)域是以圖像元數(shù)據(jù)方式給出的,通常使用種子填充算法(SeedFilling)進(jìn)行區(qū)域填充。種子填充算法需要給出圖像數(shù)據(jù)的區(qū)域,以及區(qū)域內(nèi)的一個(gè)點(diǎn),這種算法比較適合人機(jī)交互方式進(jìn)行的圖像填充操作,不適合計(jì)算機(jī)自動(dòng)處理和判斷填色。根據(jù)對(duì)圖像區(qū)域邊界定義方式以及對(duì)點(diǎn)的顏色修改方式,種子填充又可細(xì)分為幾類,比如注入填充算法(FloodFillAlgorithm)、邊界填充算法(BoundaryFillAlgorithm)以及為減少遞歸和壓棧次數(shù)而改進(jìn)的掃描線種子填充算法等等。所有種子填充算法的核心其實(shí)就是一個(gè)遞歸算法,都是從指定的種子點(diǎn)開始,向各個(gè)方向上搜索,逐個(gè)像素進(jìn)行處理,直到遇到邊界,各種種子填充算法只是在處理顏色和邊界的方式上有所不同。在開始介紹種子填充算法之前,首先也介紹兩個(gè)概念,就是“4-聯(lián)通算法”和“8-聯(lián)通算法”。既然是搜索就涉及到搜索的方向問題,從區(qū)域內(nèi)任意一點(diǎn)出發(fā),如果只是通過上、下、左、右四個(gè)方向搜索到達(dá)區(qū)域內(nèi)的任意像素,則用這種方法填充的區(qū)域就稱為四連通域,這種填充方法就稱為“4-聯(lián)通算法”。如果從區(qū)域內(nèi)任意一點(diǎn)出發(fā),通過上、下、左、右、左上、左下、右上和右下全部八個(gè)方向到達(dá)區(qū)域內(nèi)的任意像素,則這種方法填充的區(qū)域就稱為八連通域,這種填充方法就稱為“8-聯(lián)通算法”。如圖1(a)所示,假設(shè)中心的藍(lán)色點(diǎn)是當(dāng)前處理的點(diǎn),如果是“4-聯(lián)通算法”,則只搜索處理周圍藍(lán)色標(biāo)識(shí)的四個(gè)點(diǎn),如果是“8-聯(lián)通算法”則除了處理上、下、左、右四個(gè)藍(lán)色標(biāo)識(shí)的點(diǎn),還搜索處理四個(gè)紅色標(biāo)識(shí)的點(diǎn)。兩種搜索算法的填充效果分別如如圖1(b)和圖1(c)所示,假如都是從黃色點(diǎn)開始填充,則“4-聯(lián)通算法”如圖1(b)所示只搜索填充左下角的區(qū)域,而“8-聯(lián)通算法”則如圖1(c)所示,將左下角和右上角的區(qū)域都填充了。圖(1)“4-聯(lián)通”和“8-聯(lián)通”填充效果并不能僅僅因?yàn)閳D1的填充效果就認(rèn)為“8-聯(lián)通算法”一定比“4-聯(lián)通算法”好,應(yīng)該根據(jù)應(yīng)用環(huán)境和實(shí)際的需求選擇聯(lián)通搜索方式,在很多情況下,只有“4-聯(lián)通算法”才能得到正確的結(jié)果。1.1注入填充算法(FloodFillAlgorithm)
注入填充算法不特別強(qiáng)調(diào)區(qū)域的邊界,它只是從指定位置開始,將所有聯(lián)通區(qū)域內(nèi)某種指定顏色的點(diǎn)都替換成另一種顏色,從而實(shí)現(xiàn)填充效果。注入填充算法能夠?qū)崿F(xiàn)顏色替換之類的功能,這在圖像處理軟件中都得到了廣泛的應(yīng)用。注入填充算法的實(shí)現(xiàn)非常簡單,核心就是遞歸和搜索,以下就是注入填充算法的一個(gè)實(shí)現(xiàn):
void
FloodSeedFill(int
x,
int
y,
int
old_color,
int
new_color)
{
if(GetPixelColor(x,
y)
==
old_color)
{
SetPixelColor(x,
y,
new_color);
for(int
i
=
0;
i
<
COUNT_OF(direction_8);
i++)
{
FloodSeedFill(x
+
direction_8[i].x_offset,
y
+
direction_8[i].y_offset,
old_color,
new_color);
}
}
}
for循環(huán)實(shí)現(xiàn)了向8個(gè)聯(lián)通方向的遞歸搜索,秘密就在direction_8的定義:
typedef
struct
tagDIRECTION
{
int
x_offset;
int
y_offset;
}DIRECTION;DIRECTIONdirection_8[]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};DIRECTIONdirection_8[]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};這個(gè)是搜索類算法中常用的技巧,無需做太多說明,其實(shí)只要將其替換成如下direction_4的定義,就可以將算法改成4個(gè)聯(lián)通方向填充算法:80DIRECTIONdirection_4[]={{-1,0},{0,1},{1,0},{0,-1}};80DIRECTIONdirection_4[]={{-1,0},{0,1},{1,0},{0,-1}};圖2就是應(yīng)用本算法實(shí)現(xiàn)的“4-聯(lián)通”和“8-聯(lián)通”填充效果:圖(2)注入填充算法實(shí)現(xiàn)1.2邊界填充算法(BoundaryFillAlgorithm)
邊界填充算法與注入填充算法的本質(zhì)其實(shí)是一樣的,都是遞歸和搜索,區(qū)別只在于對(duì)邊界的確認(rèn),也就是遞歸的結(jié)束條件不一樣。注入填充算法沒有邊界的概念,只是對(duì)聯(lián)通區(qū)域內(nèi)指定的顏色進(jìn)行替換,而邊界填充算法恰恰強(qiáng)調(diào)邊界的存在,只要是邊界內(nèi)的點(diǎn)無論是什么顏色,都替換成指定的顏色。邊界填充算法在應(yīng)用上也非常的廣泛,畫圖軟件中的“油漆桶”功能就是邊界填充算法的例子。以下就是邊界填充算法的一個(gè)實(shí)現(xiàn):
void
BoundarySeedFill(int
x,
int
y,
int
new_color,
int
boundary_color)
{
int
curColor
=
GetPixelColor(x,
y);
if(
(curColor
!=
boundary_color)
&&
(curColor
!=
new_color)
)
{
SetPixelColor(x,
y,
new_color);
for(int
i
=
0;
i
<
COUNT_OF(direction_8);
i++)
{
BoundarySeedFill(x
+
direction_8[i].x_offset,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中央廚房合作合同范本
- Module7 Unit2 教學(xué)設(shè)計(jì)2024-2025學(xué)年外研版英語九年級(jí)上冊(cè)
- 包裝制品訂購合同范本
- 動(dòng)力柜安裝合同范本
- 3人購車合同范例
- 公寓前臺(tái)轉(zhuǎn)租合同范本
- 冷鏈運(yùn)輸合同范本簡易
- 加工裝飾合同范本
- 出資贈(zèng)與協(xié)議合同范例范例
- 第1課 兩彈元?jiǎng)讎沽?許身國威壯河山-《鄧稼先》教學(xué)設(shè)計(jì)七年級(jí)語文下冊(cè)同步高效課堂(統(tǒng)編版2024)
- 白城2025年吉林大安市事業(yè)單位面向上半年應(yīng)征入伍高校畢業(yè)生招聘5人筆試歷年參考題庫附帶答案詳解
- 全球人工智能產(chǎn)業(yè)發(fā)展現(xiàn)狀和趨勢(shì)
- 2025年市婦聯(lián)執(zhí)委會(huì)議上的工作報(bào)告
- 2025年菏澤醫(yī)學(xué)??茖W(xué)校高職單招數(shù)學(xué)歷年(2016-2024)頻考點(diǎn)試題含答案解析
- 2025年漯河職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 安全生產(chǎn)事故調(diào)查與案例分析(第3版)課件 呂淑然 第5、6章 事故案例評(píng)析、相關(guān)法律法規(guī)
- Unit 2 What time is it?-A Let's spell(課件)-2024-2025學(xué)年人教PEP版英語四年級(jí)下冊(cè)
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級(jí)下冊(cè)第二單元百分?jǐn)?shù)(二)(含答案)
- 創(chuàng)新教案:《歌唱二小放牛郎》在2025年音樂教學(xué)中的應(yīng)用
- 2024年西安電力高等??茖W(xué)校高職單招職業(yè)技能測驗(yàn)歷年參考題庫(頻考版)含答案解析
- 2024年湖南鐵路科技職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
評(píng)論
0/150
提交評(píng)論