天天看點

bwlabel算法_BWLABEL的算法

的函數》

使得最後我也參加了讨論。

時我說了一句錯

話:

大概

IPT

中的

bwlabel

也使用廣度優先的算法吧。

其實

bwlabel

用的并不是圖的廣度

優先周遊。它用的算法正是本系列文章

讨論的内容。

雖然是本系列的第一篇,但我不打算介紹

bwlabel

的功能,因為這篇文章針對需要了

解算法的讀者,都到了要研究具體算法的地步,不可能不知道

bwlabel

是幹什麼的。補充一

句,

IPT

Image

Processing

Toolbox

,在岡薩雷斯的書中都是這樣稱呼的。

bwlabel

是由

Matlab

語言和

C

語言混合實作的。

bwlabel

本身是一個

m

檔案,在裡面

調用了幾個

C

語言的

MEX

bwlabel1.mexw32

是本篇主要的研究對象。十分幸運的是,

IPT

附帶了

bwlabel1.c

。但是這裡不直接将

C

代碼貼出來,因為:

一、安裝了

Matlab

IPT

應該能找到這個檔案,不需要我來貼;二、

C

語言中很多繁瑣的細節不利于了解算法。我在

這裡将用

Python

(

ActivePython

2.5.2.2

)來做

bwlabel1.c

做的事情,會比

C

語言簡潔很多。

而且這裡僅僅是展現算法,而不是開發實用程式,是以也可以不用關心效率,簡潔和

清晰

是第一位的。

bwlabel.m

調

bwlabel1.mexw32

,其對應源碼正是

bwlabel1.c

。而下

面的代碼則是

bwlabel1.c

Python

應物:

首先我們在

pybwlabel.py

中寫了一個輔助函數

size

,用來取得行數和列數,假設為列

優先存儲(

column-major

ordering

)

def

size(IN):

M

=

len(IN[0])

N

=

len(IN)

return

(M,

N)

很簡單,不用解釋了。

接着介紹第二個函數

NumberOfRuns

函數

NumberOfRuns

将計算每一列裡非零像素團

(即靠在一起的非零像素)的數量,并累加起來,例

如,假如有一列:

1

1

1

1

1

這一列有兩團,從第三行開始的以及從第六行開始的。這個函數就是數一副圖像中在

列方向構成團的數目。

bwlabel

的代碼中,這樣列方向上的團被稱為

Run