怎么把实例分割中掩码轮廓提取出来
尝试了很多方法都不行,希望能给点方法
1、世界坐标系下一个固定的点P,在世界坐标系为Pw
2、由于相机的运动,P在像极坐标系下 Pc=RPw+t
3、归一化到成像平面Z=1,得到Pc=[X/Z,Y/Z,1]T
4、得到像素坐标系下坐标Puv=KPc
针对提取掩码轮廓的问题,可以使用以下方法:
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
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]
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
一般来说,你的掩码都是一张二值化的图片,或者最终的结果是带有不同颜色标记的RGB彩色图片,每个实例一个颜色标记。
但是我还是比较建议在处理生成对应实例掩码的时候,最终结果是二值化的时候对其进行轮廓提取,不然在最终结果上面,你就得知道对应的实例的RGB值才能二值化。
上面的mask或者RGB的掩码经过二值化之后,对结果进行findContours()获取其轮廓点,最终的结果就是你要的