일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Number Theory
- 코딩테스트
- implement
- 자바
- Data Structure
- string
- SQL
- greedy
- Math
- geometry
- 구현
- Class
- sorting
- 코테
- Binary Tree
- dynamic programming
- Method
- Matrix
- hash table
- 파이썬
- java
- simulation
- array
- two pointers
- Counting
- Stack
- Tree
- database
- bit manipulation
- Binary Search
- Today
- Total
코린이의 소소한 공부노트
matplotlib을 이용한 시각화 기초 (2) 이미지 본문
이 글에서는 이미지를 열어보고, 분석해보고, 약간 조작해보려고 한다.
뭐든지 시작하기 전에, 모듈 임포트부터!
import numpy as np
from PIL import Image # PIL: 파이썬 이미지 분석 라이브러리
import matplotlib.pyplot as plt
%matplotlib inline
그림 띄우기 준비
주피터에서 이미지 파일을 불러올 때 필자가 배운 방법은 이것이다.
# 현재 주피터노트북 파일이 있는 폴더에
# source라는 폴더가 있고
# 그 안에 MZ.png 파일이 있는 상황
path = 'source/MZ.png'
image_pil = Image.open(path) # 경로를 따라가서 파일을 오픈하고
image = np.array(image_pil) # 그 파일의 정보를 넘파이 배열로 저장
image.shape
>>
(160, 160, 3) # 세로 160픽셀, 가로 160픽셀, RGB컬러
np.max(image), np.min(image) # 픽셀 하나의 최댓값, 최솟값
>>
(255, 0)
다른 방법으로도 열 수 있지만, shape의 순서가 바뀌는 경우도 종종 생겨서 코딩할 때 혼란이 생기는 것을 막기 위해 PIL로 연다고 하셨다. 나중에 보면 다른 방법으로 이미지 파일을 여는 것을 볼 수 있다. 코딩하기 전 이미지의 범위를 확인해보기 위해 shape, max, min을 쓰는 버릇을 들이자.
그림을 띄워보기 전에, 그림에 있는 픽셀 값들의 분포도 한번 살펴보자.
plt.hist(image.ravel()) # 1차원 배열로 바꿔주는 함수. flatten함수라고도 한다.
plt.show() # 예를 들면 shape이 (2, 3) -> (6,)으로 바뀐다.
>>
그림 열기
지금 이미지 파일에 무엇이 담겨있는지 아직 밝혀지지 않았다. 과연 무엇일까?
plt.imshow(image)
plt.show()
>>
콘에게 단단히 삐친 무지가 나타났다..! 졸귀졸귀
이 그림.. 흑백으로도 띄울 수 있을까? 먼저 해야 할 것은, 이미지를 다시 불러와야 한다는 것이다.
image_pil = Image.open(path).convert("L") # "L": greyscale로 바꾸겠다는 뜻
image_bw = np.array(image_pil)
image_bw.shape
>>
(160, 160) # 처음에 봤던 shape에서 맨 뒤 3이 없어진 것을 확인할 수 있다.
# greyscale로 바뀌었기 때문에 RGB 3채널이 없어진 것이다.
plt.imshow(image_bw)
plt.show()
>>
왜 이런 현상이 발생하는지 찾아본 결과, matplotlib의 imshow는 단순히 이미지 데이터가 아닌 데이터를 과학적으로 표현하는 것을 목표로 하고 있고, 기본적으로 고대비 색상 팔레트를 사용하도록 구성됐기 때문이라는 답변을 찾았다. 이것을 어떻게 이해할지 찾아보던 중, greyscale과 grayscale의 차이까지 찾아보게 되었다.
바로 위의 예시에서 필자가 greyscale이라고 쓴 건, PIL 문서에서 이렇게 표현하고 있어서 저렇게 쓴 것이다. 뭔가 이상하다 싶어 구글링을 해보니 우리나라에서는 둘 다 회색조/흑백 구분 없이 번역되고 있지만 차이는 있었다. grayscale은 우리가 일반적으로 생각하는 흑백이고, greyscale은 회색톤이라고 한다. 이걸로 미루어 봤을 때, 위의 예시가 greyscale로 변환됐는데도 색상이 남아있는 건 단순히 밝은 색은 흰색, 어두운 색은 검정색으로 나눈 것이 아니라 밝은 색부터 그라데이션을 넣듯이 처리돼서 우리가 알고 있는 흑백과 다르게 나온 것이 아닐까 생각해볼 수 있겠다. 어렵다..
그럼 우리의 의도대로 무채색으로 된 그림을 띄우고 싶으면 어떻게 하면 좋을까?
plt.imshow(image_bw, 'gray') # 그냥 imshow 하지 말고 'gray'를 추가!
plt.show()
>>
그렇다면.. 어플 쓰듯이 다른 분위기로 바꿔볼 수 있을까?
plt.subplot(1,2,1)
plt.imshow(image_bw, 'RdBu') # 레드블루
plt.subplot(1,2,2)
plt.imshow(image_bw, 'jet') # 높을수록 빨강, 낮을수록 파랑
plt.colorbar() # 그림 옆에 나올 컬러바
plt.show()
>>
여기서도 당연히 plt.figure로 사이즈 조절 가능하고, 제목 달고 다 할 수 있다.
plt.figure(figsize=(2,2))
plt.imshow(image)
plt.title('So cute!')
plt.show()
>>
이미지 2개로 놀아보기
졸귀 무지와 콘 말고 그림 1가지를 더 열어보려고 한다.
path2 = 'source/cs.png'
image_pil2 = Image.open(path2)
image2 = np.array(image_pil2)
plt.imshow(image2)
plt.show()
>>
2가지 그림의 shape을 확인해보겠다.
image.shape, image2.shape
>>
((160, 160, 3), (160, 160, 3))
미리 사이즈를 맞춰놨기 때문에 똑같은 것을 확인할 수 있다. 만약 두 그림의 사이즈가 다를 경우, 맞추고 싶다면 아래와 같이 쓰면 된다.
!pip install opencv-python
# opencv가 설치 안 되어있으면 설치를 먼저 한다.
import cv2 # 설치한 opencv 불러오기
# 이미지 A와 B가 있다.
# A.shape = (183, 275, 3)
# B.shape = (734, 1100, 3)
# B의 이미지를 A의 이미지로 맞추려면 이렇게!
B = cv2.resize(image, (275, 183)) # 가로 세로를 바꿔서 입력한다는 것에 주의!
A.shape, B.shape
>>
((183, 275, 3), (183, 275, 3))
자 그럼, 왜 두 이미지의 크기를 맞췄을까..? 바로바로.. 합쳐보기 위해서다! 졸귀+졸귀=더졸귀인지 확인해보자!
plt.imshow(image) # 윗줄이 더 아래에 쌓이게됨
plt.imshow(image2, alpha=0.5) # 투명도: 50%
plt.show()
>>
이 정도면 이미지를 갖고 노는 게 어느 정도 적응됐다고 칩시다!! (누구 맘대로??)
'Deep Learning' 카테고리의 다른 글
matplotlib을 이용한 시각화 기초 (1) 그래프 (0) | 2021.08.21 |
---|---|
Numpy 기초 다지기 (0) | 2021.08.18 |
Tensor 이해하기 (0) | 2021.08.08 |