Opencv 如何在二值分割图像中分割连接和重叠的对象?

Opencv 如何在二值分割图像中分割连接和重叠的对象?,opencv,image-processing,image-segmentation,Opencv,Image Processing,Image Segmentation,我有一个任务,我必须分割图像中的所有柠檬,并对它们进行计数,我已经使用OpenCV的inRange方法成功地分割了图像中的所有柠檬,但是,图像中有一堆柠檬,它们重叠,因此,在分割的遮罩中,所有柠檬都相互连接。我试着腐蚀面具,但在最终的图像中,一些斑点完全消失了。这是我使用的代码,原始图像,分段遮罩和腐蚀遮罩。有没有办法把所有相连的柠檬分开数一数?任何帮助都将不胜感激 img = cv2.imread('lemon1.jpg') hsv = cv2.cvtColor(img, cv2.COLOR

我有一个任务,我必须分割图像中的所有柠檬,并对它们进行计数,我已经使用OpenCV的inRange方法成功地分割了图像中的所有柠檬,但是,图像中有一堆柠檬,它们重叠,因此,在分割的遮罩中,所有柠檬都相互连接。我试着腐蚀面具,但在最终的图像中,一些斑点完全消失了。这是我使用的代码,原始图像,分段遮罩和腐蚀遮罩。有没有办法把所有相连的柠檬分开数一数?任何帮助都将不胜感激

img = cv2.imread('lemon1.jpg')

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_green = np.array([20,50,50])
upper_green = np.array([80,255,255])

mask = cv2.inRange(hsv, lower_green, upper_green)

kernel = np.ones((5,5), np.uint8)
eroded = cv2.erode(mask, kernel, iterations=2)

我认为您可以尝试使用边缘检测,而不是对图像进行二值阈值化,在该代码中,您不会得到任何斑点,而是图片中每个柠檬的角线。当然,你仍然需要清理边缘检测结果,但它应该给你一个良好的开端。谢谢@ZdaR的建议。我在考虑同样的边缘检测,然后计算它们。你能建议什么样的边缘检测方法最适合这种问题吗?我认为你可以尝试边缘检测,而不是对图像进行二值阈值处理,在这种代码中,你不会得到任何斑点,而是图片中每个柠檬的角线。当然,你仍然需要清理边缘检测结果,但它应该给你一个良好的开端。谢谢@ZdaR的建议。我在考虑同样的边缘检测,然后计算它们。你能建议哪种边缘检测方法最适合这种问题吗?