distanceTransform函数
distanceTransform函數
函數的作用:
主要用于計算非零像素到最近零像素點的最短距離。一般用于求解圖像的骨骼。。。。
函數調用形式:
C++:?void?distanceTransform(InputArray?src, OutputArray?dst, int?distanceType, int?maskSize)
參數詳解:
InputArray?src:輸入的圖像,一般為二值圖像
?OutputArray?dst:輸出的圖像
int?distanceType:所用的求解距離的類型、
It can be?CV_DIST_L1,?CV_DIST_L2?, or?CV_DIST_C
mask_size ?距離變換掩模的大小,可以是?3?或?5.?對?CV_DIST_L1?或?CV_DIST_C?的情況,參數值被強制設定為?3,?因為?3×3?mask?給出?5×5?mask?一樣的結果,而且速度還更快。?
mask
函數 cvDistTransform 二值圖像每一個象素點到它最鄰近零象素點的距離。對零象素,函數設置 0 距離,對其它象素,它尋找由基本位移(水平、垂直、對角線或knight's move,最后一項對 5×5 mask 有用)構成的最短路徑。 全部的距離被認為是基本距離的和。由于距離函數是對稱的,所有水平和垂直位移具有同樣的代價 (表示為 a ), 所有的對角位移具有同樣的代價 (表示為 b), 所有的 knight's 移動具有同樣的代價 (表示為 c). 對類型 CV_DIST_C 和 CV_DIST_L1,距離的計算是精確的,而類型 CV_DIST_L2 (歐式距離) 距離的計算有某些相對誤差 (5×5 mask 給出更精確的結果), OpenCV 使用 [Borgefors86] 推薦的值:
下面用戶自定義距離的的距離域示例 (黑點 (0) 在白色方塊中間): 用戶自定義 3×3 mask (a=1, b=1.5)
| 4.5 | 4 | 3.5 | 3 | 3.5 | 4 | 4.5 |
| 4 | 3 | 2.5 | 2 | 2.5 | 3 | 4 |
| 3.5 | 2.5 | 1.5 | 1 | 1.5 | 2.5 | 3.5 |
| 3 | 2 | 1 | 0 | 1 | 2 | 3 |
| 3.5 | 2.5 | 1.5 | 1 | 1.5 | 2.5 | 3.5 |
| 4 | 3 | 2.5 | 2 | 2.5 | 3 | 4 |
| 4.5 | 4 | 3.5 | 3 | 3.5 | 4 | 4.5 |
用戶自定義 5×5 mask (a=1, b=1.5, c=2)
| 4.5 | 3.5 | 3 | 3 | 3 | 3.5 | 4.5 |
| 3.5 | 3 | 2 | 2 | 2 | 3 | 3.5 |
| 3 | 2 | 1.5 | 1 | 1.5 | 2 | 3 |
| 3 | 2 | 1 | 0 | 1 | 2 | 3 |
| 3 | 2 | 1.5 | 1 | 1.5 | 2 | 3 |
| 3.5 | 3 | 2 | 2 | 2 | 3 | 3.5 |
| 4 | 3.5 | 3 | 3 | 3 | 3.5 | 4 |
典型的使用快速粗略距離估計 CV_DIST_L2, 3×3 mask , 如果要更精確的距離估計,使用 CV_DIST_L2, 5×5 mask。
圖像的距離變換被定義為一幅新的圖像,該圖像的每個輸出像素被設成與輸入像素中0像素最近的距離。顯然,典型
的距離變換的輸入應為某些邊緣圖像。在多數應用中,距離變換的輸入是例如Canny 邊緣檢測的檢測圖像的轉換輸
出(即邊緣的值是0,非邊緣的是非0)。
opencv代碼:
<span style="font-size:18px;">#include<cv.h> #include<highgui.h> #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib")int main() { IplImage* src = cvLoadImage ("test.png", 1); IplImage* dst = cvCreateImage (cvGetSize(src), IPL_DEPTH_32F, 1); IplImage* canny = cvCreateImage (cvGetSize(src), IPL_DEPTH_8U, 1); cvCvtColor (src, canny, CV_RGB2GRAY); cvCanny (canny, canny, 100, 200, 3); cvDistTransform (canny, dst, CV_DIST_WELSCH, 3); cvNamedWindow ("src", 1); cvShowImage ("src", src); cvNamedWindow ("dist", 1); cvShowImage ("dist", canny); cvWaitKey (0); cvReleaseImage (&src); cvReleaseImage (&canny); cvReleaseImage (&dst); return 0; } </span>
總結
以上是生活随笔為你收集整理的distanceTransform函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cvtColor函数
- 下一篇: floodFill函数