基于聚类的图像分割
引言
图像分割是根据原始图像中像素的特征将图像划分成多个区域的过程。聚类是一种对相似实体进行分组并标记的技术。因此,对于使用聚类的图像分割,我们可以使用聚类算法对相似像素进行聚类,并将特定聚类的像素分组为单个分割。
因此,让我们进一步探讨使用聚类的图像分割。
图像分割
使用聚类的图像分割过程可以使用两种方法进行。
凝聚聚类
分裂聚类
在凝聚聚类中,我们将像素标记到一个较近的簇,然后迭代地增加簇的大小。以下步骤概述了凝聚聚类过程。
每个像素都被认为是一个独立的簇。
具有较小簇间距离 (WCSS) 的相似簇被合并。
重复这些步骤。
在分裂聚类中,遵循以下过程。
所有像素都被分配到单个簇中。
该簇被分成两个簇,在一些时期内具有较大的簇间距离。
重复这些步骤,直到达到最佳簇数。
在本文中,我们将探讨用于图像分割的 K 均值聚类。
用于图像分割的 K 均值聚类
K 均值是一种凝聚类型的聚类,我们事先没有像素/数据点的标签。形成的簇或组的数量取为 K。这些簇是基于像素或数据点之间的一些相似或共同特征导出的。
K 均值聚类涉及的步骤是:
选择一个特定的 K 值。
在每个像素中取一个特征,例如 RGB 值等。
使用欧几里得距离等距离对相似像素进行分组。
K 均值用于簇的中心。
通常,定义一个阈值,如果计算出的尺寸落在该阈值内,则将其分组到单个簇中。
如何确定 K 值?
K 均值算法的目标函数是 WCSS。
$$\mathrm{C=\sum ^{M}_{i=1}} \:\:\mathrm{\sum ^{N}_{k=1}}\:\:\mathrm{|x^{i}_{k}-C_{i}|^{2}}$$
在 WCSS 和 K 之间绘制一个图表,通常称为肘部方法。记下图表急剧弯曲的点,并取相应的 K 值。K 的确定是使用肘部方法完成的,这是一种相当蛮力的方法。
Python 实现
示例
# KMEANS IMAGE SEGMENATION import numpy as np import cv2 import matplotlib.pyplot as plt from sklearn.cluster import KMeans %matplotlib inline image_1 = cv2.imread("/content/image_1.jpg", cv2.IMREAD_UNCHANGED) image_2 = cv2.imread("/content/image_2.jpg", cv2.IMREAD_UNCHANGED) vector_1 = image_1.reshape((-1,3)) vector_2 = image_2.reshape((-1,3)) kmeans_1 = KMeans(n_clusters=5, random_state = 0, n_init=5).fit(vector_1) c = np.uint8(kmeans_1.cluster_centers_) seg_data= c[kmeans_1.labels_.flatten()] seg_image = seg_data.reshape((image_1.shape)) plt.imshow(seg_image) plt.pause(1) kmeans_2 = KMeans(n_clusters=5, random_state = 0, n_init=5).fit(vector_2) c = np.uint8(kmeans_2.cluster_centers_) seg_data= c[kmeans_2.labels_.flatten()] seg_image = seg_data.reshape((image_2.shape)) plt.imshow(seg_image) plt.pause(1)
输出
使用 K 均值聚类的图像分割的应用
自动驾驶汽车 - 在设计自动驾驶汽车的感知系统期间,语义分割用于将汽车周围环境中的物体与周围环境分开。
医学成像 - 聚类用于分离和识别癌细胞图像中的组织类型。
3D 场景分割 - 在机器人视觉技术中,系统需要识别周围环境并定位物体。生成的场景本质上是 3D 的。为此目的使用聚类算法。
结论
聚类是一种非常流行且有效的图像分割技术。它可以节省宝贵的时间,同时为大多数用例产生惊人的结果。在这方面,K 均值聚类是赢家。