我使用OpenCV的
watershed算法解决了你的问题.您可以找到分水岭
here的理论和实例.
首先,我选择了几个点(标记)来指示我想要保留的对象在哪里,以及背景在哪里.此步骤是手动的,并且可能因图像而异.此外,它需要一些重复,直到您得到所需的结果.我建议使用工具来获取像素坐标.
然后我创建了一个零的空整数数组,其中包含汽车图像的大小.然后我将一些值(1:背景,[255,192,128,64]:car_parts)分配给标记位置的像素.
注意:当我下载你的图像时,我不得不裁剪它以获得与汽车的一个.裁剪后,图像大小为400×601.这可能不是您拥有的图像大小,因此标记将关闭.
之后我使用了分水岭算法.第一个输入是您的图像,第二个输入是标记图像(除标记位置外,其他地方都为零).结果如下图所示.
我将所有像素的值设置为大于1到255(汽车),其余(背景)为零.然后我用3×3内核扩张获得的图像,以避免丢失关于汽车轮廓的信息.最后,我使用扩展图像作为原始图像的掩码,使用cv2.bitwise_and()函数,结果如下图所示:
这是我的代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Load the image
img = cv2.imread("/path/to/image.png", 3)
# Create a blan