距离变换是二值图像处理的常用手段,在骨架提取、图像窄化中经常用到。
距离变换后得到的是与输入图像类似的灰度图,越远离背景边缘灰度值越大(越亮)。
常用的算法有:欧几里得距离(L2 norm)、曼哈顿距离(L1 norm)、棋盘格距离(L1 ∞)
算法的具体实现略。
介绍一个api :
cv.distanceTransform(dst,cv.DIST_L1,5,dstType=cv.CV_8U)
cv.DIST_L1 要与 CV_8U 相配
cv.DIST_L2 要与 CV_32F 相配,如果直接用L2可能由于数值太大而没有效果,需要加上:
cv.normalize(dist,dist,0,1,cv.NORM_MINMAX)
代码如下:
def distance_demo():
src = cv.imread("D:/pythonTest/img/1.jpg")
cv.imshow("input", src)
src = cv.GaussianBlur(src, (3, 3), 0)
grey = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, dst = cv.threshold(grey, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("output", dst)
dist = cv.distanceTransform(dst,cv.DIST_L1,5,dstType=cv.CV_8U)
#cv.normalize(dist,dist,0,1,cv.NORM_MINMAX)
cv.imshow("distance_transform",dist)
效果如下: