基於聚類的影像分割
引言
影像分割是根據原始影像中畫素的特徵將影像劃分成多個區域的過程。聚類是一種對相似實體進行分組並標記的技術。因此,對於使用聚類的影像分割,我們可以使用聚類演算法對相似畫素進行聚類,並將特定聚類的畫素分組為單個分割。
因此,讓我們進一步探討使用聚類的影像分割。
影像分割
使用聚類的影像分割過程可以使用兩種方法進行。
凝聚聚類
分裂聚類
在凝聚聚類中,我們將畫素標記到一個較近的簇,然後迭代地增加簇的大小。以下步驟概述了凝聚聚類過程。
每個畫素都被認為是一個獨立的簇。
具有較小簇間距離 (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 均值聚類是贏家。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP