[OpenCv-python 기초 사용법] 이미지 연산처리를 통해 합성하기

2018. 5. 31. 22:40Python-이론/python-opencv

이미지 연산처리를 통해 합성하기



1 단순히 더해보기

우선 이기능을 실행 시키기 위해선 두 이미지의 크기가 동일해야한다. 만약 +를 이용해서 더했을 때는 255가 넘어가면 256을 나눈 값으로 대체한다. 하지만 cv2.add(src1, src2)를 사용할때 에는 255보다 크면 그냥 255로 값을 정한다.


예제 코드

import cv2
import numpy

ironMan = cv2.imread('images/ironMan.PNG')
thor = cv2.imread('images/thor.jpg')
thor = cv2.resize(thor, None, fx=702/thor.shape[1], fy=400/thor.shape[0]) #둘의 이미지크기를 같게 만들어줌 

plusImg = ironMan+thor
addImg = cv2.add(ironMan, thor)

cv2.imshow('originalironMan',ironMan)
cv2.imshow('originalThor',thor)
cv2.imshow('justPlus', plusImg)
cv2.imshow('add', addImg)
cv2.waitKey(0)
cv2.destroyAllWindows()





이미지 블렌딩하기

이번에는 트랙바를 만들어서 옮기면 이미지가 서서히 바뀌는 블렌딩효과를 주어보겠다. 우선 블렌딩 함수에 대해 알아보자


 


알파 값은 우리가 트랙바를 통해 줄 값이고 f0(X)는 첫 이미지, f1(X)는 두번째 이미지 1-알파 값에 의해 어느 이미지를 더 강조하게 되는지 위의 함수를 보면 쉽게 이해 할 수 있을 것이다.



예제 코드
import cv2
import numpy

def onChange(x):
    pass

ironMan = cv2.imread('images/ironMan.PNG')
thor = cv2.imread('images/thor.jpg')
thor = cv2.resize(thor, None, fx=702/thor.shape[1], fy=400/thor.shape[0])

cv2.namedWindow('blending', cv2.WINDOW_NORMAL)
cv2.createTrackbar('blending %','blending', 1, 100, onChange)

while True:
    i = cv2.getTrackbarPos('blending %', 'blending')
    img = cv2.addWeighted(ironMan, float(100-i)/100, thor, float(i)/100, 0) #블렌딩 함수 구현 
    cv2.imshow('blending', img)

    k = cv2.waitKey(1)
    if k == 27:
        break
cv2.destroyAllWindows()




이미지 비트 연산

이미지를 not, or, and, xor 등으로 연산을 계산해보겠습니다. 우리가 할것은 토니스타크의 회사인 스타크 인더스트리를 아이언맨 옆에 추가시켜 보겠습니다.



import cv2
import numpy

ironMan = cv2.imread('images/ironMan.PNG')
stark = cv2.imread('images/stark3.png')

cutImg = ironMan[0:225, 0:225]#스타크사 이미지 넣을 공간을 스타크 이미지의 크기만큼 짜른다. 
grayStark = cv2.cvtColor(stark, cv2.COLOR_BGR2GRAY)

ret, mask = cv2.threshold(grayStark, 100, 255, cv2.THRESH_BINARY)#문턱값을 설정하는 것인데 간단히 설명하면 제일 마지막 인자를 써주면 픽셀값이 75만 넘으면 그값을 225로 바꾸어 준다 라는 뜻이다
mask_inv = cv2.bitwise_not(mask) #하얀색 배경의 스타크사 이미지를 얻을 수 있다. 

fg = cv2.bitwise_and(stark, stark, mask=mask) #마스크는 잘보면 스타크 사는 흰색이고 배경은 검은색이다. 
#따라서 and연산자를 사용하기 때문에 일반 스타크 이미지와 같은것은 1 다른것은 0으로 표현한다. 
#검은화면에 원래색의 스타크사만 남게된 것이다. 

bg = cv2.bitwise_and(cutImg, cutImg, mask=mask_inv) #not 마스크는 배경이 흰색 스타크 사는 검은 색이다. 
# 따라서 원래의 배경에 검은색의 스타크 사만 남게 된다. 

img = cv2.add(fg,bg)
#둘을 더해주면 짜른 부위에 원래의 스타크 사 이미지가 들어가게된다. 
ironMan[0:225, 0:225] = img
#대입시켜주면 아이언맨 이미지에 스타크 사가 들어간 것을 알 수 있다. 
cv2.imshow('result', ironMan)
cv2.imshow('mask', mask)
cv2.imshow('mask_inv', mask_inv)
cv2.imshow('fg', fg)
cv2.imshow('bg', bg)
cv2.waitKey(0)
cv2.destroyAllWindows()


위의 코드에 나오는 문턱값은 제일 마지막 인자에 따라 사용도가 다르기 때문에 다른강의에 적겠다.