python 图像分割实例_使用Python进行图像分割和对象计数实例

让我们以一个简单的场景为例,在该场景中我们有一个柠檬图像,我们想要对其中的柠檬进行分割和计数。

图像分割算法有分水岭算法、斑点计数算法、霍夫圆/椭圆算法、轮廓检测算法等。在本文中,我使用了轮廓检测和分水岭算法。

涉及的步骤:

读取图像

转换为HSV

阈值

模糊它

删除多余/不需要的区域

在原始图像上绘制轮廓

使用分水岭来检测分离轮廓

进行平均分水岭和轮廓检测以获得满意的结果。

首先,我们导入一些常见的Python依赖项。

from __future__ import print_function

import numpy as np

import cv2

import matplotlib.pyplot as plt

%matplotlib inline

from skimage import io

from skimage.morphology import watershed

from skimage.feature import peak_local_max

from scipy import ndimage

我们创建一个Python函数以可视化图像。Python代码如下:

def show(img):

plt.imshow(img)

plt.show()

现在,我们读取图像。

#load

fp = "lemons1.jpg"

img = cv2.imread(fp)

show(img)

print(img.shape)

现在,我们对图像进行预处理。步骤包括:

HSV,这是人眼感知的颜色模型。

阈值技术,通过选定的阈值像素强度将图像转换为二值图像(即只有2个像素值(0或255))。

模糊图像,以删除图像中不必要的斑点。

#preprocessing the image

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

show(hsv)

h, s, v = cv2.split(hsv)

show(s)

_, thr = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

show(thr)

blur = cv2.medianBlur(thr, 5)

show(blur)

现在我们使用轮廓检测,在我们“模糊”的图像中找到柠檬。为了去除小的和无关紧要的轮廓,我们只选择那些面积大于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))

现在我们使用分水岭算法来分离相互接触的柠檬(如果有的话)。

copy3 = img.copy()

D = ndimage.distance_transform_edt(thr)

localMax = peak_local_max(D, indices=False, min_distance=70,

labels=thr)

markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]

labels = watershed(-D, markers, mask=thr)

ws = len(np.unique(labels)) -1

copy3[labels == -1] = [255,0,0]

print("no. of lemons found via watershed algorithm = ", ws)

最后我们取两种方法的平均值并打印结果。

ans = int((len(count) + len(np.unique(labels)) -1) / 2)

print("number of lemon segments detected = ", ans)

show(copy2)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值