m0_58201830 2021-06-01 12:20 采纳率: 0%
浏览 742

用python实现对图片中物体进行分割和计数

刚开始学习python,需要完成一个作业,对下面这张图中的小球进行分割和计数,但是我实在是搞不懂,希望各位老师能帮我看看,谢谢!

图片:

 

  • 写回答

2条回答 默认 最新

  • 小P聊技术 2021-06-01 13:22
    关注

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

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

    涉及的步骤:

    读取图像

    转换为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)

    评论

报告相同问题?

悬赏问题

  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,