공부하기싫어

오늘은 일단 저번꺼에 이어서 도트 그림 변환 코드를 분석해보자

 

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

 

img_pl.mode == 'RGBA' or img_pl.mode == 'P'

일단 여기서 .mode 가 뭔지 몰라서 찾아봤다.

https://blog.naver.com/PostView.nhn?blogId=heennavi1004&logNo=222061487980&from=search&redirect=Log&widgetTypeCall=true&directAccess=false 

 

python 에서 이미지 처리: Pillow - Image 모듈

python 에서 이미지 처리: Pillow 참고 pillow 공식 문서 (이곳) Image Module이미지 로드, 새로운 이미...

blog.naver.com

대충 잦아보니까 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 

 

OpenCV : 컬러 변환 cvtColor 함수

이번엔 cvtColor함수를 이용해서 기본 BGR의 컬러를 GRAY COLOR_BGR2GRAY, COLOR...

blog.naver.com

여러 옵션들이 있는것 같은데

h, w, c = img.shape

에서 c가 뭔지 몰라서 찾아보니

https://ssaemo.tistory.com/103

 

[python] skimage ndarray shape (HWC, CHW)

caffe2에서 image pre-processing을 하는데, HWC, CHW가 나와서 의미를 찾아보게 되었다 H=height W=width C=channels 특히 channels의 경우, gray-image이면 1, RGB이면 3, RGBA이면 4이다 ex) (360, 480, 3) hei..

ssaemo.tistory.com

채널이라고 한다

 

if alpha_mode:

코드를 보다보면 alpha_mode 일때 동작하는게 많이 다른데

일단 alpha mode가 뭘 뜻하는지 정확히 모르겠다.

 

일단 박자

 

img = cv2.resize(img, (d_w, d_h), interpolation=cv2.INTER_NEAREST)

일단 resize 는 말그대로 resize 인데

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

 

[파이썬 OpenCV] 영상의 확대와 축소(크기 변환) - cv2.resize 함수 설명, interpolation 인자

황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다. [파이썬 OpenCV] 영상의 기하학적 변환 - 전단 변환 - cv2.warpAffine 황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공

deep-learning-study.tistory.com

여기서 나온걸 보면 저 구문의  interpolation=cv2.INTER_NEAREST 부분은 최근방 이웃 보간법 이라고 한다

 

그게 뭔진 모르겠다

 

if color:
        img_cp = img.reshape(-1, c)
    else:
        img_cp = img.reshape(-1)

https://blog.naver.com/PostView.nhn?blogId=nabilera1&logNo=221990020415 

 

파이썬 넘파이 reshape(-1)의 의미는?

python numpy.reshape(-1) shape와 reshape는 데이터가 어떤 형태로 모양을 갖고 있는지와 어떤 모양을 가...

blog.naver.com

그렇다고 하는데뭔소린지 역시 모르겠다

 

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

criteria 값을 통해서

 

ret, label, center = cv2.kmeans(img_cp, k, None, criteria, 10, cv2.KMEANS_PP_CENTERS)

cv2.kmeans 알고리즘을 사용하는데군집화 샘플링 알고리즘인것 같다.

 

https://www.youtube.com/watch?v=9jfGHa1500c

 

나중에 보면서 알고리즘을 한번 정리해봐야 할 것 같고

 

criteria 변수는 어떤식으로 만들어지는지도 알아봐야할 것 같다.

 

 

오늘은 여기까지