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 ===================================


+ Recent posts