728x90

스파르타 코딩클럽의 딥러닝 이미지 처리 수업을 기반으로 공부한 내용을 정리하고 있습니다.

 

관련 논문 : arxiv.org/pdf/1603.08511.pdf

 

실제로 우리가 아는 흑백 사진은 gray scale(그레이스케일) 이미지이다.

실제 이미지 프로세싱에서 흑백 이미지는 정말 흑과 백으로만 이루어져 있다.

 

Lab 컬러시스템 이해하기

L (Luminosity) - 명도, 이미지의 밝기

a - 빨강 / 초록의 보색(a complementary color)축

b - 노랑 / 파랑의 보색(a complementary color)축

 

이 모델은 이미지를 Lab 컬러로 변경한 후 L 채널을 입력으로 받아 ab 채널을 예측해내는 모델입니다.

BGR과 마찬가지로 Lab 또한 이미지를 표현하는 하나의 체계인데 디자이너들이 여러 종류의 모니터로 같은 사진을 볼 때 차이가 없도록 하기 위해 고안되었다고 한다.

 

이미지의 명도 값(L)을 추출해내고, 명도 값을 모델에 넣어 나머지 ab 채널의 값을 추론할 것이다.

그리고 추론한 ab 값과 명도 값을 합쳐서 완전한 Lab 이미지를 만들어내고

그걸 다시 BGR 컬러 시스템으로 바꿔서 우리가 볼 수 있게 만들 것이다.

 

패키지와 모델 로드하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#패키지 로드하기
import cv2
import numpy as np
 
#모델로드하기
proto = '모델'
weights = '모델'
 
#net이라는 변수에 딥러닝 프레임 워크를 선언한다.
net = cv2.dnn.readNetFromCaffe(proto, weights)
 
pts_in_hull = np.load('모델')
pts_in_hull = pts_in_hull.transpose().reshape(231311).astype(np.float32)
net.getLayer(net.getLayerId('class8_ab')).blobs = [pts_in_hull]
 
net.getLayer(net.getLayerId('conv8_313_rh')).blobs = [np.full((1313), 2.606, np.float32)]
cs
  • 모델 로드에 대한 하나의 기법이며 완전히 암기할 필요는 없다. 
  • 이번에는 딥러닝 모델의 "readNetFromCaffe" 라는 프레임워크를 활용했는데 이전에 사용한 torch와 같이 하나의 프레임 워크 중 하나이다.

 

이미지 전처리하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
img = cv2.imread('imgs/02.jpg')
 
h, w, c = img.shape
 
img_input = img.copy()
 
img_input = img_input.astype('float32'/ 255.
#이미지 형태 변경
img_lab = cv2.cvtColor(img_input, cv2.COLOR_BGR2Lab)
 
#l 채널만 걸러내기 ,  ab의 형태로 이미지를 처리하기
img_l = img_lab[:, :, 0:1]
 
blob = cv2.dnn.blobFromImage(img_l, size=(224224), mean=[505050])
 
net.setInput(blob)
output = net.forward()
#여기까지가 컴퓨터가 이해할 수 있는 언어로 출력된다.
cs
  • img_input.astype('float32') / 255 : float 32 비트 형태로, 이미지를 바꾸어라는 의미의 처리 과정이다.  보통 딥러닝 모델을 학습 시킬 때 소수점 형태로 학습 시키기 때문에, 소수점 형태로 타입을 바꿔주는 것이다. ( img_input이 원래는 정수 형태로 출력되기 때문이다.)
  • 그리고 BGR형태를 Lab 형태로 바꿔준다.

 

이미지 후처리 하기

1
2
3
4
5
6
7
8
9
10
11
12
#우리가 알아볼 수 있도록 후처리 해주기
output = output.squeeze().transpose((120))
 
output_resized = cv2.resize(output, (w, h))
 
# l과 ab를 합쳐서 lab 시스템의 이미지로 만들어주기
output_lab = np.concatenate([img_l, output_resized], axis=2)
 
output_bgr = cv2.cvtColor(output_lab, cv2.COLOR_Lab2BGR)
output_bgr = output_bgr * 255
output_bgr = np.clip(output_bgr, 0255)
output_bgr = output_bgr.astype('uint8')
cs
  • 모델에서 나온 결과값이 ab 채널이므로 앞에 L 채널을 붙여서 이미지를 전체적으로 완성시킵니다.
  • Lab 을 우리가 볼 수 있는 BGR 채널로 다시 변경시킵니다.
  • 모델에 넣기 전에 255 로 나누었으므로 다시 255를 곱합니다.
  • 이상한 값을 없애기위해 0-255 사이에 있는 값이 아니라면 없애버립니다.
  • float32 데이터를 uint8 의 이미지 형태로 변환합니다.

 

이미지 출력하기

1
2
3
4
#이미지 출력하기
cv2.imshow('img', img_input)
cv2.imshow('result', output_bgr)
cv2.waitKey(0)
cs

 

 

 

728x90

+ Recent posts