728x90
OpenCV로 이미지 끼리 합성을 하는 방법을 알아보자.
이미지 합성을 하기 위해서는 OpenCV에서 제공하는 비트 연산 기능을 이용하면 된다.
비트 연산 기능을 이용하여 배경 사진에 특정 로고 사진을 합성해보자
1. 로고 이미지 이진화
img_logo = cv2.imread('logo.png')
img_gray = cv2.cvtColor(img_logo, cv2.COLOR_BGR2GRAY) # 이진화 전 회색 처리 필수
ret, img_mask = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)
img_mask_inv = cv2.bitwise_not(img_mask)
cv2.imshow('img_mask', img_mask)
cv2.imshow('img_mask_inv', img_mask_inv)
cv2.waitKey()
cv2.destroyAllWindows()
- cv.threshold(img_gray, 200, 255, cv.THRESH_BINARY)를 사용하여 이진화를 진행한다. 해당 코드를 보면 픽셀이 200을 넘는 부분은 흰색인 배경만 존재하기 때문에 배경을 제외하고는 검은색으로 변환 될 것이다. *** 흰색 픽셀: 255, 검정색 픽셀: 0**
- img_mask_inv = cv2.bitwise_not(img_mask) 는 위 바이너리 이미지를 반전 시키는 코드이다. 해당 이미지도 이미지 합성 시에 꼭 필요하다.
2. 로고 이미지 크기로 배경 이미지 잘라내기
img_background = cv2.imread('background.png')
height, width = img_logo.shape[:2]
img_roi = img_background[0:height, 0:width]
cv2.imshow('imgroi', img_roi)
cv2.waitKey()
cv2.destroyAllWindows()
- 로고 이미지를 배경 이미지의 원하는 위치에 삽입을 하려면 해당 부분의 로고 이미지 크기 만큼 잘라낸다.
- 잘라낸 배경 이미지에 로고 이미지와 비트 연산을 진행해야 한다.
3. 로고 이미지와 배경 이미지 합성 연산
img1 = cv2.bitwise_and(img_logo, img_logo, mask = img_mask_inv)
img2 = cv2.bitwise_and(img_roi, img_roi, mask=img_mask)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.waitKey()
cv2.destroyAllWindows()
- cv2.bitwise_and(img_logo, img_logo, mask = img_mask_inv) 를 통해 로고 이미지 및 배경 이미지와 앞서 이진화를 진행한 바이너리 이미지와 AND 연산한다.
- 위 AND 연산 결과로 나온 로고 이미지(img1)와 배경 이미지(img2) 자체를 더한다.
dst = cv2.add(img1, img2)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
4. 합성이 완료된 이미지 원본 이미지에 덮어 씌우기
img_background[0:height, 0:width] = dst
cv2.imshow('result', img_background)
cv2.waitKey()
cv2.destroyAllWindows()
- 합성이 완료된 이미지 부분을 원본 이미지의 부분과 일치 시켜 덮어 씌운다.
※ 결과
728x90
'Python > OpenCV' 카테고리의 다른 글
[OpenCV] 이미지의 특정 위치 좌표 추출 (0) | 2024.02.21 |
---|---|
[OpenCV] 이미지 윤곽선 검출 (0) | 2024.02.07 |
[OpenCV] OpenCV 미니 창에 마우스 이벤트 처리하기 (0) | 2023.12.30 |
[OpenCV] OpenCV를 이용하여 동영상 출력 (2) | 2023.12.19 |