如何使用 OpenCV 进行图像分割

如何使用 OpenCV 进行图像分割 Mrs Wu 2023-09-11 18:04:33 259

易百纳社区

什么是图像分割?

图像分割是将数字图像划分互不相交的区域的过程,它可以降低图像的复杂性,从而使分析图像变得更简单。

分割在实际应用中的使用

在癌细胞检测系统中可以看到独特而著名的应用之一,其中图像分割被证明在从图像中更快地检测疾病组织和细胞方面发挥了关键作用,从而使医生能够提供及时的治疗。

制造制业现在高度依赖于图像识别技术来检测人眼所忽略掉的异常,因此增加了产品的效率。

图像分割技术

我们有以下图像分割技术:


  1. 阈值法
  2. 基于边缘的分割
  3. 基于区域的分割
  4. 基于聚类的分割
  5. 基于分水岭的方法
  6. 基于人工神经网络的分割

易百纳社区

不同技术之间的比较

在这里,我们选择了基于聚类的分割。

基于聚类的分割方法

与分类算法不同,聚类算法是无监督算法。在分类算法中,用户没有预定义的一组特征、类或组。聚类算法有助于从数据中获取潜在的、隐藏的信息,例如从启发式的角度来看通常是未知的结构、聚类和分组。

基于聚类的技术将图像分割成具有相似特征的集群或不相交的像素组。凭借基本的数据聚类特性,数据元素被分割成集群,使得同一集群中的元素与其他集群相比更加相似。一些更有效的聚类算法,如 k 均值、改进的 k 均值、模糊 c 均值 (FCM) 和改进的模糊 c 均值算法 (IFCM) 被广泛用于所提出的基于聚类的方法中。

K 均值聚类算法是一种精选的、流行的方法,因为它的简单性和计算效率。改进的 K 均值算法可以最小化 k 均值算法中通常涉及的迭代次数。

由于某些相似性,集群指的是聚合在一起的数据点集合。对于图像分割,这里的集群是不同的图像颜色。

代码实现

导入库

易百纳社区

加载输入图像并在 OpenCV 上进行处理

易百纳社区

执行分段的步骤:

  • 将图像转换为RGB格式
  • 将图像重塑为由像素和 3 个颜色值 (RGB) 组成的二维数组
  • cv2.kmeans() 函数将二维数组作为输入,因此我们必须将图像展平
  • 定义集群形成的停止标准
  • 转换回原始图像形状并显示分割后的图像

K均值是最简单的无监督学习算法之一,通常可以解决聚类问题。该过程遵循一种简单易行的方法,通过一定数量的先验固定的集群对给定图像进行分类。

该算法实际上从图像空间被划分为 k 个像素的开始,表示 k 个组质心。然后根据每个对象与集群的距离将其分配给该组,当所有像素都分配给所有集群时,质心现在移动并重新分配。重复这些步骤,直到质心不再移动。

在该算法收敛时,我们将图像中的区域分割为“K”组,其中组成像素显示出一定程度的相似性。

易百纳社区

了解OpenCV中 K 均值聚类的参数

输入参数

  1. samples:它应该是np.float32数据类型,每个特征应该放在一个列中。
  2. nclusters(K) : 结束时所需的集群数量。
  3. criteria:它是迭代终止标准。当满足此条件时,算法迭代停止。实际上,它应该是一个包含 3 个参数的元组,它们是"( type, max_iter, epsilon )"。

a.终止标准的类型,它有 3 个标志,如下所示:

  • cv.TERM_CRITERIA_EPS — 如果达到指定的精度epsilon,则停止算法迭代。
  • cv.TERM_CRITERIA_MAX_ITER — 在指定的迭代次数max_iter后停止算法。
  • cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER — 当满足上述任何条件时停止迭代。

b.max_iter — 指定最大迭代次数的整数。

c.epsilon - 所需的准确性。

  1. attempts :标记以指定使用不同的初始标签执行算法的次数。该算法返回产生最 佳紧凑性的标签,这种紧凑性作为输出返回。
  2. flags:此标志用于指定初始中心的使用方式。通常使用两个标志:cv.KMEANS_PP_CENTERS和cv.KMEANS_RANDOM_CENTERS。

输出参数

  1. compactness :它是每个点到其相应中心的距离平方和。
  2. labels :这是标签数组,其中每个元素都标记为“0”、“1”……
  3. centers:这是一系列集群中心。

易百纳社区

在这里,当我们看到图像时,有三种主要颜色(绿色代表树木,蓝色代表海洋/湖泊,白色到橙色代表天空),所以我们考虑集群的数量为 3。

因此,我们将为这张图片使用三个集群

  • 标签存储每个像素的集群标签(0/1/2)。
  • 中心存储到集群的中心点。
  • cv2.KMEANS_RANDOM_CENTERS 只是指示 OpenCV 最初随机分配集群的值。

构建分割后的图像

  • 将所有像素转换为质心的颜色
  • 重塑回原始图像尺寸
  • 显示图像

易百纳社区

易百纳社区

禁用某些集群以可视化它们所代表的段。

易百纳社区

输出:

易百纳社区

集群 1 表示绿色,因为禁用集群 1 或将其设为黑色在图像中很明显

类似地尝试将要分割的集群的数量分割为8并可视化图像

易百纳社区

输出:

易百纳社区

与每个集群关联的计数

易百纳社区

禁用集群 4,为代表段 4 的像素分配黑色

输出:

易百纳社区

同样禁用集群 2

易百纳社区

基于聚类的 ML 算法的巨大价值在于我们可以通过使用多个统计参数来衡量生成的片段的质量,例如:轮廓系数、兰德指数 (RI) 等。

结论:

图像分割是一组很有前景的技能,因为它在医学成像中发挥着重要作用,并且各种组织正在努力建立一个有效的医学图像主动诊断系统。

图像处理一般以各种编程语言实现——Java、matplotlib、C++ 等。Python 库像scikit-image、OpenCV、Mahotas、Pillow、matplotlib、SimplelTK 等,被广泛用于实现图像处理,尤其是图像分割。

使用 Python 实现图像分割是广受欢迎的技能,并且有很多相关的培训可供使用。使用 python 库是一种更简单的实现方式,它在使用之前不需要任何复杂的要求——当然除了 Python 编程和 Pandas 的基本知识。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
Mrs Wu
红包 2 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
Mrs Wu
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区