python - 如何从图像中去除背景以有效应用 k 均值聚类

标签 python opencv image-processing machine-learning computer-vision

我正在开展一个对叶子疾病进行分类的项目。我正在尝试应用 k 均值聚类,以便将患病区域聚类在一起,然后我可以从该聚类区域中提取特征。但是,由于背景的原因,我无法正确聚类,因为患病区域与背景聚类。

我的目标是对病变区域进行聚类,然后从病变区域提取特征来训练分类器。

方法 1 - 我尝试在叶子周围绘制轮廓,然后使用 OpenCV 中的最小面积矩形函数绘制一个矩形,随后,我可以裁剪,但轮廓不够精细,无法去除背景。

下面是代码:

lower_green = np.array((60-s,100,50))
upper_green = np.array((60+s,255,255))
name = "Apple_healthy/image_85.jpg"
bgr = cv2.imread(name)
hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_green, upper_green)
mask = cv2.dilate(mask, None, iterations=50)
_, contours, hier =   cv2.findContours(mask.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
mask = cv2.bitwise_not(mask)
cnt = contours[-1]
cv2.drawContours(bgr,[cnt],0,(0,0,255), 2)
cv2.imshow('image', bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(bgr,[box],0,(0,0,255),2)
cv2.imshow('sad',bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

Output of approach-1

方法 2 - 直接对图像应用k均值聚类。但在这种方法中,我无法将患病区域聚集在一起,因为患病区域与背景聚集在一起。下面是代码:

img = cv2.imread('Apple_black_rot/image_85.jpg')

Z = img.reshape((-1,3))

# convert to np.float32
Z = np.float32(Z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 16
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))

cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Output of approach-2

原始图像

Original Image

最佳答案

患病区域有明显的色调。您可以提取色调分量(从 HSV 系统)并获取灰度图像,从该图像中分割应该不成问题,除了沿着阴影边缘(参见图片)。但阴影也很容易被检测到,并且您可以中和该区域。

enter image description here

enter image description here

关于python - 如何从图像中去除背景以有效应用 k 均值聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43725834/

相关文章:

python - 如何加快编程的计算速度?

python - 带有 TensorFlow 后端的 Keras 的自定义损失函数问题

C++ 没有 [] 的匹配构造函数初始化

python - 将图像分为径向部分并选择单个部分中的值

python - numpy 与 python : convert 3d array to 2d

python - 在python opencv中获取强度为255的二进制图像的像素位置

python - 将列表转换为命名元组

python - `setup.cfg` 是否已弃用?

c++ - 在 OpenCV 中将一些行从一个矩阵复制到另一个矩阵的最快方法

image-processing - OpenCV perspectiveTransform正确的目标宽度和高度?