通过聚类进行图像分割
简介
图像分割是根据原始图像中像素的特征将图像划分为多个区域的过程。聚类是一种将相似实体分组并标记它们的技术。因此,对于使用聚类的图像分割,我们可以使用聚类算法对相似像素进行聚类,并将特定聚类像素分组为单个片段。
因此,让我们探索更多使用聚类的图像分割,
图像分割
使用聚类进行图像分割的过程可以使用两种方法进行。
凝聚聚类
分裂聚类
在凝聚聚类中,我们将像素标记为一个接近的聚类,然后迭代地增加聚类的大小。以下步骤概述了凝聚聚类的过程。
每个像素都被视为一个单独的簇
合并簇间距离 (WCSS) 较小的类似簇。
重复这些步骤。
在分裂聚类中,遵循以下过程。
所有像素都分配给一个簇。
在某些时期内,簇被分成两个簇间距离较大的簇。
重复这些步骤,直到达到最佳簇数。
在本文中,我们将探索用于图像分割的 K-Means 聚类。
K-Means图像分割的聚类
K-M 均值是一种聚集类型的聚类,我们事先没有像素/数据点的标签。形成的簇或组的数量取为 K。这些簇是根据像素或数据点之间的一些相似或共同特征得出的。
K-Means 聚类所涉及的步骤是
选择特定的 K 值
在每个像素中获取一个特征,如 RGB 值等。
使用距离(如欧几里得距离)对相似像素进行分组。
K-Means 与簇的中心一起使用。
通常,会定义一个阈值,如果计算的大小在该阈值内,则将其分组为单个簇。
如何确定 K 的值?
K-Means 算法的目标函数是 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-Means 聚类进行图像分割的应用
自动驾驶汽车 - 在设计自动驾驶汽车感知系统时,语义分割用于将汽车附近的物体与周围环境分开。
医学领域的成像 - 使用聚类分离和识别癌细胞图像中的组织类型。
3-D 场景分割 - 在机器人视觉技术中,系统需要识别周围环境并定位物体。生成的场景本质上是 3D 的。为此目的使用聚类算法。
结论
聚类是一种非常流行且有效的图像分割技术。它可以节省宝贵的时间,同时为大多数用例产生惊人的结果。在这方面,K-Means 聚类是赢家。