

API:(参考https://blog.csdn.net/qq_18343569/article/details/47972245)
distanceTransform函数
函数的作用:
主要用于计算非零像素到最近零像素点的最短距离。一般用于求解图像的骨骼
函数调用形式:
C++: void distanceTransform(InputArray src, OutputArray dst, int distanceType, int maskSize)
参数详解:
InputArray src:输入的图像,一般为二值图像
OutputArray dst:输出的图像
int distanceType:所用的求解距离的类型、
It can be DIST_L1, DIST_L2 , or DIST_C
mask_size 距离变换掩模的大小,可以是 3 或 5. 对 DIST_L1 或 DIST_C 的情况,参数值被强制设定为 3, 因为 3×3 mask 给出 5×5 mask 一样的结果,而且速度还更快。
mask
用户自定义距离情况下的 mask。 在 3×3 mask 下它由两个数(水平/垂直位量,对角线位移量)组成, 5×5 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] 推荐的值:
CV_DIST_C (3×3):
a=1, b=1
CV_DIST_L1 (3×3):
a=1, b=2
CV_DIST_L2 (3×3):
a=0.955, b=1.3693
CV_DIST_L2 (5×5):
a=1, b=1.4, c=2.1969
下面用户自定义距离的的距离域示例 (黑点 (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< |

本文介绍了如何使用OpenCV的distanceTransform函数进行图像去噪,并结合watershed函数进行图像分割。详细阐述了distanceTransform在计算非零像素到最近零像素点最短距离的应用,以及watershed函数的参数要求和工作原理。实验过程包括图像锐化、制造markers、分水岭变换和上色等步骤,通过高模糊去噪声和膨胀腐蚀改善了分割效果。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



