numpy배열로 이미지 파일을 불러와서 각종 라이브러리를 이용해 이미지 파일을 로드하고 확대하여 출력해봤다.
이미지의 기본이 텐서 데이터라는 것을 알 수 있었고 이를 이용하면 특정 색이 얼마나 분포하는지를 파악 할 수 있을 것이라는 생각이 들었다.
여기 나오는 내용은 '예제로 배우는 파이썬 데이터 시각화'의 코드(파이썬 2.7)를
파이썬 3 코드로 바꾼 것이다.
*2018-06-20 추가: 한국어판 책이 틀린 것으로 확인되었다.
=================================== Python ===================================
##### numpy배열로 파일 불러오기 #####
### scipy를 이용한 이미지 파일 로드 ###
import scipy.misc
import matplotlib.pyplot as plt
# 미리 준비된 ScyPy의 ndarry 이미지 로드하기
face = scipy.misc.face()
# 이미지를 plt에 넣기
# plt.imshow(face)
# 이미지 확인
# plt.show()
# 기본 색조를 회색조로 설정
plt.gray() # 컬러바의 기본색조를 회색으로 바꾼다.
# 사진 넣기 및 출력
plt.imshow(face) # 사진을 넣기
plt.colorbar() # 컬러바를 만든다.
plt.show()
print(face.shape) # 사진의 해상도. (768, 1024, 3). RGB가 깔려있으므로 텐서적 해석에서 3이 붙는다.
print(face.max()) # 이미지에서 가장 높은 값. 255
print(face.dtype) # 데이터 타입. uint8. 부호없는 8비트 <- 1바이트 정수로 인식
### PIL(Pillow)를 이용한 이미지 파일 로드 ###
import numpy
from PIL import Image
import matplotlib.pyplot as plt
# 사진 이미지 위치를 설정
bug = Image.open('stinkbug.png')
# 위의 shape와 같은 메서드.
print(bug.size[:]) # (500, 375). 가로 500, 세로 375의 이미지이다.
# 사진을 배열(array)형태로 바꾼다.
# .array()는 bug에서 데이터를 얻고 그것을 numpy의 uint8자료형으로 변환시켜 numpy 배열에 넣는다.
# .reshape()는 (이미지의 가로길이, 이미지의 세로길이, 이미지의 깊이) 깊이는 RGB의 텐서적 해석이다.
# 실제 document에서는 (shape, *shapes, order)로 되어있다.
# order는 'C', 'F', 'A'만 가능하고 int값은 shapes만 가능하다. 즉, 3은 shpae라는 결론을 얻을 수 있다.
# ref. https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.reshape.html
arr = numpy.array(bug.getdata(), numpy.uint8).reshape(bug.size[1], bug.size[0], 3)
arr = numpy.array(bug.getdata(), numpy.uint8).res
# 그래프의 출력
plt.gray()
plt.imshow(arr)
plt.colorbar()
plt.show()
import scipy.misc
import matplotlib.pyplot as plt
bug = scipy.misc.imread('stinkbug.png')
print(bug.shape) # 이미지의 크기를 확인
# 회색조로 변환. 세로도 전체, 가로도 전체, 깊이는 0으로 만들어서 흑과 백의 회색조로 만든다.
bug = bug[:, :, 0]
# 원본 이미지 출력
plt.figure()
plt.gray()
plt.subplot(121)
plt.imshow(bug)
# 확대 영역 출력
zbug = bug[100:350, 140:350]
'''
확대영역은 기존 배열의 일정 영역의 행과 열을 선택하는 것이다.
zbug는 '세로' 100~349(249)까지, '가로' 140~349(210)까지를 선택한 것이다.
책에서는 '열' 100~350, '행' 140~350이라고 적어놨는데
'행의 추가는 아래'로, '열의 추가는 우측'으로 일어난다는 생각을 해보면
책에서 행과 열을 반대로 적은 게 아닐까라는 생각이 든다.
원본으로 확인결과 내 생각이 맞았다.
'''
plt.subplot(122)
plt.imshow(zbug)
plt.show()
### matplotlib.image를 이용하여 이미지 파일 로드 ###
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
file = 'stinkbug.png'
bug = mpimg.imread(file)
plt.imshow(bug)
plt.show()
=================================== Python ===================================
'프로그래밍 > Python, R 프로그래밍' 카테고리의 다른 글
[Python] Python 22일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.02 |
---|---|
[Python] Python 21일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.20 |
[Python] Python 19일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.15 |
[Python] Python 18일차 (0) | 2018.06.14 |
[Python DataStreamOut] csv, json, xlsx로 데이터 내보내기 (0) | 2018.06.13 |