的函數》
,
使得最後我也參加了讨論。
當
時我說了一句錯
話:
“
大概
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
。