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()
Thresholding Value(문턱값)보다 크면 고정값으로 할당, 작으면 다른 고정된 값으로 할당
cv2.threshold(img, threshold_value, max_value, flag)
Parameter | Description |
---|---|
img | Grayscale 이미지 |
threshold_value | 픽셀 문턱값 |
max_value | 픽셀 문턱값보다 클 때 픽셀 최대값 (flag에 따라 픽셀 문턱값보다 작을 때 적용되는 최대값) |
flag | 문턱값 적용 방법 또는 스타일 |
return : 이미지 배열
flag | Description |
---|---|
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를 가져오기
(opencv 이미지에서는 원점이 좌측 상단에서부터 시작됨)
roi = img[ymin:ymax, xmin:xmax]
배경 이미지에서 가져온 roi와 워터마크 이미지 블렌딩하기
dst = cv.addWeighted(roi, alpha, watermark_img, beta, gamma[, dst[, dtype]] )
Parameter | Description |
---|---|
roi | 배경 이미지의 roi |
alpha | roi의 가중치 |
watermark_img | 워터마크 이미지의 |
beta | 워터마크 이미지의 가중치 |
gamma | 각 합계에 추가 된 스칼라 |
dst | 입력 이미지와 크기와 및 채널 수가 동일한 출력 배열 |
dtype | 출력 배열의 선택적 깊이 |
return : 이미지 배열
roi와 워터마크 이미지의 블렌딩 이미지를 배경 이미지의 roi 위치에 삽입
img1[ymin:ymax, xmin:xmax] = dst