????????本節我們分享點云處理中的三種常見聚類方法,分別是K-means、歐氏與 DBSCAN聚類。具體介紹如下:
1. K-means 聚類
????????定義:一種基于距離度量的無監督學習算法,將數據劃分為 K 個緊湊的簇,使簇內數據相似度高、簇間差異大。
????????算法流程:
1)初始化:隨機選取 K 個點作為初始質心。
2)分配:計算每個樣本到質心的歐氏距離,將其歸入最近簇。
3)更新:重新計算各簇的質心(簇內樣本的均值)。
4)迭代:重復步驟 2-3,直至質心不變或達到最大迭代次數。????????特點:計算高效、收斂快,但對初始質心敏感,僅適用于凸形簇。
????????典型應用:圖像分割、客戶分群、模式識別。
2. 歐氏聚類(基于歐氏距離的密度聚類)
????????定義:通過歐氏距離閾值(eps)和最小鄰居數(min_points)分割點云數據,識別密集區域。
????????算法流程:
1)初始化:所有點標記為未訪問。
2)擴展簇:
- 任選未訪問點,檢索其 eps 鄰域內的所有點(含自身)。
- 若鄰居數 ≥ min_points,則標記為新簇,并遞歸檢查鄰居的鄰居。
3)終止:所有點被訪問后,孤立點(鄰居數 < min_points)標記為噪聲。????????特點:無需預設簇數,可識別任意形狀簇,但對參數(eps、min_points)敏感。
????????典型應用:
三維點云分割:如建筑掃描中分離房間或自動駕駛中區分車輛/行人。
噪聲過濾:剔除孤立點或小簇,提升數據質量。3. DBSCAN 聚類(Density-Based Spatial Clustering of Applications with Noise)
????????定義:基于密度的聚類算法,可發現任意形狀簇并自動標記噪聲。
????????核心概念:
1)核心點:某點的 ε 鄰域內至少包含 min_points個點。
2)密度直達:若點 q 在核心點 p 的 ε 鄰域內,則 q 從 p 密度直達。
3)密度可達:若存在點鏈使相鄰點滿足密度直達關系,則鏈首尾兩點密度可達。
4)聚類形成:從任一核心點出發,遞歸合并所有密度可達的點,形成簇。
5)噪聲點:未被任何簇包含的點。????????特點:抗噪聲、無需預設簇數,但對高維數據性能下降。
總結對比
算法 | 核心思想 | 形狀適應性 | 噪聲處理 | 參數需求 |
K-means | 距離優化(質心迭代) | 凸形簇 | 無 | 需預設簇數 K |
歐氏聚類 | 密度閾值(eps + min_points) | 任意形狀 | 標記噪聲 | 需調參 eps/min_points |
DBSCAN | 密度可達性 | 任意形狀 | 自動識別噪聲 | 需調參 ε/min_points |
本次使用的數據依然是我們的兔砸!!!!!!!!(破音)
一、Kmeans、歐式和DBSCAN聚類程序
from moviepy.editor import VideoFileClip
import os
import math
import subprocessdef mp4_to_gif(src_file, target_file):# 使用VideoFileClip加載MP4文件video_clip = VideoFileClip(src_file)# 調整視頻的尺寸,如果需要的話video_size_w = math.ceil(video_clip.size[0] / 0.9)video_size_h = math.ceil(video_clip.size[1] / 0.9)video_clip = video_clip.resize((video_size_w, video_size_h))# 將視頻轉換為GIFvideo_clip.write_gif(target_file, fps=10) # 設置幀率,可以根據需要調整# 關閉視頻剪輯對象video_clip.close()def shrink_gif(file):# subprocess.run(["D:/gifsicle/gifsicle.exe", "-b", "-O2", "--lossy=40", "--colors=256", file])subprocess.run(["D:/gif_ya_suo/gifsicle-1.95-win64/gifsicle.exe","-b", "-O2", "--lossy=40","--colors=256", file])# video_path = 'E:/CSDN/視頻/1_點云讀寫/隨機顏色_1.mp4'
# target_folder = 'E:/CSDN/視頻/1_點云讀寫/隨機顏色_1.gif'original_folder = 'E:/CSDN/視頻/23_Kmeans+ou+DBSCAN聚類/1'
target_folder = original_folder
for filename in os.listdir(original_folder):# 檢查文件名是否包含舊字符串if '.mp4' in filename:src_filepath = os.path.join(original_folder, filename)target_filepath = os.path.join(target_folder, filename.replace('mp4', 'gif'))print(src_filepath)mp4_to_gif(src_filepath, target_filepath) # 將mp4轉為gifshrink_gif(target_filepath) # 壓縮gif# break
print("All files done.")
????????記得運行上述程序是需要安裝庫的哦,不是程序里面的sklearn,是scikit-learn。不知道怎么安裝的同學可以看往期的分享,這里就不著重說了。
pip install scikit-learn
二、Kmeans、歐式和DBSCAN聚類結果
????????從結果來看,三個兔砸可以正常的分割。換其他點云的時候記得調節參數啊,前面表格里有詳細的說明。就醬,下次見^-^