获取轮廓末端点

获取轮廓末端点

示例代码

import cv2
import numpy as np


def get_mask_thinning(mask):
    mask_thinning = cv2.ximgproc.thinning(
        mask,
        # thinningType=cv2.ximgproc.THINNING_ZHANGSUEN
        thinningType=cv2.ximgproc.THINNING_GUOHALL,
    )
    return mask_thinning

def get_contour_end_points(mask):
    """
    获取轮廓末端点,八领域法判断
    通过计算当前像素与它相邻的像素前景数量=2即可判断它为端点
    """
    end_point_list = []
    # 使用cv2.findNonZero()函数查找非零像素的坐标
    nonzero_pts = cv2.findNonZero(mask)

    # 获取端点
    for point in nonzero_pts:
        x, y = point[0]
        # 计算邻域内的前景像素数
        neighbors = np.sum(mask[y - 1 : y + 2, x - 1 : x + 2] / 255)
        if neighbors == 2:
            end_point_list.append((x, y))

    return end_point_list

def visual_mask_points(mask, point_list, visual_color=(0, 0, 255)):
    mask_visual = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
    for (x, y) in point_list:
        mask_visual[y, x, :] = visual_color

    return mask_visual

if __name__ == "__main__":
    mask_path = "./test.png"
    mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
    mask_thinning = get_mask_thinning(mask)
    end_point_list = get_contour_end_points(mask_thinning)
    mask_visual = visual_mask_points(mask_thinning, end_point_list)
    mask_visual_path = "./test_visual.png"
    cv2.imwrite(mask_visual_path, mask_visual)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值