1. Mean Shift 簡介
Mean Shift 是一種聚類算法,通過尋找圖像中顏色相似的區域來實現分割。它非常適合用于場景分割或物體檢測等任務。本教程將它與 Canny 邊緣檢測結合,突出分割區域的邊界。
2. 圖像分割流程
我們將按照以下步驟完成圖像分割和邊緣檢測:
- 加載圖像:讀取一張原始圖像。
- 應用 Mean Shift 算法:對圖像進行顏色區域分割。
- 應用 Canny 邊緣檢測:在分割后的圖像上提取邊緣。
- 顯示結果:展示原始圖像、分割后的圖像和邊緣檢測結果。
3. 代碼示例
以下是一個完整的 Python 代碼示例,展示如何結合 Mean Shift 和 Canny:
import cv2
import numpy as np# 加載圖像
image = cv2.imread('your_image.jpg') # 替換為你的圖像路徑# 應用 Mean Shift 算法
# spatial_radius: 空間窗口半徑
# color_radius: 顏色窗口半徑
# max_level: 最大金字塔層數
segmented_image = cv2.pyrMeanShiftFiltering(image, spatial_radius=10, color_radius=30, max_level=1)# 應用 Canny 邊緣檢測
# 轉換圖像為灰度圖
gray = cv2.cvtColor(segmented_image, cv2.COLOR_BGR2GRAY)
# 應用 Canny 算法
edges = cv2.Canny(gray, threshold1=100, threshold2=200)# 顯示原始圖像、分割后的圖像和邊緣檢測結果
cv2.imshow('Original Image', image)
cv2.imshow('Segmented Image', segmented_image)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行說明:
- 將
'your_image.jpg'
替換為你的圖像文件路徑。 - 運行代碼后,會彈出三個窗口:原始圖像、Mean Shift 分割后的圖像和 Canny 邊緣檢測結果。
- 按任意鍵關閉所有窗口。
4. 參數解釋
Mean Shift 參數
spatial_radius
:空間窗口半徑,控制空間鄰域的大小。- 值越大,分割越平滑;值越小,保留細節越多。
color_radius
:顏色窗口半徑,控制顏色相似性的閾值。- 值越小,細節更多;值越大,區域合并更多。
max_level
:金字塔層數,用于加速計算。- 通常設為 1 或 2。
Canny 參數
threshold1
:低閾值,用于邊緣連接。threshold2
:高閾值,用于邊緣檢測。- 建議比例為 1:2 或 1:3(如 100 和 200)。
參數調整建議:
- 如果 Mean Shift 分割太粗糙,試著減小
spatial_radius
和color_radius
。 - 如果 Canny 邊緣檢測結果噪聲太多,增大
threshold1
和threshold2
。
5. 結果分析
- Mean Shift 分割:將圖像中顏色相似的區域合并,形成平滑的分割塊。
- Canny 邊緣檢測:在分割后的圖像上提取邊緣,突出區域邊界。
效果描述:
- 輸入圖像:假設是一張多彩風景照。
- Mean Shift 輸出:天空、樹木、草地被分割成不同顏色區域。
- Canny 輸出:這些區域的邊界被勾勒為白色線條。