728x90
반응형
SMALL
1. 영상의 변환
- 영상을 구성하는 픽셀의 배치 구조를 변경함으로 전체 영상의 모양을 바꾸는 작업
1-1. 이미지 이동(translate)
- 원래 있던 좌표에 이동시키려는 거리만큼 덧셈
x_new = x_old + d1
y_new = y_old + d2 - 이미지 변환 행렬(2*3 행렬)
- cv2.warpaffine(영상, 2*3 변환행렬, 결과이미지=None, 보간법알고리즘)
[ 1 0 d1
0 1 d2 ]
- 결과: (0, 0) 이면 입력 영상과 크기가 같은 행렬을 반환
- 결과: (0, 0) 이면 입력 영상과 크기가 같은 행렬을 반환
- 보간법알고리즘(가장자리를 어떻게 처리할 것인지)
- cv2.INTER_LINEAR: 기본값. 인접한 4개 픽셀 값에 거리 가중치 사용
- 속도가 빠르지만, 퀄리티가 떨어짐
- cv2.INTER_NEAREST: 가장 가까운 픽셀 값을 사용
- 속도가 가장 빠르고 가장 가까운 픽셀들과 어우러지기 때문에 퀄러티가 보장
- cv2.INTER_AREA: 픽셀 영역 관계를 이용한 재 샘플링
- 영역적인 정보를 추출해서 결과 영상을 세팅하는 방법이며 다운 샘플링(자기가 가지고 있는 영상의 픽셀을 주변과 어울리게 다시 샘플링) 시 효과적
- 다운샘플링: 이미지를 축소할 때
- cv2.INTER_CUBIC: 인접한 16개 픽셀 값에 거리 가중치 사용
- 퀄리티는 가장 좋지만 속도가 느림
- cv2.INTER_LINEAR: 기본값. 인접한 4개 픽셀 값에 거리 가중치 사용
import cv2
import numpy as np
img = cv2.imread('dog.bmp')
# [1, 0, d1(x축)], [0, 1, d2(y축)]
aff = np.array([[1, 0, 150], [0, 1, 100]], dtype=np.float32)
#(0, 0): 입력 영상과 크기가 같은 행렬을 반환
dst = cv2.warpAffine(img, aff, (0, 0))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
1-2. 크기변환(resize)
- 영상의 크기를 원본 영상보다 크게 또는 작게 만드는 변환
- cv2.resize(영상, 결과 영상, x와 y방향 스케일 비율, 보간법)
import cv2
img = cv2.imread('dog.bmp')
dst1 = cv2.resize(img, (1280, 1024), interpolation=cv2.INTER_NEAREST)
dst2 = cv2.resize(img, (1280, 1024), interpolation=cv2.INTER_CUBIC)
cv2.imshow('img', img)
cv2.imshow('dst1', dst1[400:800, 200:600]) # 확대
cv2.imshow('dst2', dst2[400:800, 200:600])
cv2.waitKey()
1-3. 회전(rotation)
- 영상을 특정 각도만큼 회전시키는 변환(반시계 방향)
- cv2.getRotationMatrix2D(중심좌표, 회전각도, 확대비율) ➡️ affine 행렬에 적용
- 회전각도: 기본값은 반시계방향, 음수는 시계방향
import cv2
img = cv2.imread('dog.bmp')
# 중앙 좌표
cp = (img.shape[1]/2, img.shape[0]/2)
rot = cv2.getRotationMatrix2D(cp, 20, 0.5) # (센터좌표, 앵글값, 크기조절)
# print(rot)
dst = cv2.warpAffine(img, rot, (0, 0))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
1-4. 투시 변환
- 직사각형 형태의 영상을 임의의 입체감 있는 사각형 형태로 변경할 수 있는 변환
- 원본 영상에 있는 직선은 결과 영상에서 그대로 유지되지 않고 평행 관계가 깨질 수 있음
- 투시 변환은 보통 3*3 크기의 실수 행렬로 표현
(8개의 파라미터로 표현할 수 있지만, 좌표 계산 편의상 9개의 원소를 갖는 행렬로 사용 - cv2.getPerspectiveTransform(영상, 4개의 결과 좌표점) -> 결과는 투시변환 행렬을 리턴
- cv2.warpPerspective(영상, 투시 변환 행렬, 결과 영상 크기)
import cv2
import numpy as np
img = cv2.imread('pic.jpg')
w, h = 600, 400
srcQuad = np.array([[370, 173], [1223, 157], [1422, 844], [211, 865]], np.float32)
# 결과가 출력될 영상의 좌표
dstQuad = np.array([[0, 0], [w, 0], [w, h], [0, h]], np.float32)
pers = cv2.getPerspectiveTransform(srcQuad, dstQuad)
dst = cv2.warpPerspective(img, pers, (w, h))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
728x90
반응형
LIST
'Python > Computer Vision' 카테고리의 다른 글
[파이썬, Python] OpenCV - 모폴로지 처리, 모폴로지 연산 (0) | 2023.09.02 |
---|---|
[파이썬, Python] OpenCV - 영상의 필터링, 블러링, 엣지(Edge)검출 (1) | 2023.09.01 |
[파이썬, Python] OpenCV - 이미지 유사도 판단 (1) | 2023.08.27 |
[파이썬, Python] OpenCV - 영상의 이진화 (0) | 2023.08.27 |
[파이썬, Python] OpenCV - 관심영역(ROI) (0) | 2023.08.25 |