히비스서커스의 블로그

[Numpy] numpy로 이미지 처리하기 본문

Programming/Python

[Numpy] numpy로 이미지 처리하기

HibisCircus 2021. 6. 30. 17:39
728x90

파이썬으로 작업을 하다보면 numpy를 쓸 일이 정말 많은 것 같다. 사실 numpy를 많이 써보긴 하였으나 깊게 파면서 직접 코드를 짜본 적은 없는 것 같다. 하지만 이미지처리나 딥러닝을 python으로 잘 활용하기 위해서는 numpy를 잘 활용하는 것이 중요한 것 같다. 

https://numpy.org/

 

이번에는 이미지 분류를 하기 위해서 이미지의 라벨링을 하는 것과 배치 처리를 하는 여러 방법들 중 numpy를 활용한 방법을 정리해보았다.

 

먼저 이미지를 넣을 array를 x, 라벨을 넣을 array를 y로 하여 만들어준다.

import numpy as np

number_of_data = 1300  # 데이터 수
img_size = 256  # 이미지의 사이즈 (정사각형으로 간주)
color = 3  # 컬러는 3, 흑백은 1
batch_size = 32  # 배치사이즈


# 곱셈의 형태로 만들기

x = np.zeros(number_of_data*img_size*img_size*color, dtype=np.int32).reshape(number_of_data, img_size, img_size, color) 
y = np.zeros(number_of_data, dtype=np.int32)


# 덧셈의 형태로 만들기

x = np.zeros((number_of_data,) + (img_size, img_size) + (color,), dtype="float32")
y = np.zeros((number_of_data,) + (1,), dtype="uint8")


 

두 형태의 shape은 모두

x shape = (1300, 256, 256, 3)

y shape = (1300, 1)

의 형태로 같다.

 

 

이제 x에는 이미지의 픽셀값을, y에는 라벨링을 넣을 것이다.

 

import glob 
import PIL
import cv2


file_path = '~/image_path'


# PIL을 활용한 방법

i = 0
for file in sorted(glob.glob(file_path + '/normal/*.png'):
	img = np.array(Image.open(file), dtype=np.int32)  # PIL로 불러들인 이미지를 numpy array에 입력
    x[i, :, :, :] = img  # i번째에 이미지 픽셀값 입력
    y[i] = 0  # i번째에 normal을 0으로 라벨링
    i += 1
    
for file in sorted(glob.glob(file_path + '/cpe/*.png'):
	img = np.array(Image.open(file), dtype=np.int32) 
    x[i, :, :, :] = img
    y[i] = 1  
    i += 1

x = x/255.0  # 이미지 정규화


# openCV를 활용한 방법

for i, path in enumerate(sorted(glob.glob(file_path + '/*/*.png')):
	img = cv2.imread(path)  # opencv로 불러들인 이미지를 numpy array에 입력
    img = img.astype(np.float32)/255.0  # 이미지 정규화
    x[i] = img  # idx번째에 이미지 픽셀값 입력
    
    group = path.split('/')[-2]
    if group == 'normal':
    	label = 0  # normal을 0으로 라벨링
    else:
    	label = 1  
    y[i] = label  # i번째에 라벨링
       

 

위에서 첫번째 방법으로 하였다면 이번 것도 첫번째 방법으로 하면 좋을 것이고 다른 방법은 다른 방법으로 하는 것이 좋을 것이다. 

 

 

 

- 히비스서커스 -

 

 

 

 

 

 

728x90