1. 程式人生 > >Opencv3.3-距離變換distanceTransform

Opencv3.3-距離變換distanceTransform

功能說明:

distanceTransform:用於計算影象中每一個非零點距離離自己最近的零點的距離;

distanceTransform的第二個Mat矩陣引數dst儲存了每一個點與最近的零點的距離資訊,影象上越亮的點,代表了離零點的距離越遠。

該函式有兩個初始化API:

void distanceTransform(InputArray src, OutputArray dst, int distanceType, int maskSize)
 
void distanceTransform(
InputArray src, 
OutputArray dst, 
OutputArray labels, 
int distanceType, 
int maskSize, 
int labelType=DIST_LABEL_CCOMP )

引數說明:

  • src – 8-bit, 單通道(二值化)輸入圖片。
  • dst – 輸出結果中包含計算的距離,這是一個32-bit  float 單通道的Mat型別陣列,大小與輸入圖片相同。
  • distanceType – 計算距離的型別那個,可以是 CV_DIST_L1、CV_DIST_L2 、CV_DIST_C。
  • maskSize – 距離變換掩碼矩陣的大小,可以是:

                 3(CV_DIST_L1、 CV_DIST_L2 、CV_DIST_C)
                 5(CV_DIST_L2 )
                 CV_DIST_MASK_PRECISE (這個只能在有4引數的API中使用)

  • labels – 可選的2D標籤輸出(離散 Voronoi 圖),型別為 CV_32SC1 大小同輸入圖片。
  • labelType – 輸出標籤的型別,這裡有些兩種。
  • labelType==DIST_LABEL_CCOMP 將周圍較近的白色畫素點作為一個整體計算其到黑色邊緣的距離
  • labelType==DIST_LABEL_PIXEL 單獨計算每個白色畫素點到其黑色邊緣的距離.

distanceType引數說明:

distanceType maskSize a \ b \ c     
CV_DIST_C 3(3X3) a = 1, b = 1
CV_DIST_L1 3(3X3) a = 1, b = 2
CV_DIST_L2 3(3X3) a=0.955, b=1.3693
CV_DIST_L2 5(5X5) a=1, b=1.4, c=2.1969


其中 a b c 含義:在這個函式中計算每個白色畫素到黑色畫素(0值畫素)的最短距離,因此需要通過最短的移動方式找到這個點兵計算他們之間的值。通常來說移動有水平方向、豎直方向、對角方向、跳躍式幾個移動方法。雖然計算距離的方法都是一些很基礎的公式,但是這個這個掩碼矩陣必須是對陣的(這裡插一句,要求對是式為了卷積計算的過程可以使用加速演算法),因此掩碼矩陣上所有水平和豎直方向的變化量(原文是must have the same shift cost ),這裡用 a 代表;對角方向的變化量用 b 代表;跳躍移動的變化量用 c 代表。CV_DIST_C、CV_DIST_L1、CV_DIST_L2(maskSize=5)的計算結果是精確的,CV_DIST_L2(maskSize=3)是一個快速計算方法。