使用 OpenCV 进行图像分割
共 3073字,需浏览 7分钟
·
2021-10-13 19:04
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
图像分割是将数字图像划分互不相交的区域的过程,它可以降低图像的复杂性,从而使分析图像变得更简单。
在癌细胞检测系统中可以看到独特而著名的应用之一,其中图像分割被证明在从图像中更快地检测疾病组织和细胞方面发挥了关键作用,从而使医生能够提供及时的治疗。
制造制业现在高度依赖于图像识别技术来检测人眼所忽略掉的异常,因此增加了产品的效率。
我们有以下图像分割技术:
阈值法
基于边缘的分割
基于区域的分割
基于聚类的分割
基于分水岭的方法
基于人工神经网络的分割
不同技术之间的比较
在这里,我们选择了基于聚类的分割。
与分类算法不同,聚类算法是无监督算法。在分类算法中,用户没有预定义的一组特征、类或组。聚类算法有助于从数据中获取潜在的、隐藏的信息,例如从启发式的角度来看通常是未知的结构、聚类和分组。
基于聚类的技术将图像分割成具有相似特征的集群或不相交的像素组。凭借基本的数据聚类特性,数据元素被分割成集群,使得同一集群中的元素与其他集群相比更加相似。一些更有效的聚类算法,如 k 均值、改进的 k 均值、模糊 c 均值 (FCM) 和改进的模糊 c 均值算法 (IFCM) 被广泛用于所提出的基于聚类的方法中。
K 均值聚类算法是一种精选的、流行的方法,因为它的简单性和计算效率。改进的 K 均值算法可以最小化 k 均值算法中通常涉及的迭代次数。
由于某些相似性,集群指的是聚合在一起的数据点集合。对于图像分割,这里的集群是不同的图像颜色。
导入库
加载输入图像并在 OpenCV 上进行处理
执行分段的步骤:
将图像转换为RGB格式
将图像重塑为由像素和 3 个颜色值 (RGB) 组成的二维数组
cv2.kmeans() 函数将二维数组作为输入,因此我们必须将图像展平
定义集群形成的停止标准
转换回原始图像形状并显示分割后的图像
K均值是最简单的无监督学习算法之一,通常可以解决聚类问题。该过程遵循一种简单易行的方法,通过一定数量的先验固定的集群对给定图像进行分类。
该算法实际上从图像空间被划分为 k 个像素的开始,表示 k 个组质心。然后根据每个对象与集群的距离将其分配给该组,当所有像素都分配给所有集群时,质心现在移动并重新分配。重复这些步骤,直到质心不再移动。
在该算法收敛时,我们将图像中的区域分割为“K”组,其中组成像素显示出一定程度的相似性。
输入参数
samples:它应该是np.float32数据类型,每个特征应该放在一个列中。
nclusters(K) : 结束时所需的集群数量。
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 - 所需的准确性。
attempts :标记以指定使用不同的初始标签执行算法的次数。该算法返回产生最佳紧凑性的标签,这种紧凑性作为输出返回。
flags:此标志用于指定初始中心的使用方式。通常使用两个标志:cv.KMEANS_PP_CENTERS和cv.KMEANS_RANDOM_CENTERS。
compactness :它是每个点到其相应中心的距离平方和。
labels :这是标签数组,其中每个元素都标记为“0”、“1”……
centers:这是一系列集群中心。
在这里,当我们看到图像时,有三种主要颜色(绿色代表树木,蓝色代表海洋/湖泊,白色到橙色代表天空),所以我们考虑集群的数量为 3。
因此,我们将为这张图片使用三个集群
标签存储每个像素的集群标签(0/1/2)。
中心存储到集群的中心点。
cv2.KMEANS_RANDOM_CENTERS 只是指示 OpenCV 最初随机分配集群的值。
构建分割后的图像
将所有像素转换为质心的颜色
重塑回原始图像尺寸
显示图像
禁用某些集群以可视化它们所代表的段。
输出:
集群 1 表示绿色,因为禁用集群 1 或将其设为黑色在图像中很明显
类似地尝试将要分割的集群的数量分割为8并可视化图像
输出:
与每个集群关联的计数
输出:
同样禁用集群 2
基于聚类的 ML 算法的巨大价值在于我们可以通过使用多个统计参数来衡量生成的片段的质量,例如:轮廓系数、兰德指数 (RI) 等。
图像分割是一组很有前景的技能,因为它在医学成像中发挥着重要作用,并且各种组织正在努力建立一个有效的医学图像主动诊断系统。
图像处理一般以各种编程语言实现——Java、matplotlib、C++ 等。Python 库像scikit-image、OpenCV、Mahotas、Pillow、matplotlib、SimplelTK 等,被广泛用于实现图像处理,尤其是图像分割。
使用 Python 实现图像分割是广受欢迎的技能,并且有很多相关的培训可供使用。使用 python 库是一种更简单的实现方式,它在使用之前不需要任何复杂的要求——当然除了 Python 编程和 Pandas 的基本知识。
好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~