多边形标注收缩python代码实现

本文介绍了一种在文本检测任务中改善上下文粘连问题的方法——标注收缩。通过使用特定算法对原始标注进行收缩,可以有效减少文本之间的粘连,提高检测精度。文章详细描述了如何利用Polygon和Pyclipper库实现这一过程,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概述

在做文本检测相关工作的时候会使用到分割网络对文本进行检测,直接使用原始的标注进行训练会导致上下文本存在粘连,一个较为有效的办法就是对标注进行收缩,这样粘连的情况会有所好转。这里将图片放置在src_imgs文件夹下(文件格式为jpg文件),对应的标注放置在labels_txt文件夹下(文件格式为txt文件)。

对于标注文件中标注的规范为:

x1 y1 x2 y2 ... xn yn label_type

每个值以空格作为分隔,最后一个为标注的类别。

2. 代码实现

# -*- coding=utf-8 -*-
import os
import cv2
import Polygon as plg
import pyclipper
import numpy as np

def dist(a, b):
    return np.sqrt(np.sum((a - b) ** 2))

def perimeter(bbox):
    peri = 0.0
    for i in range(bbox.shape[0]):
        peri += dist(bbox[i], bbox[(i + 1) % bbox.shape[0]])
    return peri


def shrink(bboxes, rate, max_shr=20):
    rate = rate * rate
    shrinked_bboxes = []
    for bbox in bboxes:
        area = plg.Polygon(bbox).area()
        peri = perimeter(bbox)

        pco = pyclipper.PyclipperOffset()
        pco.AddPath(bbox, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)
        offset = min((int)(area * (1 - rate) / (peri + 0.001) + 0.5), max_shr)

        shrinked_bbox = pco.Execute(-offset)
        if len(shrinked_bbox) == 0:
            shrinked_bboxes.append(bbox)
            continue

        shrinked_bbox = np.array(shrinked_bbox)[0]
        if shrinked_bbox.shape[0] <= 2:
            shrinked_bboxes.append(bbox)
            continue

        shrinked_bboxes.append(shrinked_bbox)

    return shrinked_bboxes  # np.array(shrinked_bboxes)


def demo(root_path):
    gt_dir = os.path.join(root_path, 'labels_txt')
    img_dir = os.path.join(root_path, 'src_imgs')

    label_list = os.listdir(gt_dir)
    for label_file in label_list[:10]:
        src_img = cv2.imread(os.path.join(img_dir, label_file[:-4]+".jpg"))
        with open(os.path.join(gt_dir, label_file), 'r') as f:
            label_lines = f.readlines()
        gt_boxes = []
        for line in label_lines:
            line = line.strip()
            box_points = [int(float(item)) for item in line.split( )[:-1]]
            box_info = np.array(box_points).reshape((-1, 2))
            gt_boxes.append(box_info)
        [H, W, C] = src_img.shape
        ori_mask_img = np.zeros((H, W))
        for box in gt_boxes:
            ori_mask_img = cv2.fillPoly(ori_mask_img, [box], (255))

        shrink_mask_img = np.zeros((H, W))
        new_gt_boxes = shrink(gt_boxes, 0.9)
        for box in new_gt_boxes:
            shrink_mask_img = cv2.fillPoly(shrink_mask_img, [box], (255))

        cv2.imshow("ori_mask", ori_mask_img)
        cv2.imshow("shrink mask", shrink_mask_img)
        cv2.waitKey(0)

if __name__ == "__main__":
    root_path = os.getcwd()
    demo(root_path)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值