让我们以一个简单的场景为例,在该场景中我们有一个柠檬图像,我们想要对其中的柠檬进行分割和计数。 图像分割算法有分水岭算法、斑点计数算法、霍夫圆/椭圆算法、轮廓检测算法等。在本文中,我使用了轮廓检测和分水岭算法。 涉及的步骤:
首先,我们导入一些常见的Python依赖项。 from __future__ import print_functionimport numpy as npimport cv2import matplotlib.pyplot as plt%matplotlib inlinefrom skimage import iofrom skimage.morphology import watershedfrom skimage.feature import peak_local_maxfrom scipy import ndimage 我们创建一个Python函数以可视化图像。Python代码如下:
现在,我们读取图像。 #loadfp = 'lemons1.jpg'img = cv2.imread(fp)show(img)print(img.shape) 现在,我们对图像进行预处理。步骤包括:
现在我们使用轮廓检测,在我们“模糊”的图像中找到柠檬。为了去除小的和无关紧要的轮廓,我们只选择那些面积大于2000的轮廓(任意值,是超参数)。 contours, hierarchy = cv2.findContours(blur,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)copy2 = img.copy()count = []for x in contours: area = cv2.contourArea(x) if area > 2000 : count.append(x)cv2.drawContours(copy2, count, -1, (255,0,0), 3)show(copy2)print('number of lemons found via contour detection = ', len(count)) 现在我们使用分水岭算法来分离相互接触的柠檬(如果有的话)。
最后我们取两种方法的平均值并打印结果。 ans = int((len(count) + len(np.unique(labels)) -1) / 2)print('number of lemon segments detected = ', ans)show(copy2) |
|
来自: taotao_2016 > 《图像处理》