实例分割的掩码轮廓提取

怎么把实例分割中掩码轮廓提取出来
尝试了很多方法都不行,希望能给点方法

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7578268
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:一个乳腺癌组织病理图像数据集和几种常用的特征提取方法、常用的分类算法
  • 除此之外, 这篇博客: 基于单应矩阵分解的位姿提取方法中的 成像过程的坐标系变换关系 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、世界坐标系下一个固定的点P,在世界坐标系为Pw
    2、由于相机的运动,P在像极坐标系下 Pc=RPw+t
    3、归一化到成像平面Z=1,得到Pc=[X/Z,Y/Z,1]T
    4、得到像素坐标系下坐标Puv=KPc

    这里写图片描述

  • 您还可以看一下 吴刚老师的【吴刚大讲堂】电商导航视觉识别设计课程中的 旧版本应用标签的视觉误差及提升点分析小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对提取掩码轮廓的问题,可以使用以下方法:

    1. 首先将分割后的掩码图像进行二值化处理,将像素值大于阈值的像素置为255,像素值小于等于阈值的像素置为0,阈值可以根据实际情况来确定。 代码如下:
    import cv2
    import numpy as np
    
    def binarize_mask(mask, threshold):
        """
        对掩码进行二值化处理
        :param mask: 原始掩码图像,shape为(H, W)
        :param threshold: 阈值
        :return: 二值化后的图像,shape为(H, W)
        """
        binary_mask = np.zeros(mask.shape, dtype=np.uint8)
        binary_mask[mask > threshold] = 255
        return binary_mask
    
    1. 对二值化后的掩码图像进行边缘检测,可以使用 OpenCV 提供的 Canny 算法进行边缘检测。 代码如下:
    def extract_mask_contours(mask, threshold1, threshold2):
        """
        提取二值化后的掩码图像的轮廓,并返回轮廓点坐标
        :param mask: 二值化后的掩码图像,shape为(H, W)
        :param threshold1: Canny算法第一个阈值
        :param threshold2: Canny算法第二个阈值
        :return: 轮廓点坐标
        """
        edges = cv2.Canny(mask, threshold1, threshold2)
        contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
        return contours[0]
    
    1. 最后得到的轮廓点坐标可以绘制出轮廓线,也可以将轮廓点坐标保存到文件中。 代码如下:
    def draw_mask_contours(image, contours, color=(0, 255, 0), thickness=2):
        """
        在原始图像上绘制掩码图像的轮廓线
        :param image: 原始图像,shape为(H, W, C)
        :param contours: 控码图像的轮廓点坐标
        :param color: 轮廓线颜色
        :param thickness: 轮廓线粗细
        :return: 在原始图像上绘制轮廓线后的图像
        """
        image_copy = image.copy()
        cv2.drawContours(image_copy, [contours], -1, color, thickness)
        return image_copy
    
    1. 使用以上方法可以提取掩码轮廓,并将轮廓绘制在原始图像上。为了得到更精确的掩码轮廓,可以调整阈值、边缘检测算法等参数,并进行适当的后处理。

一般来说,你的掩码都是一张二值化的图片,或者最终的结果是带有不同颜色标记的RGB彩色图片,每个实例一个颜色标记。
但是我还是比较建议在处理生成对应实例掩码的时候,最终结果是二值化的时候对其进行轮廓提取,不然在最终结果上面,你就得知道对应的实例的RGB值才能二值化。
上面的mask或者RGB的掩码经过二值化之后,对结果进行findContours()获取其轮廓点,最终的结果就是你要的