假设我们想要提取的目标边界长这样:
我们先使用以下代码查看效果
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中的效果图。
可以看到这里直接导出的点太过于密集,需要对其进行一个优化,否则难以直接使用labelme进行修正。
优化的思想可以使用一些优化算法对密集的点进行删除,网上都有一些教程。
这里我们提供我们转化后的一个效果图:
目前这个点的密集程度已经大大减少,基本上已经接近人工在labelme软件上标注的效果。
创作不易,可以通过这个链接下载代码,如果存在问题可以私信我下载链接。
如果对您有帮助可以点哦