Opencv 이미지 합성하기

Happy_JG·2023년 10월 23일
0

머신러닝

목록 보기
14/16

이미지를 합성하기 전에 사진 두 개를 준비하자.


싸이 얼굴에 호랑이를 합성해보도록 하자

이미지 확인

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

cv2.imshow('psy',psy)
cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

이미지가 잘 출력이 된다.

호랑이 이미지 크기 확인

tiger.shape
# y = 123
# x = 132
#(123, 132, 3)

싸이 이미지 크기 확인(ROI)

psy.shape
# 세로, 가로, 색상 채널

#(838, 630, 3)

싸이 얼굴 자르기

#좌 상단 좌표 : 280, 50 예측하자.
#우 하단 좌표 : 400, 200
# 싸이 얼굴 영역 자르기
# [열 = y, 행 = x]
sub_psy = psy[94:217, 239:371]

싸이 얼굴 합성(간단)

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

psy[94:217, 239:371] = tiger

cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

호랑이 이미지 쓸 부분, 안 쓸 부분 구분하기

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# psy[94:217, 239:371] = tiger

# 마스크 이진 이미지 만들기 (목적 = 쓸 부분과 안 쓸 부분 구분하기)
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

cv2.imshow('mask_b',mask_b)

# cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()


흰 부분은 쓰지 않고 까만 부분을 사용할 것이다.

이미지 색상 반전

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# psy[94:217, 239:371] = tiger

# 마스크 이진 이미지 만들기 (목적 = 쓸 부분과 안 쓸 부분 구분하기)
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

# 마스크 이미지 반전
mask_b_inv = cv2.bitwise_not(mask_b)

cv2.imshow('mask_b',mask_b)
cv2.imshow('mask_b_inv', mask_b_inv)

# cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

이로써 사용할 부분을 흰색으로 반전시켰다.

호랑이 이미지에서 사용할 영역의 값만 추출하기(흰 부분)

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# psy[94:217, 239:371] = tiger

# 마스크 이진 이미지 만들기 (목적 = 쓸 부분과 안 쓸 부분 구분하기)
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

# 마스크 이미지 반전
mask_b_inv = cv2.bitwise_not(mask_b)

# 호랑이 이미지에서 사용할 영역의 값만 추출하기(흰 부분)
sub_psy = psy[94:217, 239:371]

img_bg = cv2.bitwise_and(sub_psy, sub_psy, mask = mask_b_inv)
cv2.imshow('img_bg',img_bg)

# cv2.imshow('mask_b',mask_b)
# cv2.imshow('mask_b_inv', mask_b_inv)

# cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

합치기 전

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# psy[94:217, 239:371] = tiger

# 마스크 이진 이미지 만들기 (목적 = 쓸 부분과 안 쓸 부분 구분하기)
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

# 마스크 이미지 반전
mask_b_inv = cv2.bitwise_not(mask_b)

# 호랑이 이미지에서 사용할 영역의 값만 추출하기(흰 부분)
sub_psy = psy[94:217, 239:371]

img_bg = cv2.bitwise_and(sub_psy, sub_psy, mask = mask_b)
cv2.imshow('img_bg',img_bg)

img_fg = cv2.bitwise_and(tiger, tiger, mask = mask_b_inv)



# cv2.imshow('img_bg', img_bg)
# cv2.imshow('img_fg', img_fg)

# cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

두 이미지 합치기

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# psy[94:217, 239:371] = tiger

# 마스크 이진 이미지 만들기 (목적 = 쓸 부분과 안 쓸 부분 구분하기)
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

# 마스크 이미지 반전
mask_b_inv = cv2.bitwise_not(mask_b)

# 호랑이 이미지에서 사용할 영역의 값만 추출하기(흰 부분)
sub_psy = psy[94:217, 239:371]

img_bg = cv2.bitwise_and(sub_psy, sub_psy, mask = mask_b)
cv2.imshow('img_bg',img_bg)

img_fg = cv2.bitwise_and(tiger, tiger, mask = mask_b_inv)

#두 이미지 합치기
bg_fg = cv2.add(img_bg,img_fg)
cv2.imshow('bg_fg',bg_fg)



# cv2.imshow('img_bg', img_bg)
# cv2.imshow('img_fg', img_fg)

# cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

원래 이미지에 합성하기

import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# psy[94:217, 239:371] = tiger

# 마스크 이진 이미지 만들기 (목적 = 쓸 부분과 안 쓸 부분 구분하기)
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

# 마스크 이미지 반전
mask_b_inv = cv2.bitwise_not(mask_b)

# 호랑이 이미지에서 사용할 영역의 값만 추출하기(흰 부분)
sub_psy = psy[94:217, 239:371]

img_bg = cv2.bitwise_and(sub_psy, sub_psy, mask = mask_b)
cv2.imshow('img_bg',img_bg)

img_fg = cv2.bitwise_and(tiger, tiger, mask = mask_b_inv)

#두 이미지 합치기
bg_fg = cv2.add(img_bg,img_fg)
cv2.imshow('bg_fg',bg_fg)

# 원래 이미지에 합성하기
psy[94:217, 239:371] = bg_fg
cv2.imshow('psy',psy)

# cv2.imshow('img_bg', img_bg)
# cv2.imshow('img_fg', img_fg)

# cv2.imshow('psy',psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()

profile
hello!

0개의 댓글

관련 채용 정보