阿偶~ 2023-04-09 16:32 采纳率: 11.1%
浏览 53
已结题

二进制掩码转目标检测标签

已知文件夹A内存放有若干张二进制掩码滑坡图片,每一张滑坡二进制掩码图片内部有多个滑坡体(数值非0且每个滑坡体均为一个封闭多边形)求如何利用代码在pycharm软件中求得A文件夹内的二进制掩码图片中的多个滑坡体的数据标签用于记录滑坡体的最小外接矩形的坐标情况(VOC格式,应该包括每个滑坡体的最小外接矩形的坐标情况)最后以xml文档的形式存储(每个xml对应相应的二进制掩码图片图片),最后将所有xml文档放入文件夹B.

img


上图便是四个滑坡体二进制掩码拼接图片,如何获得相应的目标检测标签呢?
2、如何利用代码将文件夹A内的若干滑坡图片每四张滑坡图片为一组拼接在一起并确保最后的拼接结果为一矩
形,将拼接的图片放入文件夹B

  • 写回答

5条回答 默认 最新

  • Leodong. 2023-04-09 17:02
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    以下是完整的回答:

    1、 二进制掩码转目标检测标签

    可以使用Python中的OpenCV库来读取二进制掩码图片,并使用Contour Detection算法来获取滑坡体的边界框信息。具体步骤如下:

    1). 导入OpenCV库和xml.etree.ElementTree库

    import cv2
    import xml.etree.ElementTree as ET
    

    2). 定义函数来获取滑坡体的边界框信息

    def get_bounding_boxes(mask):
        # 使用Contour Detection算法获取滑坡体的边界框信息
        contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
        # 遍历每个滑坡体,获取其最小外接矩形的坐标信息
        boxes = []
        for contour in contours:
            x, y, w, h = cv2.boundingRect(contour)
            boxes.append((x, y, x+w, y+h))  # VOC格式中的坐标是左上角和右下角的点
    
        return boxes
    

    3). 遍历文件夹A下的所有二进制掩码图片,并为每个滑坡体创建一个XML文件

    import os
    
    # 文件夹A的路径
    dir_path = 'A/'
    
    # 遍历文件夹A下的所有二进制掩码图片
    for filename in os.listdir(dir_path):
        if filename.endswith('.png'):  # 假设所有二进制掩码图片的格式为png
            # 读取二进制掩码图片
            mask = cv2.imread(os.path.join(dir_path, filename), cv2.IMREAD_GRAYSCALE)
    
            # 获取滑坡体的边界框信息
            boxes = get_bounding_boxes(mask)
    
            # 创建XML文件并填充标签信息
            root = ET.Element('annotation')
            ET.SubElement(root, 'filename').text = filename
            size = ET.SubElement(root, 'size')
            ET.SubElement(size, 'width').text = str(mask.shape[1])
            ET.SubElement(size, 'height').text = str(mask.shape[0])
            for box in boxes:
                object = ET.SubElement(root, 'object')
                ET.SubElement(object, 'name').text = 'slide'
                bndbox = ET.SubElement(object, 'bndbox')
                ET.SubElement(bndbox, 'xmin').text = str(box[0])
                ET.SubElement(bndbox, 'ymin').text = str(box[1])
                ET.SubElement(bndbox, 'xmax').text = str(box[2])
                ET.SubElement(bndbox, 'ymax').text = str(box[3])
    
            # 保存XML文件
            xml_tree = ET.ElementTree(root)
            xml_tree.write(os.path.join('B', f'{os.path.splitext(filename)[0]}.xml'))
    

    这样,就能够将文件夹A内的所有二进制掩码图片转换为XML格式的目标检测标签,并将标签文件放入文件夹B中。

    2、 滑坡图片拼接

    可以使用Python中的OpenCV库来读取若干滑坡图片,并将其拼接为一张大图。具体步骤如下:

    1). 定义函数来读取若干滑坡图片

    def read_images(image_paths):
        images = []
        for image_path in image_paths:
            image = cv2.imread(image_path)
            images.append(image)
        return images
    

    2). 定义函数来将若干滑坡图片拼接为一张大图

    def concat_images(image_paths):
        # 读取所有滑坡图片
        images = read_images(image_paths)
    
        # 获取每张图片的大小
        heights, widths = zip(*[image.shape[:2] for image in images])
    
        # 计算拼接后的图片大小
        max_height = max(heights)
        total_width = sum(widths)
    
        # 创建空白的拼接结果
        concat_image = np.zeros((max_height, total_width, 3), dtype=np.uint8)
    
        # 将每张图片拼接到拼接结果中
        x = 0
        for image in images:
            h, w = image.shape[:2]
            concat_image[:, x:x+w] = image
            x += w
    
        return concat_image
    

    3). 遍历文件夹A下的所有滑坡图片,并将每四张图片拼接在一起

    import os
    
    # 文件夹A的路径
    dir_path = 'A/'
    
    # 遍历文件夹A下的所有滑坡图片
    image_paths = []
    for filename in os.listdir(dir_path):
        if filename.endswith('.jpg'):  # 假设所有滑坡图片的格式为jpg
            image_paths.append(os.path.join(dir_path, filename))
    
    # 每四张图片为一组,进行拼接
    for i in range(0, len(image_paths), 4):
        # 获取当前组的四张滑坡图片的路径
        current_paths = image_paths[i:i+4]
    
        # 读取四张滑坡图片并拼接
        concat_image = concat_images(current_paths)
    
        # 将拼接结果保存到文件夹B中
        cv2.imwrite(os.path.join('B', f'{i//4}.png'), concat_image)
    

    这样,就能够将文件夹A内的若干滑坡图片每四张滑坡图片为一组拼接在一起,并确保最后的拼接结果为一矩形,并将拼接的图片放入文件夹B中。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月10日
  • 修改了问题 4月9日
  • 修改了问题 4月9日
  • 创建了问题 4月9日

悬赏问题

  • ¥15 io.jsonwebtoken.security.Keys
  • ¥15 急,ubuntu安装后no caching mode page found等
  • ¥15 联想交换机NE2580O/NE1064TO安装SONIC
  • ¥15 防火墙的混合模式配置
  • ¥15 Ubuntu不小心注销了要怎么恢复啊
  • ¥15 win10电脑安装完plcsim advanced4.0运行时为什么会提示找不到虚拟网卡
  • ¥15 安装powerbuilder10卡在安装程序正在运行这个页面 没有下一步任何指令
  • ¥15 关于mpi的问题:请问遇到这种情况需要怎么解决,出现这个问题后电脑不能进行mpi多核运行只能进行单核运行
  • ¥50 微信聊天记录备份到电脑提示成功了,但还是没同步到电脑微信
  • ¥15 python怎么在已有视频文件后添加新帧