Python 保持对象的所有细节以最平滑和最有效的方式删除形状

Python 保持对象的所有细节以最平滑和最有效的方式删除形状,python,image-processing,mask,Python,Image Processing,Mask,我有一些图片,我也有他们的面具(图片中的绿色)。我在对象周围生成一个边界框(图中的点线),并仅拍摄图像的这一部分 现在我想用像素替换灰色部分,以最自然的方式扩展汽车颜色。例如,使用与最近的汽车像素相同的颜色。在最后,我想有一个图像与所有的汽车细节,但没有任何形状了 我尝试简单地反转遮罩,使遮罩代表汽车周围的灰色像素,然后使用opencv的“inpaint”(修复)功能以适当的颜色绘制此新遮罩: result = cv2.inpaint(car_image,new_mask,50,cv2.INP

我有一些图片,我也有他们的面具(图片中的绿色)。我在对象周围生成一个边界框(图中的点线),并仅拍摄图像的这一部分

现在我想用像素替换灰色部分,以最自然的方式扩展汽车颜色。例如,使用与最近的汽车像素相同的颜色。在最后,我想有一个图像与所有的汽车细节,但没有任何形状了

我尝试简单地反转遮罩,使遮罩代表汽车周围的灰色像素,然后使用opencv的“inpaint”(修复)功能以适当的颜色绘制此新遮罩:

result = cv2.inpaint(car_image,new_mask,50,cv2.INPAINT_NS)
它的工作不好,因为我们仍然清楚地看到汽车周围的边界


如有任何提示,将不胜感激。我正在使用python,它需要非常高效,因为我有大量的图像。

这是一个很好的工作解决方案,它的功能是给定一个在掩码外为零值的图像,它输出一个类似的图像,其中选择的不是零值,而是最合适的颜色,以便我们保留对象的所有细节,但删除形状:

#replace black pixel by smoothing with adequate color to keep all info, removing shape 
def remove_shape_keep_all_info(img):
    #create mask (s.t. Non-zero pixels indicate the area that needs to be inpainted)
    mask_ = np.array([[1 if j==0 else 0 for j in i] for i in cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)]).astype('uint8')
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
    mask_ = cv2.dilate(mask_, kernel, iterations=4)
    result = cv2.inpaint(img,mask_,5,cv2.INPAINT_TELEA) #,cv2.INPAINT_TELEA, INPAINT_NS
    return (result)

有人对这个问题投了反对票,请解释一下原因。可能有一些简单但低效的方法。你能不能把像素颜色从遮罩下面延伸到边缘?你试过什么了吗?谢谢你的回复。我正在尝试使用修复方法,也可以认为非有效的方法是计算每个像素之间的距离矩阵,并使用它来找到最近的非黑色像素。最终的结果,你想要的是不清楚。“不再有任何形状”?是的,我们不应该再看到护理的形状,而是保留所有其他信息。例如,可以通过扩展边界像素来实现这一点,但我不确定如何实现这一点