공부하기싫어
article thumbnail

오늘은 어제에 이어서 코드를 분석해보고

 

샘플 이미지 파일을 넣고 값을 변화시키면서 실제 코드가 어떻게 돌아가는지 대충 파악해보자

 

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([[111],
               [111],
               [111]],
              np.uint8)
 
n4 = np.array([[010],
               [111],
               [010]],
              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[00= 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, 101.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[00= 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

 

result = center[label.flatten()]

https://velog.io/@u_jinju/Python-flatten-%ED%95%A8%EC%88%98

 

[Python] flatten() 함수

flatten은 numpy에서 제공하는 다차원 배열 공간을 1차원으로 평탄화해주는 함수이다.

velog.io

flatten() 함수는 다차원 공간을 1차원으로 평탄화 해주는 함수라고 한다.

 

그리고 k means 인자들이 어떤 역할을 하는지 알아보고 싶었는데

https://deep-learning-study.tistory.com/292

 

[OpenCV 머신러닝] OpenCV에서 k-means 알고리즘 사용하기 - cv2.kmeans

 OpenCV에서 제공하는 함수를 이용하여 k-means 알고리즘을 이용하는 방법에 대해 공부해보겠습니다. k-평균(k-means) 알고리즘  k-means 알고리즘은 주어진 데이터를 k 개의 구역으로 나누는 군집화(clu

deep-learning-study.tistory.com

블로그에서 자세히 설명되어있어서 참고했다.

 

여기서 ret, label, center 에 kmeans 결과가 반환되는데

ret 은 안쓰는것 같고

 

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)

이 작업을 거쳐서 result 에 결과가 저장되는데

정확히 어떤 작업이 이루어지는지는 와닫지는 않는다.

 

이제 값을 하나씩 바꿔가면서 사진의 변화를 비교해 보자

 

기존 사이트

원본

원본
변환

num of color 8

dot size 4

나머지 다 none

 

python 결과

잘 나오는듯 하다

 

 

 

 

  • 앱 - dynamoDB 이미지 파일 추가

지금 거의 한 5일동안 찾아본 결과 dynamoDB에 이미지파일을 어떻게 해서든 올리는건 비효율적이라고 결론이 섯다.

 

결국 AWS S3 를 이용해서 이미지를 올리고 파일을 변환한 후 이용한 파일을 삭제하는 작업을 하는게 맞는것 같다.

 

연동은 내일 하도록 하고

일단 s3 연동에 필요한 자료들을 모아보자

ㅅㅂ 2주차때 했던것들은 다 쓸모없어졌네

 

https://godsang.tistory.com/entry/%EC%9D%B4%ED%8B%80-%ED%97%A4%EB%A7%A4%EA%B3%A0-%EC%A0%95%EB%A6%AC%ED%95%98%EB%8A%94-AWS-S3-Android-image-upload-%EB%B0%A9%EB%B2%95

 

이틀 헤매고 정리하는 AWS <-> S3 Android image upload 방법

진행하는 안드로이드 앱 프로젝트에서 image파일을 S3에 올려야할 필요가 있어서 구현 하였다. 검색하면서 구현 방법이 다르고, Cognito를 사용하지 않는데 Cognito를 사용하여 연동한 방법만 나와있

godsang.tistory.com

 

https://velog.io/@colorful-stars/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-AWS-S3-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C-%EB%B0%8F-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C

 

안드로이드 AWS S3 이미지 업로드 및 다운로드 (1)

최근 AWS를 사용해보면서 따로 적지 않으면 까먹을 것 같아서 기록한다.이곳 저곳에서 정보를 얻어서 시행착오를 겪었지만 기본 베이스는 이곳에서 얻었다.다만 2016년도 포스팅이여서 현재는 달

velog.io

 

https://dev.classmethod.jp/articles/lim-lambda-s3-2021/

 

S3를 람다 함수 트리거로 추가해서 객체 생성 이벤트가 발생할때 람다 함수를 실행시켜봤다. | Dev

안녕하세요, 임채정입니다. 이번 블로그에서는 람다 함수의 트리거로 S3를 설정해서 객체 생성 이벤트가 발생하면 람다함수를 실행하는 방법에 대해서 정리해보겠습니다. 아젠다 람다 함수 작

dev.classmethod.jp

 

lambda 에서 s3 object 삭제

https://stackoverflow.com/questions/28420499/aws-lambda-cant-delete-amazon-s3-object

 

AWS Lambda can't delete Amazon S3 object

I'm trying to create an AWS Lambda function, which processes a file uploaded to the first bucket, then saves it to the second bucket and then deletes the input file. The problem is that when I'm t...

stackoverflow.com

 

aws s3 sdk for java

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/UsingTheMPJavaAPI.html

 

AWS SDK for Java 사용 - Amazon Simple Storage Service

AWS SDK for Java 사용 AWS SDK for Java는 Amazon S3 버킷 및 객체 작업을 위한 API를 제공합니다. 객체 작업의 경우 단일 작업에서 객체를 업로드하기 위해 API를 제공하는 것에 추가로, SDK에서는 대용량 객

docs.aws.amazon.com

 

aws s3 sdk for python

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/UsingTheBotoAPI.html

 

AWS SDK for Python (Boto) 사용 - Amazon Simple Storage Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-example.html

 

자습서: Amazon S3 트리거를 사용하여 Lambda 함수 호출 - AWS Lambda

자습서: Amazon S3 트리거를 사용하여 Lambda 함수 호출 이 자습서에서는 콘솔을 사용하여 Lambda 함수를 생성하고 Amazon Simple Storage Service(Amazon S3)에 대한 트리거를 구성합니다. 이 트리거는 Amazon S3 버

docs.aws.amazon.com

 

 

일단 여기까지만 알아보자