1 距離變換
2 歐式距離變換
3 OpenCV函數原型
4 基於距離變換的掌心提取
設存在兩個點
曼哈頓距離定義為:
棋盤距離定義為:
歐式距離定義為:
距離變換(DT: distance transform)將二值圖轉為灰度圖,灰度圖中每個像素的值為二值圖中的對應點與最鄰近零值點的距離,如圖Figure 1所示。距離測度有曼哈頓距離、棋盤距離和歐式距離等。其中,歐式距離變換(EDT)計算的是準確距離,但計算量大;其他距離變換(DTs)的計算的是近似距離,但算法簡單快速且易於實現。
Figure 1. Example of a distance transformation. To the left is a binary image, with zero(*) and non-zero(-) pixels. To the right is the resulting image: Each pixel has a value corresponding to the distance to the nearest featyre pixel. The Euclidean distance has been rouded to the nearest integer.2 歐式距離變換歐式距離變換本質上是一種全局操作,計算複雜。Borgefors86[1]提出了一種近似歐式距離變換,其基本思想是全局距離可以通過局部距離的傳播來近似,局部距離是指某個局部區域內像素之間的距離。近似歐式距離變換的數學模型:
其中,
近似歐式距離變換的算法簡單快速且易於實現。使用
3 OpenCV函數原型cpp
void cv::distanceTransform (
InputArray src,
OutputArray dst,
int distanceType,
int maskSize,
int dstType = CV_32F
)參數說明:
src: 8位單通道二值源圖像
dst: 輸出距離圖像,8位整型或32位浮點型單通道數據
distanceType: 距離類型,取值如下:
Type釋義DIST_L1d = |x-u|+|y-v|DIST_L2d = sqrt{(x-u)^2+(y-v)^2}DIST_Cd = max(|x-u|, |y-v|)maksSize: 距離變換的模板大小,取值如下
Type釋義DIST_MASK_3mask = 3DIST_MASK_5mask = 5DIST_MASK_PRECISE和DIST_L2使用dstType: 輸出圖像類型,CV_8U或CV_32F。
當maskSize==DIST_MASK_PRECISE且distanceType==DIST_L2時,使用Felzenszwalb04[2]計算準確的歐式距離;否則使用[Borgefors86]算法,有以下幾種情況:對於DIST_C和DIST_L1,分別計算棋盤距離和曼哈頓距離;並且maskSize被強制設置為3,因為maskSize==3和maskSize==5得到的結果是一致的;而對於DIST_L2,計算近似的歐式距離,而且maskSize==5將得到比maskSzie==3更加準確的結果。當maskSize==3,模板如圖Figure 2所示,當maskSize==5,模板如圖Figure 3所示。
Figure 2. The