오늘은 일단 저번꺼에 이어서 도트 그림 변환 코드를 분석해보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
# coding:utf-8
import sys
import cv2
from PIL import Image
import numpy as np
n8 = np.array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
np.uint8)
n4 = np.array([[0, 1, 0],
[1, 1, 1],
[0, 1, 0]],
np.uint8)
def make_dot(src, k=3, scale=2, color=True, blur=0, erode=0, alpha=True, to_tw=True):
img_pl = Image.open(src)
if (img_pl.mode == 'RGBA' or img_pl.mode == 'P') and alpha:
if img_pl.mode != 'RGBA':
img_pl = img_pl.convert('RGBA')
alpha_mode = True
elif img_pl.mode != 'RGB' and img_pl.mode != 'L':
img_pl = img_pl.convert('RGB')
alpha_mode = False
else:
alpha_mode = False
img = np.asarray(img_pl)
if color and alpha_mode:
a = img[:, :, 3]
img = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
h, w, c = img.shape
elif color:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w, c = img.shape
else:
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
h, w = img.shape
c = 0
d_h = int(h / scale)
d_w = int(w / scale)
if erode == 1:
img = cv2.erode(img, n4, iterations=1)
elif erode == 2:
img = cv2.erode(img, n8, iterations=1)
if blur:
img = cv2.bilateralFilter(img, 15, blur, 20)
img = cv2.resize(img, (d_w, d_h), interpolation=cv2.INTER_NEAREST)
if alpha_mode:
a = cv2.resize(a, (d_w, d_h), interpolation=cv2.INTER_NEAREST)
a = cv2.resize(a, (d_w * scale, d_h * scale), interpolation=cv2.INTER_NEAREST)
a[a != 0] = 255
if not 0 in a:
a[0, 0] = 0
if color:
img_cp = img.reshape(-1, c)
else:
img_cp = img.reshape(-1)
img_cp = img_cp.astype(np.float32)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret, label, center = cv2.kmeans(img_cp, k, None, criteria, 10, cv2.KMEANS_PP_CENTERS)
center = center.astype(np.uint8)
result = center[label.flatten()]
result = result.reshape((img.shape))
result = cv2.resize(result, (d_w * scale, d_h * scale), interpolation=cv2.INTER_NEAREST)
if alpha_mode:
r, g, b = cv2.split(result)
result = cv2.merge((r, g, b, a))
elif to_tw:
r, g, b = cv2.split(result)
a = np.ones(r.shape, dtype=np.uint8) * 255
a[0, 0] = 0
result = cv2.merge((r, g, b, a))
colors = []
for res_c in center:
color_code = '#{0:02x}{1:02x}{2:02x}'.format(res_c[2], res_c[1], res_c[0])
colors.append(color_code)
return result, colors
|
cs |
img_pl.mode == 'RGBA' or img_pl.mode == 'P'
일단 여기서 .mode 가 뭔지 몰라서 찾아봤다.
대충 잦아보니까 pil image mode 에는 rgba, rgb, P, L 이런 모드들이 있는거같은데
이걸 RGBA 나 RGB 로 컨버트 해주는 부분인것 같다.
cv2.cvtColor 부분은 컬러 변환 함수로 OpenCV 라이브러리에 들어있는 함수라고 한다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=alsrb968&logNo=220909428222
여러 옵션들이 있는것 같은데
에서 c가 뭔지 몰라서 찾아보니
https://ssaemo.tistory.com/103
채널이라고 한다
코드를 보다보면 alpha_mode 일때 동작하는게 많이 다른데
일단 alpha mode가 뭘 뜻하는지 정확히 모르겠다.
일단 박자
일단 resize 는 말그대로 resize 인데
https://deep-learning-study.tistory.com/185
여기서 나온걸 보면 저 구문의 interpolation=cv2.INTER_NEAREST 부분은 최근방 이웃 보간법 이라고 한다
그게 뭔진 모르겠다
https://blog.naver.com/PostView.nhn?blogId=nabilera1&logNo=221990020415
그렇다고 하는데뭔소린지 역시 모르겠다
criteria 값을 통해서
cv2.kmeans 알고리즘을 사용하는데군집화 샘플링 알고리즘인것 같다.
https://www.youtube.com/watch?v=9jfGHa1500c
나중에 보면서 알고리즘을 한번 정리해봐야 할 것 같고
criteria 변수는 어떤식으로 만들어지는지도 알아봐야할 것 같다.
오늘은 여기까지
'Archive > [App] 도트감성:pixel painter' 카테고리의 다른 글
[3주-5일차] NFT maker APP - android to AWS S3 (0) | 2022.05.12 |
---|---|
[3주-3,4일차] NFT maker APP - kmeans 코드 분석 + 이미지변환해보기 (0) | 2022.05.10 |
[3주-1일차] NFT maker APP - dynamoDB 이미지 파일 저장+불러오기 (0) | 2022.05.08 |
[3주-0일차] NFT maker APP - 3주차 스프린트 계획 수립 (0) | 2022.05.07 |
[2주-2,3,4,5일차] NFT maker APP - 안드로이드 to AWS파이썬api서버 연동3 + 코드분석 (0) | 2022.05.03 |