答案 0 :(得分:2)
可以使用HSV-色彩空间分离图像。背景的饱和度很小,因此对饱和度进行阈值处理可消除灰色。
结果:
代码:
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)
图像的问题是叶子的颜色不同。如果将图像转换为灰度,将看到二值化算法的问题:
您注意到叶子的下半部和上半部的亮度有很大不同吗?这为您提供了图像的三个大致均匀的明亮区域:实际背景,上半叶和下半叶。这对二值化不利。
但是,您可以通过将彩色图像分成各自的通道来解决问题。分离后,您会注意到在蓝色通道中,叶子看起来非常均匀地明亮:
如果我们考虑所谈论的颜色,这是有道理的:绿色和黄色中都有非常少量的蓝色(如果有)。 这使我们很容易将其二值化。为了使图像更清晰,我首先应用了平滑
,然后使用ImageJ的iso_data阈值(但是,您可以使用任何可用的现有自动阈值方法)来创建二进制掩码:
由于算法已将叶子设置为背景(黑色),因此我们必须将其反转:
可以通过应用二进制“填充孔”算法进一步改善此蒙版:
此蒙版可用于裁剪原始图像以提取叶子:
通过稍微腐蚀掩模可以进一步提高结果图像的质量。
出于完整性考虑:您不必使图像平滑就可以得到结果。这是未平滑图像的遮罩:
要消除噪声,请先应用二进制填充孔,然后进行二进制封闭,然后进行二进制腐蚀。这会给你:
作为面具。
这将导致