상위 목록: 하위 목록: 작성 날짜: 읽는 데 8 분 소요

리매핑(Remapping)

리매핑(Remapping)은 입력 이미지에 기하학적인 변형을 적용하는 방법입니다.

기하학적 변환에서 다루었던 아핀 변환(Affine Transform)원근 변환(Perspective Transform)은 이미지에 변환 행렬을 적용하여, 이미지를 변경합니다.

리매핑은 이미지에 변환 행렬 연산을 적용하는 것이 아닌, 비선형 변환을 적용할 수 있습니다.

즉, 픽셀들의 좌표를 임의의 특정 좌표로 옮겨 이미지를 변경하는 작업을 의미합니다.



메인 코드

import cv2
import numpy as np

src = cv2.imread("buildings.jpg")
height, width = src.shape[:2]
map2, map1 = np.indices((height, width), dtype=np.float32)

map1 = map1 + width / 100 * np.sin(map1)
map2 = map2 + height / 100 * np.cos(map2)

dst = cv2.remap(src, map1, map2, cv2.INTER_CUBIC)
cv2.imshow("dst", dst)
cv2.waitKey()


세부 코드

map2, map1 = np.indices((height, width), dtype=np.float32)

색인 배열 생성 함수(np.indices)을 활용해 원본 이미지 크기와 동일한 색인 배열을 생성합니다.

np.indices((높이, 너비), 정밀도)를 의미하며, Y축 좌표 색인 행렬, X축 좌표 색인 행렬을 반환합니다.

여기서 이동되는 좌표의 값은 정수형이 아닌, 실수형을 갖습니다.


map1 = map1 + width / 100 * np.sin(map1)
map2 = map2 + height / 100 * np.cos(map2)

map1map2에 임의의 삼각 함수를 적용하여 행렬의 형태를 변경합니다.

map1과 map2는 매핑될 좌표의 값을 의미하므로, 해당 행렬의 값을 변경하면 최종 반환 이미지의 형태가 달라집니다.

이 행렬의 값을 대칭하거나 회전한다면, 기존의 기하학적 변환과 동일한 형태의 결과를 얻을 수 있습니다.


dst = cv2.remap(src, map1, map2, cv2.INTER_CUBIC)

리매핑 함수(cv2.remap)을 활용하여 원본 이미지에 리매핑을 적용합니다.

cv2.remap(원본 이미지, X축 좌표 색인 행렬, Y축 좌표 색인 행렬, 보간법, 외삽법, 외삽 색상)을 의미합니다.

원본 이미지의 픽셀 배열을 X축 좌표 색인 행렬Y축 좌표 색인 행렬의 값을 적용하여 픽셀들을 이동시킵니다.

색인 행렬의 값은 정수 좌표가 아니므로, 보간법과 외삽법을 적용합니다.

보간법과 외삽법은 제 8강 - 크기 조절제 13강 - 흐림 효과에서 내용을 확인하실 수 있습니다.



출력 결과

댓글 남기기