본문 바로가기
IT/영상 처리

[Python_OpenCV] K-Clustering

by 빨강자몽 2018. 7. 21.

K-clustering이란 K개의 비슷한 색상으로 아마자룰 모아주는 것을 말한다.


- 원본 이미지



- K=2, 4, 8, 16 Clustering



- 코드

import numpy as np
import cv2

def clustering(eye_img,num_k,name):
    Z = eye_img.reshape((-1, 3))
    Z = np.float32(Z)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 15, 1.0)
    K = num_k
    ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    res = center[label.flatten()]
    res2 = res.reshape((eye_img.shape))
    cv2.namedWindow('Clustering_img_'+name, cv2.WINDOW_NORMAL)
    cv2.resizeWindow('Clustering_img_'+name, 500, 400)
    cv2.imshow('Clustering_img_'+name, res2)
    return res2
img = cv2.imread("ori.jpg")
clustering(img, 2, "2")
clustering(img,4,"4")
clustering(img, 8, "8")
clustering(img, 16, "16")
cv2.waitKey(0)
cv2.destroyAllWindows()


- 코드 분석


criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 15, 1.0)

- criteria : Clustering의 알고리즘 반복의 종료 조건

cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER : 최대 반복 횟수 및 필수 정확도 충족 시 종료한다.

- 15(max_iter) : 최대 반복 횟수

- 1.0(EPS) : 필수 정확도 


cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

- Z : 이미지 데이터

- K : 필요한 클러스터 개수

- 10(attemps) : 밑에 나올 cv2.KMEANS_RANDOM_CENTERS 반복 횟수 -> 값이 커질수록 색상들이 더 모여있게되는 것으로 느껴진다.

cv2.KMEANS_RANDOM_CENTERS : 군집의 중심 값(분할할 색상군집의 기준)을 정하는 방식