OpenCV-Python 다른 크기 이미지 블렌딩

김지수·2021년 3월 25일
1

OpenCV

목록 보기
8/9
post-thumbnail

코드

import cv2
import numpy as np

# 이미지 읽기(img1 : 배경 이미지, img2 : 워터마크로 넣을 이미지)
# img2가 img1보다 작은 크기
img1 = cv2.imread('배경 이미지 파일경로')
img2 = cv2.imread('워터마크 이미지 파일경로')

# 배경, 워터마크 이미지 출력
cv2.imshow('bg_img',img1)
cv2.imshow('fw_img',img2)

# 워터마크로 넣을 이미지를 그레이스케일 색상공간으로 변환
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 그레이스케일 이미지를 임계값으로 이진화하여 마스크 생성
ret, mask = cv2.threshold(img2gray, 250, 255, cv2.THRESH_BINARY)
# 해당 마스크의 역처리(not 비트연산)
mask_inv = cv2.bitwise_not(mask)

# 마스크, 역마스크 이미지 출력
cv2.imshow('mask',mask)
cv2.imshow('mask_inv',mask_inv)

# 워터마크 이미지에서 워터마크 영역만 추출(and 비트연산, 역마스크 영역)
img2_fg = cv2.bitwise_and(img2, img2, mask = mask_inv)

# 이미지의 높이, 너비, 채널 수 구하기
height, width, channels = img2.shape
# 배경 이미지의 ROI(Region of Interest : 관심영역) 구하기
roi = img1[0:height, 0:width]

# 배경 이미지의 ROI 영역과 워터마크 이미지의 워터마크 영역을 블렌딩
dst = cv2.addWeighted(roi, 1, img2_fg, 0.5, 0)
# 배경 이미지의 ROI 영역을 위의 dst 이미지로 변경
img1[0:height, 0:width] = dst

# 블렌딩 이미지 출력
cv2.imshow('res',img1)

# 화면 출력창 대기/닫기
cv2.waitKey(0)
cv2.destroyAllWindows()

결과

설명

cv2.threshold() 메소드

Thresholding Value(문턱값)보다 크면 고정값으로 할당, 작으면 다른 고정된 값으로 할당

cv2.threshold(img, threshold_value, max_value, flag)

ParameterDescription
imgGrayscale 이미지
threshold_value픽셀 문턱값
max_value픽셀 문턱값보다 클 때 픽셀 최대값
(flag에 따라 픽셀 문턱값보다 작을 때 적용되는 최대값)
flag문턱값 적용 방법 또는 스타일

return : 이미지 배열

flagDescription
cv2.THRESH_BINARY픽셀값이 threshold_value보다 크면 value 할당, 작으면 0 할당
cv2.THRESH_BINARY_INV픽셀값이 threshold_value보다 크면 0 할당, 작으면 value 할당
cv2.THRESH_TRUNC픽셀값이 threshold_value보다 크면 threshold_value 할당, 작으면 픽셀값 유지
cv2.THRESH_TOZERO픽셀값이 threshold_value보다 크면 픽셀값 유지, 작으면 0 할당
cv2.THRESH_TOZERO_INV픽셀값이 threshold_value보다 크면 0 할당, 작으면 픽셀값 유지

[flag별 출력 이미지] (threshold_value : 240, max_value : 255)


배경 이미지의 roi 구하기

워터마크 이미지의 크기와 동일한 배경 이미지의 roi를 가져오기
(opencv 이미지에서는 원점이 좌측 상단에서부터 시작됨)

roi = img[ymin:ymax, xmin:xmax]



배경 이미지의 roi 이미지와 워터마크 이미지 블렌딩

배경 이미지에서 가져온 roi와 워터마크 이미지 블렌딩하기

dst = cv.addWeighted(roi, alpha, watermark_img, beta, gamma[, dst[, dtype]] )

ParameterDescription
roi배경 이미지의 roi
alpharoi의 가중치
watermark_img워터마크 이미지의
beta워터마크 이미지의 가중치
gamma각 합계에 추가 된 스칼라
dst입력 이미지와 크기와 및 채널 수가 동일한 출력 배열
dtype출력 배열의 선택적 깊이

return : 이미지 배열

배경 이미지의 roi 위치에 블렌딩 이미지 삽입

roi와 워터마크 이미지의 블렌딩 이미지를 배경 이미지의 roi 위치에 삽입

img1[ymin:ymax, xmin:xmax] = dst


비트연산 : 다음 게시물 👇

https://velog.io/@oosiz/OpenCV-Python-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%84%ED%8A%B8%EC%97%B0%EC%82%B0

profile
A Data human as a Learner, a Supporter, and a Listener

0개의 댓글