xwMOOC 고생대 프로젝트

이미지 합치기

서로 다른 두가지 이미지를 가지고 이를 결합하여 새로운 이미지를 만드는 과정을 설명한다.

  1. 두 이미지를 다운로드 받아 로컬컴퓨터에 저장한다.
  2. 배경 이미지(큰 이미지)와 앞에 강조될 이미지(작은 이미지) 정보를 확인한다.
    • 작은 이미지 크기를 작게 축소한다.
  3. 작은 이미지를 큰 이미지 행렬에 오프셋을 두고 해당 크기만큼 치환한다.

두 이미지 결합

1. 결합할 이미지 대상

이미지넷에서 검색한 하늘 이미지와 구글 이미지 검색에서 라즈베리 파이 로고 두가지 이미지를 다운로드 받아 로컬 컴퓨터에 저장한다.

큰 이미지 작은 이미지
이미지넷 하늘 이미지 라즈베리 파이 로고 이미지

2. 두 이미지 정보 확인

sky.jpg 이미지와 raspberry-pi-logo.png 이미지 크기를 살펴보면 배경 하늘 이미지보다 로고 이미지가 훨씬 더 큰 것을 확인할 수 있다. 따라서 이를 축소할 필요가 있다.

===== Original Image Info =====
Sky Image :  (333, 500, 3)
RP Image  :  (599, 474, 3)

3. 로고 이미지 축소

로고 이미지를 \(\frac {1}{10}\) 비율로 축소한다. 축소된 이미지 정보는 다음과 같다.

===== Resized RP Logo Image Info =====
RP Image  :  (60, 47, 3)

4. 이미지 합치기

다양한 방법이 있지만, 배경하늘 이미지도 큰 행렬로 큰 행렬 특정 위치에 로고 이미지를 치환하여 두 이미지를 합치는 전략을 취한다. 먼저 오프셋을 두고 x, y 방향으로 10만큼 두고 이미지 크기에 해당되는 부분에 자리를 로고 이미지로 치환한다.

5. 전체 코드

import cv2

skyImg = cv2.imread('../fig/sky.jpg',1)
rplogoImg = cv2.imread('../fig/raspberry-pi-logo.png',1)

## Image info
print '===== Original Image Info ====='
print 'Sky Image : ', skyImg.shape
print 'RP Image  : ', rplogoImg.shape

## Image Resize
rplogoImgDownscale = cv2.resize(rplogoImg, None,
                                fx=0.1, fy=0.1, interpolation=cv2.INTER_AREA)

print '===== Resized RP Logo Image Info ====='
print 'RP Image  : ', rplogoImgDownscale.shape

## Image Addition
x_offset = y_offset = 10
skyImg[y_offset:y_offset + rplogoImgDownscale.shape[0],
       x_offset:x_offset + rplogoImgDownscale.shape[1]] = rplogoImgDownscale

## Result
cv2.imshow('Sky with RP Logo', skyImg)
cv2.waitKey(0)

cv2.destroyAllWindows()

6. 하나 더 1

알파채널을 이용하여 위에서 나온 검정색 사각형 부분을 제거하고, 두 이미지를 결합하는 코드

두 이미지 결합

import cv2

skyImg = cv2.imread('../fig/sky.jpg', -1)
rplogoImg = cv2.imread('../fig/raspberry-pi-logo.png', -1)

## Image info
print '===== Original Image Info ====='
print 'Sky Image : ', skyImg.shape
print 'RP Image  : ', rplogoImg.shape

## Image Resize
rp = cv2.resize(rplogoImg, None, fx=0.1, fy=0.1, interpolation=cv2.INTER_AREA)
                                
print '===== Resized RP Logo Image Info ====='
print 'RP Image  : ', rp.shape

## Image Addtion with Alpha
x_offset = y_offset = 10
for c in range(0,3):
    skyImg[y_offset:y_offset+rp.shape[0], x_offset:x_offset+rp.shape[1], c] = \
    rp[:,:,c] * (rp[:,:,3]/255.0) + \
    skyImg[y_offset:y_offset+rp.shape[0], x_offset:x_offset+rp.shape[1], c] * (1.0 - rp[:,:,3]/255.0)
    
## Result
cv2.imshow('Sky and RP Logo with alpha transparency ', skyImg)
cv2.waitKey(0)

cv2.destroyAllWindows()