본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 영상의 변환

by coding-choonsik 2023. 8. 29.
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) 이면 입력 영상과 크기가 같은 행렬을 반환
       
  • 보간법알고리즘(가장자리를 어떻게 처리할 것인지)
    • cv2.INTER_LINEAR: 기본값. 인접한 4개 픽셀 값에 거리 가중치 사용
      • 속도가 빠르지만, 퀄리티가 떨어짐
    • cv2.INTER_NEAREST: 가장 가까운 픽셀 값을 사용
      • 속도가 가장 빠르고 가장 가까운 픽셀들과 어우러지기 때문에 퀄러티가 보장
    • cv2.INTER_AREA: 픽셀 영역 관계를 이용한 재 샘플링
      • 영역적인 정보를 추출해서 결과 영상을 세팅하는 방법이며 다운 샘플링(자기가 가지고 있는 영상의 픽셀을 주변과 어울리게 다시 샘플링) 시 효과적
      • 다운샘플링: 이미지를 축소할 때
    • cv2.INTER_CUBIC: 인접한 16개 픽셀 값에 거리 가중치 사용
      • 퀄리티는 가장 좋지만 속도가 느림

 

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()

▲ img와 dst


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()

▲ 원본 img

 

▲dst1과 dst2


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()

▲img와 dst



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()

▲ img를 투시변환한 dst

 

 

728x90
반응형
LIST