如何调整我的代码以使用 cv2.distanceTransform 获得此 smoother/fatter 距离图?

How to tweak my code to get this smoother/fatter distance map using cv2.distanceTransform?

我在看一篇论文,用距离变换得到概率图,如下图: 使用二进制图像: 与我的相比,本文的地图更加“集中和填充”(注意更粗的黄色并且没​​有尖线):

根据这篇论文,它是这样描述的:

...convert them to continuous distance maps by a distance transform and normalize them from 0 to 1 to form a probability map

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import cv2

m = np.zeros((720, 1280), dtype=np.uint8)
pts = np.array([[320, 360], [640, 360], [960, 360]])
# rectangle size
rh, rw = 100, 120

for x, y in pts:
    m = cv2.rectangle(m, (int(x - rw / 2), int(y - rh / 2)), (int(x + rw / 2), int(y + rh / 2)), (255, 255, 255), -1)
m = cv2.distanceTransform(m, cv2.DIST_L2, cv2.DIST_MASK_5)
plt.imshow(m)

知道如何调整我的代码以更接近论文的内容吗?

您需要先反转您的图像 m,这样您的方框就会变黑。然后进行距离阈值:

inv_m = cv2.bitwise_not(m)
dist_img = cv2.distanceTransform(inv_m, cv2.DIST_L2, 3)
norm_img = cv2.normalize(dist_img, dist_img, 0, 1.0, cv2.NORM_MINMAX)

使用 scikit image 库,将强度范围缩放到 255:

scale_img = skimage.exposure.rescale_intensity(norm_img, in_range='image', out_range=(0,255)).astype(np.uint8)

现在在这个强度范围内创建一个范围,这里我选择输入范围(0-30)。然后反转它:

scale_img2 = skimage.exposure.rescale_intensity(scale_img, in_range=(0,30), out_range=(0,255)).astype(np.uint8)
final_img = cv2.bitwise_not(scale_img2)

这个post是基于recent answer by fmw42