文章目录
- 距离变换
- distanceTransform函数
距离变换
如果把二值图像理解成地形,黑色表示海洋,白色表示陆地,那么陆地上任意一点,到海洋都有一个最近的距离,如下图所示,对于左侧二值图像来说,【dist-bg】为其白色区域的骨骼;【dist-fg】为黑色区域的骨骼。
实现代码如下
import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2
img = ascent().astype(np.uint8)
bImgs = {}
th, bImg = cv2.threshold(img, 0, 255,
cv2.THRESH_BINARY+cv2.THRESH_OTSU)
bImgs[f'otsu({th})'] = bImg
bImgs["dist-bg"] = cv2.distanceTransform(bImg, cv2.DIST_L2,5)
bImgs["dist-fg"] = cv2.distanceTransform(255-bImg, cv2.DIST_L2,5)
for i,key in enumerate(bImgs,1):
plt.subplot(1,3,i)
plt.imshow(bImgs[key], cmap='gray')
plt.title(key)
plt.axis('off')
plt.show()
distanceTransform函数
【distanceTransform】函数的功能是,计算当前像素点到零像素点的最短距离,其输入参数有三,分别是输入的二值图像;求解距离的类型,以及掩膜尺寸,一般可设为3或者5。
在一张图像中,两点之间的距离有多种计算方式,比如
- a a a 水平和数竖直方向的变化量
- b b b 对角方向的变化量
- c c c 条约移动的变化量
距离变换函数综合了这三种距离,根据各种距离的权重不同,提供了下面几种不同的距离类别
distanceType | maskSize | 参数 |
---|---|---|
CV_DIST_C | 3 ( 3 × 3 ) (3\times3) (3×3) | a = 1 , b = 1 a=1, b=1 a=1,b=1 |
CV_DIST_L1 | 3 ( 3 × 3 ) (3\times3) (3×3) | a = 1 , b = 2 a=1, b=2 a=1,b=2 |
CV_DIST_L2 | 3 ( 3 × 3 ) (3\times3) (3×3) | a = 0.955 , b = 1.3693 a=0.955, b=1.3693 a=0.955,b=1.3693 |
CV_DIST_L2 | 5 ( 5 × 5 ) (5\times5) (5×5) | a = 1 , b = 1.4 , c = 2.1969 a=1, b=1.4, c=2.1969 a=1,b=1.4,c=2.1969 |