리매핑(remapping)
리매핑을 잘 활용하면 입력 영상을 직선이 아닌 곡선으로 표현할 수 있어 좀 더 자유도 있는 변환을 할 수 있다.
리매핑은 영상의 특성 위치 픽셀을 다른 위치에 재배치하는 일반적인 프로세스이다.
리매핑은 기하학적 변환을 맵핑한다. 출력 영상의 x,y 좌표에서 픽셀 값을 입력 영상에서 참조할건데 어느 위치를 참조할 것인지 나타내는 map x와 map y 함수를 정의한다.
출력 영상의 좌표를 입력 영상의 어느 좌표를 참조해서 갖고올 것이냐를 설정해서 출력 영상의 모든 픽셀 값을 셋팅해 출력 영상을 만들어내는 방법이다. 따라서 영상을 꿀렁꿀렁하게 하거나 휘게하는 것도 리매핑으로 할 수 있다.
어파인 변환, 투시 변환을 포함한 다양한 변환을 리매핑으로 표현할 수 있다.
✔︎ cv2.remap 리매핑 함수
dst = cv2.remap(src, map1, map2, interpolation, dst=None, borderMode=None, borderValue=None)
- src: 입력 영상
- map1: 결과 영상의 (x, y) 좌표가 참조할 입력 영상의 x좌표. 입력 영상과 크기는 같고, 타입은 np.float32인 numpy.ndarray.
- map2: 결과 영상의 (x, y) 좌표가 참조할 입력 영상의 y좌표.
- interpolation: 보간법
- dst: 출력 영상
- borderMode: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0.
map1은 x좌표, map2는 y좌표를 의미
💬 삼각함수를 이용한 리매핑 예제
import sys
import numpy as np
import cv2
src = cv2.imread('tekapo.bmp')
if src is None:
print('Image load failed!')
sys.exit()
h, w = src.shape[:2]
map2, map1 = np.indices((h, w), dtype=np.float32)
map2 = map2 + 10 * np.sin(map1 / 32)
dst = cv2.remap(src, map1, map2, cv2.INTER_CUBIC, borderMode=cv2.BORDER_DEFAULT)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
⬇︎
np.indices 함수로 행렬의 인덱스에 해당하는 x좌표값, y좌표값을 따로 따로 행렬의 형태로 변환해 주고, map2에 sin함수를 이용하여 파도를 만들어 준다.
borderMode는 cv2.BORDER_DEFAULT로 지정하여 빈 공간을 검은색이 아닌 주변 픽셀값을 대칭으로 설정해 주었다.
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상의 특징 추출 : 그래디언트와 에지 검출 (0) | 2022.02.04 |
---|---|
[OpenCV with Python] 영상의 특징 추출 : 영상의 미분과 소벨 필터 (0) | 2022.02.04 |
[OpenCV with Python] 영상 기하학적 변환 : 투시 변환 (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 어파인 변환 (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 영상의 회전 - cv2.getRotationMatrix2D (0) | 2022.02.02 |