안녕하세요! 오늘은 그동안 배운 기하학적 변환 기술들을 총동원하여 모자이크 처리, 리퀴파이 도구, 그리고 왜곡 거울 카메라를 직접 구현해보는 실습을 진행하겠습니다. 단순히 이론을 배우는 것을 넘어 실제 서비스에서 활용되는 기능들이 어떻게 동작하는지 확인해 보시기 바랍니다.
1. 실습 1: 모자이크 처리 (Mosaic)
모자이크의 원리는 아주 간단합니다. 특정 영역의 이미지를 아주 작게 축소했다가 다시 원래 크기로 확대하는 것입니다. 작은 이미지를 크게 늘리면 픽셀 정보가 손실되면서 이미지가 깨지게 되는데, 이를 활용하는 방식입니다.
- 핵심 로직: cv2.resize()를 이용해 1/rate 비율로 축소 후 다시 원래 크기로 확대합니다.
- 보간법: 확대 시 cv2.INTER_AREA를 사용하면 픽셀이 뭉개지는 효과가 더욱 뚜렷해집니다.
📍 모자이크 처리 예제 코드
import cv2
rate = 15 # 축소 비율
win_title = 'mosaic'
img = cv2.imread('taekwonv1.jpg')
while True:
x, y, w, h = cv2.selectROI(win_title, img, False)
if w and h:
roi = img[y:y+h, x:x+w]
# 축소했다가 다시 확대하여 픽셀 깨뜨리기
roi = cv2.resize(roi, (w//rate, h//rate))
roi = cv2.resize(roi, (w, h), interpolation=cv2.INTER_AREA)
img[y:y+h, x:x+w] = roi
cv2.imshow(win_title, img)
else:
break
cv2.destroyAllWindows()
2. 실습 2: 리퀴파이 도구 (Liquify)
포토샵의 '픽셀 유동화'와 같은 기능입니다. 특정 지점을 마우스로 밀어내어 이미지를 액체처럼 흐물거리게 변형합니다.
- 원리: 사각형 관심 영역을 4개의 삼각형으로 나눕니다. 마우스 드래그로 중앙점의 위치가 바뀌면, 바뀐 좌표를 기준으로 4개의 삼각형에 각각 **어핀 변환(Affine Transform)**을 적용하여 이미지를 뒤틉니다.
📍 리퀴파이 핵심 로직
- 마우스 클릭 지점 주변을 ROI로 지정합니다.
- ROI 내부를 4개의 삼각형 영역으로 구분합니다.
- 드래그가 끝난 지점을 새 꼭짓점으로 하여 cv2.getAffineTransform()으로 변환 행렬을 구합니다.
- cv2.fillConvexPoly()로 만든 마스크를 이용해 변환된 삼각형들을 하나로 합성합니다.
3. 실습 3: 왜곡 거울 카메라 (Distortion Mirror)
리매핑(cv2.remap) 기능을 활용하면 실시간 카메라 영상에 다양한 왜곡 효과를 줄 수 있습니다. 상하좌우 대칭, 물결 효과, 오목/볼록 렌즈 효과를 한 화면에 구현하는 실습입니다.
📍 왜곡 거울 핵심 연산
- 좌우 대칭: map_x 좌표를 cols - map_x - 1로 연산합니다.
- 물결 효과: sin 함수를 좌표에 더해 파동을 만듭니다.
- 렌즈 효과: 직교 좌표를 극좌표로 변환(cartToPolar)한 뒤, 반지름 $r$에 지수 연산을 적용하고 다시 복원합니다.
# 물결 효과 매핑 좌표 연산 예시
map_wave_x = map_x + 15 * np.sin(map_y / 20)
map_wave_y = map_y + 15 * np.sin(map_x / 20)
# 리매핑 적용
wave = cv2.remap(frame, map_wave_x, map_wave_y, cv2.INTER_LINEAR, None, cv2.BORDER_REPLICATE)
🛠️ 실무 활용 팁
- 연산 속도: 리매핑 배열(map_x, map_y)은 매 프레임마다 새로 생성하면 속도가 매우 느려집니다. 루프 밖에서 미리 생성해두고 재사용하는 것이 성능 최적화의 핵심입니다.
- 보간법: 리퀴파이나 렌즈 왜곡 시 cv2.INTER_LINEAR를 사용하면 변형된 경계선이 부드럽게 처리됩니다.
- 마스킹: 복잡한 뒤틀기(삼각형 어핀 변환 등)에서는 항상 결과물에서 필요한 영역만 골라내는 마스킹 작업이 병행되어야 자연스러운 합성이 가능합니다.
🚀 마치며
지금까지 배운 기하학적 변환들을 조합하면 단순한 이미지 편집부터 고성능 카메라 필터까지 다양한 기능을 직접 만들 수 있습니다. 특히 리퀴파이의 삼각형 분할 어핀 변환 방식은 이미지 워핑의 아주 세련된 구현 방식 중 하나입니다.
궁금하신 점은 댓글로 남겨주시기 바랍니다. :)
반응형
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📸 [OpenCV 기초] 리매핑(Remapping)과 렌즈 왜곡(Distortion) 완벽 정리 (0) | 2026.01.07 |
|---|---|
| 📸 [OpenCV 기초] 이미지 이동, 확대/축소, 회전 완벽 정리 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 이미지 유사도 비교부터 모션 감지 CCTV까지 실습 완벽 정리 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 2차원 히스토그램과 역투영(Back Projection) 완벽 정리 (0) | 2026.01.07 |
| 📊 [OpenCV 기초] 히스토그램과 화질 개선 (정규화, 평탄화, CLAHE) (0) | 2026.01.07 |