[python] 이미지 군집화와 분할

이미지 군집화와 분할은 컴퓨터 비전 분야에서 매우 중요한 작업입니다. 이미지 군집화는 비슷한 특징을 가지는 픽셀들을 그룹화하여 이미지 내에서 서로 다른 객체나 영역을 식별하는 작업입니다. 이미지 분할은 이미지를 작은 부분으로 나누는 작업으로, 각 부분은 독립적인 개체로 간주됩니다.

K-평균 알고리즘

K-평균 알고리즘은 이미지 군집화에서 가장 널리 사용하는 알고리즘입니다. 이 알고리즘은 먼저 사용자가 원하는 군집의 수인 K를 지정해야 합니다. 그런 다음 알고리즘은 무작위로 선택한 K개의 초기 중심값을 사용하여 각 픽셀을 가장 가까운 중심으로 할당합니다. 그 다음 중심값을 업데이트하고, 다시 픽셀을 할당하고, 이를 반복하여 중심값이 더 이상 변경되지 않을 때까지 반복합니다.

from sklearn.cluster import KMeans

# 이미지 데이터를 로드
image = load_image("image.jpg")

# 이미지의 모든 픽셀을 1차원 배열로 변환
pixels = image.reshape(-1, 3)

# K-평균 알고리즘을 사용하여 이미지 군집화
kmeans = KMeans(n_clusters=5)
kmeans.fit(pixels)

# 각 픽셀에 할당된 군집 중심값을 가져옴
labels = kmeans.labels_

# 각 픽셀에 할당된 군집 중심값을 이미지로 변환
segmented_image = kmeans.cluster_centers_[labels].reshape(image.shape)

그래프 기반 이미지 분할

그래프 기반 이미지 분할은 이미지를 그래프로 표현하고, 그래프에서 간선을 잘라내어 이미지를 분할하는 방법입니다. 이 방법은 각 픽셀을 그래프의 노드로 표현하고, 픽셀 간의 연결을 간선으로 표현합니다. 그런 다음 간선의 가중치를 계산하여 가중치가 낮은 간선을 잘라내어 이미지를 분할합니다.

import numpy as np
from skimage.segmentation import slic

# 이미지 데이터를 로드
image = load_image("image.jpg")

# SLIC 알고리즘을 사용하여 이미지 분할
segments = slic(image,
                n_segments=100,  # 분할된 영역의 수
                compactness=10)  # 영역의 부드러움 정도 조절

# 각 영역을 랜덤한 색상으로 표시
segmented_image = np.zeros_like(image)
for segment_id in np.unique(segments):
    mask = segments == segment_id
    segmented_image[mask] = np.random.randint(0, 255, 3)

# 이미지 분할 결과 출력
show_image(segmented_image)

참고 자료