天天看點

python實作kmeans圖像分割_K-Means 實作圖像分割

使用的環境,python3.5,opencv2

函數的格式為:

cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)

'''

參數:

data: 分類資料,最好是np.float32的資料,每個特征放一列。

K: 分類數,opencv2的kmeans分類是需要已知分類數的。

bestLabels:預設的分類标簽或者None

criteria:疊代停止的模式選擇,這是一個含有三個元素的元組型數。格式為(type, max_iter, epsilon)

其中,type有如下模式:

—–cv2.TERM_CRITERIA_EPS :精确度(誤差)滿足epsilon停止。

—-cv2.TERM_CRITERIA_MAX_ITER:疊代次數超過max_iter停止。

—-cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,兩者合體,任意一個滿足結束。

attempts:重複試驗kmeans算法次數,将會傳回最好的一次結果

flags:初始中心選擇,有兩種方法:

——v2.KMEANS_PP_CENTERS;

——cv2.KMEANS_RANDOM_CENTERS

傳回值:

compactness:緊密度,傳回每個點到相應重心的距離的平方和

labels:結果标記,每個成員被标記為0,1等

centers:由聚類的中心組成的數組

'''

灰階圖檔分割

# -*- coding: utf-8 -*-

# @Author : matthew

# @Software: PyCharm

import cv2

import matplotlib.pyplot as plt

import numpy as np

def seg_kmeans_gray():

img = cv2.imread('000129.jpg', cv2.IMREAD_GRAYSCALE)

# 展平

img_flat = img.reshape((img.shape[0] * img.shape[1], 1))

img_flat = np.float32(img_flat)

# 疊代參數

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TermCriteria_MAX_ITER, 20, 0.5)

flags = cv2.KMEANS_RANDOM_CENTERS

# 聚類

compactness, labels, centers = cv2.kmeans(img_flat, 2, None, criteria, 10, flags)

# 顯示結果

img_output = labels.reshape((img.shape[0], img.shape[1]))

plt.subplot(121), plt.imshow(img, 'gray'), plt.title('input')

plt.subplot(122), plt.imshow(img_output, 'gray'), plt.title('kmeans')

plt.show()

if __name__ == '__main__':

seg_kmeans_gray()

結果:

python實作kmeans圖像分割_K-Means 實作圖像分割

彩色圖檔分割

# -*- coding: utf-8 -*-

# @Author : matthew

# @Software: PyCharm

import cv2

import matplotlib.pyplot as plt

import numpy as np

def seg_kmeans_color():

img = cv2.imread('000129.jpg', cv2.IMREAD_COLOR)

# 變換一下圖像通道bgr->rgb,否則很别扭啊

b, g, r = cv2.split(img)

img = cv2.merge([r, g, b])

# 3個通道展平

img_flat = img.reshape((img.shape[0] * img.shape[1], 3))

img_flat = np.float32(img_flat)

# 疊代參數

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TermCriteria_MAX_ITER, 20, 0.5)

flags = cv2.KMEANS_RANDOM_CENTERS

# 聚類

compactness, labels, centers = cv2.kmeans(img_flat, 2, None, criteria, 10, flags)

# 顯示結果

img_output = labels.reshape((img.shape[0], img.shape[1]))

plt.subplot(121), plt.imshow(img), plt.title('input')

plt.subplot(122), plt.imshow(img_output, 'gray'), plt.title('kmeans')

plt.show()

if __name__ == '__main__':

seg_kmeans_color()

結果:

python實作kmeans圖像分割_K-Means 實作圖像分割