百度了很久发现没有一篇文章能够完美解决如何缩小多边形选区的问题,本篇文章仅使用一个函数即可完成多边形选区的缩小。效果图如下,红色即选区(hia怕泄露隐私,将背景置0了)。
方法步骤:
1. 获取多边形掩膜mask
mask:背景像素为0,多边形区域内像素为1。
若有多边形的轮廓点坐标,直接采用opencv中的fillPoly()函数即可生成mask;若没有,看着整吧,反正得整成个mask。
2. 生成距离图
采用opencv中的distanceTransform()函数根据mask生成距离图dist_map,dist_map中的元素值为该位置到0像素点的最近距离。函数使用如下:
dist_map = cv2.distanceTransform(src=mask.astype(np.uint8), distanceType=cv2.DIST_L2, maskSize=cv2.DIST_MASK_PRECISE)
3. 根据距离图生成选区缩小后的mask
通过下面代码能够直接生成选区缩小后的mask:
shrink_pixel = 20
mask[dist_map<shrink_pixel] = 0
mask[dist_map>=shrink_pixel] = 1
shrink_pixel值用于控制缩小比例,该值以像素为单位,上述代码即选区整体缩小20个像素。