이미지의 도미넌트 컬러를 k-means 클러스터링으로 추출

도미넌트 컬러(dominant color)는 전체 배색을 지배하는 색조입니다. --Google

5색 추출하여 비율로 원형 차트를 그립니다.








사용할 패키지


$ pip install opencv-python
$ pip install scikit-learn
$ pip install matplotlib

이미지 로드



이미지를 k-means 클러스터링할 수 있는 데이터로 만들기 위해 RGB 목록으로 설정
import cv2
import itertools

image = cv2.imread('./input.jpg')
rgbs = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rgb_list = list(itertools.chain(*rgbs.tolist()))

k-means



추출할 색상 수 = 클러스터 수
여기 5 예 :
from sklearn.cluster import KMeans

clusters = KMeans(n_clusters=5).fit(rgb_list)

클러스터 센터가 도미넌트 컬러
colors = clusters.cluster_centers_
print(colors)
[[ 25.29093216 119.84721127 142.13737995]
 [223.23362209 201.96734673 193.59849205]
 [176.3426999  108.01350558 118.93074255]
 [  8.36396613  14.71480369  27.54413049]
 [ 98.95068783  32.240443    48.93265647]]
#rgb

각 클러스터의 백분율 계산
import numpy as np

def cluster_percents(labels):
    total = len(labels)
    percents = []
    for i in set(labels):
        percent = (np.count_nonzero(labels == i) / total) * 100
        percents.append(round(percent, 2))
    return percents
percents = cluster_percents(clusters.labels_)
print(percents)
[9.16, 9.6, 11.51, 48.37, 21.35]
#%

원형 차트 그리기



matplotlib의 color가 0~1로 스케일 된 RGB밖에 받아들이지 않기 때문에 스케일한다.
import matplotlib.pyplot as plt

colors = clusters.cluster_centers_ / 255
colors = colors.tolist()

원 그래프를 깨끗하게 보이기 위해 비율을 대에서 소로 정렬한다.
percents = cluster_percents(clusters.labels_)
tup = zip(colors, percents)
sorted_tup = sorted(tup, key=lambda n: n[1], reverse=True)
sorted_colors = [c for c,p in sorted_tup]
sorted_percents = [p for c,p in sorted_tup]

원형 차트 그리기
plt.pie(sorted_percents, colors=sorted_colors, counterclock=False, startangle=90)
plt.show()

좋은 웹페이지 즐겨찾기