PlantVillage 数据集中番茄叶图像的分割问题
Segmentation problem for tomato leaf images in PlantVillage Dataset
我正在尝试对番茄作物的叶子图像进行分割。我想像下图那样转换图像
下图为黑底
我从 Github
引用了这段代码
但它在这个问题上做得不好,它做了这样的事情
任何人都可以建议我一个方法吗?
你的图片有问题是叶子的颜色不同。如果将图像转换为灰度,您将看到二值化算法的问题:
你注意到叶子的下半部分和上半部分的亮度有很大不同吗?这为您提供了图像的三个几乎均匀明亮的区域:实际背景、上半部分叶子和下半部分叶子。这对二值化不利。
但是,您的问题可以通过将彩色图像分离到各自的通道来解决。分离后,你会注意到在蓝色通道中,叶子看起来非常均匀明亮:
如果我们考虑我们正在谈论的颜色,这是有道理的:绿色和黄色都含有非常少量的蓝色(如果有的话)。
这使我们很容易将其二值化。为了更清晰的图像,我首先应用平滑
然后使用 ImageJ 的 iso_data 阈值(但是您可以使用任何可用的现有自动阈值方法)来创建二进制掩码:
因为算法已将叶子设置为背景(黑色),我们必须将其反转:
可以通过应用二进制 "fill holes" 算法进一步改进此掩码:
此蒙版可用于裁剪原始图像以提取叶子:
结果图像的质量可以通过稍微腐蚀掩模来进一步提高。
为了完整起见:您不必对图像进行平滑处理即可获得结果。这是未平滑图像的蒙版:
要消除噪声,首先应用二元填充孔,然后二元闭合,然后二元腐蚀。这会给你:
作为面具。
这将导致
图像可以使用 HSV-colorspace 分离。背景几乎没有饱和度,因此对饱和度进行阈值处理可以去除灰色。
结果:
代码:
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()
我正在尝试对番茄作物的叶子图像进行分割。我想像下图那样转换图像
下图为黑底
我从 Github
引用了这段代码但它在这个问题上做得不好,它做了这样的事情
任何人都可以建议我一个方法吗?
你的图片有问题是叶子的颜色不同。如果将图像转换为灰度,您将看到二值化算法的问题:
你注意到叶子的下半部分和上半部分的亮度有很大不同吗?这为您提供了图像的三个几乎均匀明亮的区域:实际背景、上半部分叶子和下半部分叶子。这对二值化不利。
但是,您的问题可以通过将彩色图像分离到各自的通道来解决。分离后,你会注意到在蓝色通道中,叶子看起来非常均匀明亮:
如果我们考虑我们正在谈论的颜色,这是有道理的:绿色和黄色都含有非常少量的蓝色(如果有的话)。 这使我们很容易将其二值化。为了更清晰的图像,我首先应用平滑
然后使用 ImageJ 的 iso_data 阈值(但是您可以使用任何可用的现有自动阈值方法)来创建二进制掩码:
因为算法已将叶子设置为背景(黑色),我们必须将其反转:
可以通过应用二进制 "fill holes" 算法进一步改进此掩码:
此蒙版可用于裁剪原始图像以提取叶子:
结果图像的质量可以通过稍微腐蚀掩模来进一步提高。
为了完整起见:您不必对图像进行平滑处理即可获得结果。这是未平滑图像的蒙版:
要消除噪声,首先应用二元填充孔,然后二元闭合,然后二元腐蚀。这会给你:
作为面具。
这将导致
图像可以使用 HSV-colorspace 分离。背景几乎没有饱和度,因此对饱和度进行阈值处理可以去除灰色。
结果:
代码:
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()