오늘은 어제에 이어서 코드를 분석해보고
샘플 이미지 파일을 넣고 값을 변화시키면서 실제 코드가 어떻게 돌아가는지 대충 파악해보자
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
88
89
90
91
|
# coding:utf-8
import sys
import cv2
from PIL import Image
import numpy as np
#erode 할때 쓰일 2차원배열 모양 선언
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, scale, color=True, blur, erode, alpha=True, to_tw=True):
img_pl = Image.open(src)
#RGBA 나 RGB 로 convert
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) #BGRA TO RGB
h, w, c = img.shape
elif color:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGR TO RGB
h, w, c = img.shape
else:
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #RGB TO GRAY 흑백인듯
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 |
https://velog.io/@u_jinju/Python-flatten-%ED%95%A8%EC%88%98
flatten() 함수는 다차원 공간을 1차원으로 평탄화 해주는 함수라고 한다.
그리고 k means 인자들이 어떤 역할을 하는지 알아보고 싶었는데
https://deep-learning-study.tistory.com/292
블로그에서 자세히 설명되어있어서 참고했다.
여기서 ret, label, center 에 kmeans 결과가 반환되는데
ret 은 안쓰는것 같고
이 작업을 거쳐서 result 에 결과가 저장되는데
정확히 어떤 작업이 이루어지는지는 와닫지는 않는다.
이제 값을 하나씩 바꿔가면서 사진의 변화를 비교해 보자
기존 사이트
원본
num of color 8
dot size 4
나머지 다 none
잘 나오는듯 하다
- 앱 - dynamoDB 이미지 파일 추가
지금 거의 한 5일동안 찾아본 결과 dynamoDB에 이미지파일을 어떻게 해서든 올리는건 비효율적이라고 결론이 섯다.
결국 AWS S3 를 이용해서 이미지를 올리고 파일을 변환한 후 이용한 파일을 삭제하는 작업을 하는게 맞는것 같다.
연동은 내일 하도록 하고
일단 s3 연동에 필요한 자료들을 모아보자
ㅅㅂ 2주차때 했던것들은 다 쓸모없어졌네
https://dev.classmethod.jp/articles/lim-lambda-s3-2021/
lambda 에서 s3 object 삭제
https://stackoverflow.com/questions/28420499/aws-lambda-cant-delete-amazon-s3-object
aws s3 sdk for java
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/UsingTheMPJavaAPI.html
aws s3 sdk for python
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/UsingTheBotoAPI.html
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-example.html
일단 여기까지만 알아보자
'Archive > [App] 도트감성:pixel painter' 카테고리의 다른 글
[4주-0일차] pixel painter APP - 4주차 스프린트 계획 수립 (0) | 2022.05.14 |
---|---|
[3주-5일차] NFT maker APP - android to AWS S3 (0) | 2022.05.12 |
[3주-2일차] NFT maker APP - kmeans 코드 분석 (0) | 2022.05.09 |
[3주-1일차] NFT maker APP - dynamoDB 이미지 파일 저장+불러오기 (0) | 2022.05.08 |
[3주-0일차] NFT maker APP - 3주차 스프린트 계획 수립 (0) | 2022.05.07 |