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()

結果:

彩色圖片分割

# -*- 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()

結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM