안녕하세요! 오늘은 OpenCV를 활용한 이미지 연산의 핵심, 사칙연산과 합성, 그리고 비트와이즈(Bitwise) 연산에 대해 알아보겠습니다. 단순히 이미지를 더하고 빼는 것을 넘어, 두 영상을 자연스럽게 섞거나 특정 영역만 오려내는 고급 기법들을 정리했습니다.
1. 이미지의 사칙연산: NumPy vs OpenCV
이미지는 결국 수치 데이터의 집합이므로 NumPy 연산이 가능합니다. 하지만 OpenCV는 별도의 연산 함수를 제공하는데, 그 이유는 값의 범위 제한(Saturation) 때문입니다.
- NumPy 연산: 255를 초과하면 다시 0부터 시작합니다(Modulo 연산). 결과가 거뭇거뭇하게 깨질 수 있습니다.
- OpenCV 연산: 255보다 크면 255로, 0보다 작으면 0으로 고정합니다. 영상 처리에 훨씬 안정적입니다.
| 함수 | 역할 | 특징 |
| cv2.add() | 두 이미지 더하기 | 255 초과 시 255로 포화(Saturation) |
| cv2.subtract() | 이미지 빼기 | 0 미만 시 0으로 포화 |
| cv2.multiply() | 이미지 곱하기 | 명암 조절 등에 활용 |
| cv2.divide() | 이미지 나누기 | 영상의 차이 분석 등에 활용 |
2. 알파 블렌딩 (Alpha Blending)
두 이미지를 자연스럽게 합성하려면 각 이미지에 가중치를 주어 합쳐야 합니다. 이를 알파 블렌딩이라고 하며, 투명도 조절 효과를 낼 수 있습니다.
공식:

import cv2
# 가중치 5:5로 합성
dst = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
3. 비트와이즈 연산과 마스킹 (Bitwise & Masking)
비트 단위 연산은 이미지에서 특정 모양으로 영역을 추출하거나 합성할 때 매우 유용합니다.
- cv2.bitwise_and: 두 영역이 겹치는 부분만 추출 (마스킹의 핵심)
- cv2.bitwise_or: 두 영역의 합집합
- cv2.bitwise_xor: 겹치지 않는 부분만 추출
- cv2.bitwise_not: 색상 반전
마스킹(Masking)은 이 AND 연산을 응용한 것입니다. 배경이 검은색(0)이고 원하는 모양이 흰색(255)인 마스크를 원본과 AND 연산하면, 흰색 부분의 이미지만 쏙 뽑아낼 수 있습니다.
4. 이미지 차이 분석 (Absdiff)
두 이미지에서 무엇이 달라졌는지 찾고 싶을 때는 cv2.absdiff()를 사용합니다. 픽셀 값 차이의 절댓값을 반환하므로, 미세한 변화도 감지할 수 있어 '틀린 그림 찾기'나 '침입자 감지' 등에 활용됩니다.
# 흰색 원 모양의 마스크 생성 후 원본과 AND 연산
mask = np.zeros_like(img)
cv2.circle(mask, (center_x, center_y), radius, (255, 255, 255), -1)
masked_img = cv2.bitwise_and(img, mask)
5. 자연스러운 합성: Seamless Cloning
단순히 이미지를 덧셈하면 경계선이 부자연스럽게 보입니다. OpenCV의 cv2.seamlessClone()은 주변 환경의 질감과 조명을 고려하여 경계를 뭉개지 않고 자연스럽게 합성해줍니다.
- cv2.NORMAL_CLONE: 전경의 원본 특징을 최대한 유지
- cv2.MIXED_CLONE: 배경과 전경을 조화롭게 혼합
🛠️ 핵심 요약 가이드
- 안정성: 단순 합산보다는 cv2.add()를 사용하여 값의 범위를 제어하십시오.
- 합성: 가중치를 조절하는 cv2.addWeighted()가 블렌딩의 기본입니다.
- 정교한 추출: cv2.inRange()로 마스크를 만들고 cv2.bitwise_and()로 원하는 색상 영역만 추출할 수 있습니다.
- 고급 합성: 알파 채널이 없어도 cv2.seamlessClone()을 쓰면 주변 맥락에 맞는 합성이 가능합니다.
🚀 마치며
이미지 연산은 픽셀 하나하나를 제어하는 정교한 작업입니다. 연산의 결과가 데이터 타입의 범위(uint8)를 벗어나지 않도록 주의하는 것이 가장 중요합니다.
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📸 [OpenCV 기초] 2차원 히스토그램과 역투영(Back Projection) 완벽 정리 (0) | 2026.01.07 |
|---|---|
| 📊 [OpenCV 기초] 히스토그램과 화질 개선 (정규화, 평탄화, CLAHE) (0) | 2026.01.07 |
| 🌓 [OpenCV 기초] 스레시홀딩(Thresholding)과 오츠의 알고리즘 (0) | 2026.01.07 |
| 🎨 [OpenCV 기초] 이미지 색상 표현 방식 (BGR, HSV, YUV) 이해하기 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 이미지 내 관심영역(ROI) 표시 및 활용하기 (0) | 2026.01.07 |