函数
cv2.distanceTransform()
用于计算图像中每一个非零点像素与其最近的零点像素之间的距离(Distance Transform, DT算法),本文记录OpenCV 距离变换相关内容。
OpenCV中,函数
cv2.distanceTransform()
用于计算图像中每一个非零点像素与其最近的零点像素之间的距离,输出的是保存每一个非零点与最近零点的距离信息;图像上越亮的点,代表了离零点的距离越远。
两种方法运算复杂度与像素数都是线性关系,但精确的算法会稍慢一点。
参考论文: 《Distance Transformations in Digital Images》
该方法计算出的不是精确的距离,胜在速度较快
为源图像的每个像素计算到最近零像素的距离。 官方文档
cv2.distanceTransform(
src, # 二通道二值图,uint8 格式
distanceType, # 距离类型
maskSize[, # 距离变换掩码的大小
dst[,
dstType]] # 要生成的标签数组的类型
) -> dst
DistanceTypes
官方文档
参数 | 含义 |
---|---|
cv2.DIST_USER | 用户自定义距离 |
cv2.DIST_L1 | L1 距离 $ |
cv2.DIST_L2 | L2 距离,欧氏距离 |
cv2.DIST_C | $max( |
cv2.DIST_L12 | $2(sqrt(1+x*x/2) - 1))$ |
cv2.DIST_FAIR | $ c^2( |
cv2.DIST_WELSCH | $ c2/2(1-exp(-(x/c)2)), c = 2.9846$ |
cv2.DIST_HUBER | $ |
DistanceTransformMasks
官方文档
参数 | 含义 |
---|---|
cv2.DIST_MASK_3 | mask=3 |
cv2.DIST_MASK_5 | mask=5 |
cv2.DIST_MASK_PRECISE | 该函数不支持该参数 |
img_org = mt.cv_rgb_imread('dis_trans.jpg', gray=True)
img = (img_org > 100).astype('uint8')
res = cv2.distanceTransform(img, distanceType=cv2.DIST_L2, maskSize=0)
PIS(img>0, res)
距离变换的另一个重载,不仅计算最短零距离,也会报告最小距离对应的对象。 官方文档
cv2.distanceTransformWithLabels(
src,
distanceType,
maskSize[,
dst[,
labels[,
labelType]]]) ->
dst, labels
DistanceTransformLabelTypes
官方文档
参数 | 含义 |
---|---|
cv2.DIST_LABEL_CCOMP | Src 中的每个零点连接元件(图论)(以及所有最接近连接元件(图论)的非零像素)都会被分配相同的标签 |
cv2.DIST_LABEL_PIXEL | 每个零像素(以及离它最近的所有非零像素)都有自己的标签。 |
img_org = mt.cv_rgb_imread('dis_trans.jpg', gray=True)
img = (img_org > 100).astype('uint8')
res_ccomp = cv2.distanceTransformWithLabels(img, distanceType=cv2.DIST_L2, maskSize=0, labelType=cv2.DIST_LABEL_CCOMP)
res_pixel = cv2.distanceTransformWithLabels(img, distanceType=cv2.DIST_L2, maskSize=0, labelType=cv2.DIST_LABEL_PIXEL)
PIS(img_org, res_ccomp[0], res_ccomp[1] % 17, res_pixel[1] % 17)