优化cv2.findContours()函数提取的目标边界点,使语义分割进行远监督辅助标注

优化cv2.findContours()函数提取的目标边界点

假设我们想要提取的目标边界长这样:
优化cv2.findContours()函数提取的目标边界点,使语义分割进行远监督辅助标注_第1张图片
我们先使用以下代码查看效果

import cv2
import numpy as np
import os

if __name__ == '__main__':
    # 图像可以选择自己的
    image_filepath = './landslide/image/20221129112713.png'
    # 读取图像
    image = cv2.imread(image_filepath)
    # 转化为灰度图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray', gray)
    cv2.waitKey(0)
    # 提取轮廓,重要的是contours这个数组类型
    contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for i in range(len(contours)):
        # 每一次对一个轮廓进行描边,描边的颜色为color参数,轮廓的索引值为i
        new_image = cv2.drawContours(image, contours, i, color=[0, 0, 255])
        cv2.imshow('new_image', new_image)
        cv2.waitKey(0)

可以看到cv2.findContours()函数可以将目标的所有边界点都进行导出来,但是他的点存在一个问题,太过密集,如果我们想将语义分割的结果重新导出成labelme格式的json文件进行修正时,这就会存在点太密集没有办法进行修改,这里展示一个示例:没有对导出的结果进行修正,在labelme中的效果图。
优化cv2.findContours()函数提取的目标边界点,使语义分割进行远监督辅助标注_第2张图片
可以看到这里直接导出的点太过于密集,需要对其进行一个优化,否则难以直接使用labelme进行修正。

优化的思想可以使用一些优化算法对密集的点进行删除,网上都有一些教程。

这里我们提供我们转化后的一个效果图:
优化cv2.findContours()函数提取的目标边界点,使语义分割进行远监督辅助标注_第3张图片
目前这个点的密集程度已经大大减少,基本上已经接近人工在labelme软件上标注的效果。

创作不易,可以通过这个链接下载代码,如果存在问题可以私信我下载链接。
如果对您有帮助可以点哦

你可能感兴趣的:(opencv,计算机视觉,python,语义分割)