PlantVillage数据集中的番茄叶图像分割问题

时间:2019-02-16 12:37:29

标签: opencv image-processing image-segmentation

我正在尝试对番茄作物的叶子图像进行分割。我想转换如下图像

enter image description here

跟随黑色背景的图像

enter image description here

我从Github引用了此代码

但是在这个问题上做得不好,它做了类似的事情enter image description here

有人可以建议我这样做吗?

2 个答案:

答案 0 :(得分:2)

可以使用HSV-色彩空间分离图像。背景的饱和度很小,因此对饱和度进行阈值处理可消除灰色。

结果:

enter image description here

代码:

import numpy as np 
import cv2
# load image
image = cv2.imread('leaf.jpg')
# create hsv
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
 # set lower and upper color limits
low_val = (0,60,0)
high_val = (179,255,255)
# Threshold the HSV image 
mask = cv2.inRange(hsv, low_val,high_val)
# remove noise
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel=np.ones((8,8),dtype=np.uint8))
# apply mask to original image
result = cv2.bitwise_and(image, image,mask=mask)

#show image
cv2.imshow("Result", result)
cv2.imshow("Mask", mask)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

答案 1 :(得分:0)

图像的问题是叶子的颜色不同。如果将图像转换为灰度,将看到二值化算法的问题:

grayscale image

您注意到叶子的下半部和上半部的亮度有很大不同吗?这为您提供了图像的三个大致均匀的明亮区域:实际背景,上半叶和下半叶。这对二值化不利。

但是,您可以通过将彩色图像分成各自的通道来解决问题。分离后,您会注意到在蓝色通道中,叶子看起来非常均匀地明亮:

blue channel of image

如果我们考虑所谈论的颜色,这是有道理的:绿色和黄色中都有非常少量的蓝色(如果有)。 这使我们很容易将其二值化。为了使图像更清晰,我首先应用了平滑

Smoothed blue channel

,然后使用ImageJ的iso_data阈值(但是,您可以使用任何可用的现有自动阈值方法)来创建二进制掩码:

binarized image

由于算法已将叶子设置为背景(黑色),因此我们必须将其反转:

inverted mask

可以通过应用二进制“填充孔”算法进一步改善此蒙版:

mask with filled holes

此蒙版可用于裁剪原始图像以提取叶子:

extracted leaf

通过稍微腐蚀掩模可以进一步提高结果图像的质量。

出于完整性考虑:您不必使图像平滑就可以得到结果。这是未平滑图像的遮罩:

unsmoothed mask

要消除噪声,请先应用二进制填充孔,然后进行二进制封闭,然后进行二进制腐蚀。这会给你:

mask2

作为面具。

这将导致

result image 2