이미지 데이터에는 색깔을 표현하는 rgb 값들이 픽셀 단위로 들어있다.
오늘은 이 RGB 값에 클러스터링을 적용해서 원하는 색을 뽑아낸 뒤 좌표값을 부여하는 알고리즘을 만들어보려 한다.
우선 적절한 이미지를 구한다.

토지이음에서 적당한 이미지를 하나 가져왔다. 영등포 시장 정비구역의 지형도면이다. 목표는 저 빨간색 점선만 남기기!
파이썬에서 이미지를 불러온다.
필요한 라이브러리를 불러오고,
import numpy as np
from PIL import Image
from sklearn.cluster import KMeans
from sklearn.cluster import DBSCAN
from sklearn.neighbors import NearestNeighbors
from shapely.geometry import Point, Polygon
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
이미지를 불러온뒤, numpy 행렬로 바꿔준다.
# 이미지 불러오기
img = Image.open(load_dir + "/영등포시장_지형도면 고시.png")
name = "영등포시장_지형도면 고시"
pix = np.array(img)
pix = np.delete(pix, 3, axis=2)
plt.imshow(pix)
plt.show()
x_data = pix.reshape(pix.shape[0] * pix.shape[1], pix.shape[2])
왜인지는 모르겠는데 3차원 shape이 3이 아니라 [255, 255, 255, 255] 이런식으로 4개로 구성되어 있었다. 어차피 전부 255 길래 맨 끝 값은 지워줬다.
그리고 클러스터링을 하기 위해 pix의 shape를 조정해준다.
shape 0 와 shape 1을 곱해줘서 2차원 행렬로 만들어 준다.
여담이지만, 이번 알고리즘 공부를 하면서 차원에 대해 감을 좀 잡은 것 같아서 좀 기분 좋다.
그 다음 클러스터링을 돌려주면 완성.
# K-means 모델 만들기
cit = KMeans(5, random_state=123).fit(x_data)
# 중심값 보기
centroid = cit.cluster_centers_.astype(np.int64())
centroid = centroid.reshape(centroid.shape[0], 1, centroid.shape[1])
plt.imshow(centroid)
plt.savefig(save_dir + '/IMG2Polygon/IMG/Centroid_{0}.png'.format(name), dpi=300)
plt.show()
# 결과 라벨링
labels = cit.predict(x_data)
labels = labels.reshape(x_data.shape[0], 1)
labels = labels.reshape(pix.shape[0], pix.shape[1], 1)
K-means 클러스터링 할 때 가장 귀찮은 점 중 하나가 K 값 설정하기이지 않을까. 일단 넉넉하게 5개로 잡아 봤다.

결과로 나온 중심점이다. 여기서 문제. 왜 K 값을 5개나 잡아서 필요없는 회색을 저렇게 구분해놨을까?
사실 처음에 색깔이 4개니까 K 값도 4개로 잡았지만, 그 경우 색깔 분리가 잘 안 이루어진다. 그래서 5개로 조정했다.
이제 빨간색의 라벨이 4번인걸 알았으니 빨간색만 남겨서 시각화해보자.
# 시각화
result = pix.copy()
pos = np.concatenate([labels, labels, labels], axis=2)
result[np.where(pos != 4)] = 253
plt.imshow(result)
plt.savefig(save_dir + '/IMG2Polygon/IMG/Target_IMG_{0}.png'.format(name), dpi=300)
plt.show()
label 4에 해당하는 픽셀만 남기고 나머지는 하얀색으로 바꿔준다.
여기서 주의할 점. result의 shape은 (x, y, 3)이고, labels의 shape은 (x, y, 1) 이다. shape을 똑같이 (x, y, 3) 으로 맞춰주지 않으면 [[[x1, x2, x3]... ]]] 중에 x1만 바뀐다.
결과는 다음과 같다.

빨간색만 잘 분리된 것을 볼 수 있다.
그런데, 가운데를 잘 보면 뭔가가 남아있다. '시장정비구역' 이라는 글씨도 빨간색이라서 같이 남아있다.
다음 포스팅에서는 가운데 글씨를 지우고 좌표값을 부여해 본다.
| [Algorithm] New Point 쓰레기 처리 시스템 구축 알고리즘 (1) Project Structure (0) | 2023.02.19 |
|---|---|
| [Algorithm] 쓰레기 배출 시뮬레이션 (2) (2) | 2023.01.09 |
| [Algorithm] 쓰레기 배출 시뮬레이션 (1) (0) | 2023.01.09 |
| [Algorithm] 도시화과정 시뮬레이션 (0) | 2023.01.02 |
| [Algorithm] 클러스터링 심화_이미지 처리 1 (2) (0) | 2022.12.25 |