[TIL] Python Image 처리 - 1

Hanna·2021년 9월 13일
0

CV

목록 보기
1/5

이미지는 array. 현실 세계에서는 파일로 저장하고, 파일마다 형식이 다르게 있음.
파일 형식에 따라 이미지를 다양한 값의 조합으로 구현함(확장자가 중요한 것은 아님)

파일을 불러와서 해석할 수 있어야 함

# tensorflow - GPU
import tensorflow as tf
im = tf.io.read_file('moon.jpg')
t= tf.image.decode_image(im)
ss = tf.cast(t, 'float32')
ss/127.5 - 1 # -1 ~ 1로 만듦

# Opencv - CPU
import cv2.
s = cv2.imread('moon.jpg)
s.dtype
>> dtype('uint8') #강도

python opencv는 numpy 기본으로 CPU로 vectorization을 하나 tensorflow는 GPU로 vectorization을 함.tensorflow는 대용량 데이터를 불러와서 처리를 하기 때문에 더 빠름. 프로세스는 동일하나 편의성 문제임.

이미지는 한정적(finite)으로 표현함. 연속적으로도 표현 가능.
사람은 상대적 강도로 인식을 하기 때문에 255로 나누나 가장 큰 값으로 나누는 것은 똑같이 인식을 하지만, 컴퓨터는 dtype()이 float로 변경됨

컬러는 상대적 강도, 값이 하나 밖에 없는 강도는 흑백
즉, 컬러 이미지에서 채널 하나를 뽑으면 흑백이 됨
imshow는 default를 컬러 이미지로 봄. 흑백 이미지는 기본 colormap으로 표현 -> 색 정보가 없으면 컬러 이미지로 생각함

import matplotlib
len(dir(matplotlib))
>> 101

# monkey patch
import matplotlib.pyplot as plt
len(dir(matplotlib))
>> 160

monkey patch(잠수함 패치):

plt.imshow(t[...,0], cmp='gray')

PIL의 경우 Pythonic한 라이브러리. numpy 방식이 아닌 numpy 호환 형태로 데이터를 가지고 있음. 따라서 plt.imshow()로 보지 못함

PIL이 중요한 이유

i = tf.keras.preprocessing.image.load_img('moon.jpeg') 
# tensorflow, pytorch 내부적으로 PIL 사용
type(i)
>> PIL.JpegImagePlugin.JpegImageFile
# array 출력을 어떻게 할지 정하는 것
np.set_printpoints(formatter={'int':'{:>03d}'.format}, linewidth =80)

 def visualized_bw(img):
     w, h = img.shape
     plt.figure(figsize=(10,10))
     plt.imshow(img, cmap='binary')
     for i in range(w):
         for j in range(h):
             x = img[j, i]
             plt.annotate(x, xy=(j, i),
             horizontalalignment='center',
             verticalalignment='center',
             color='black' if x < 128 else 'white')

visualized_bw(img)
profile
매일 성장하고 있습니다

0개의 댓글