영상처리/OpenCV

이미지 변환 (확대/축소)

성혜영 2022. 6. 8. 13:43

이미지 변환

이미지 데이터의 개수를 늘리거나 줄여 알고리즘의 연산량을 줄이는 것을 주목적

변환의 종류 : 크기변환, 특정 요소의 위치 변경, 이미지의 회전

 

  1. 강체 변환 (Rigid Transformation)
  2. 유사 변환 (Similarity Transformation)
  3. 선형 변환 (Linear Transformation)
  4. 아핀 변환 (Affine Transformation)
  5. 원근 변환 (Perspective Transformation)

 

강체변환 = 유클리디언 변환 (Euclidean Transformation) :

변환의 기준점으로부터 크기와 각도가 보존되는 변환. > 평행이동(translation)과 회전(rotation)만 허용

 

유사변환 : 강체변환에 등방성(Isotropic) 크기변환(Scaling)까지 허용된 변환.

 

선형변환 : 벡터 공간에서의 이동 > 선형성을 갖는 변환. 이방성을 가질수도 있음.

 

아핀 변환 : 선형변환 + 이동변환

 

원근 변환 : 아핀변환 - 수평성

 

 

확대 & 축소

이미지 확대와 축소 : 이미지 피라미드를 활용해 이미지의 크기를 원하는 단계까지 샘플링하는 작업

 

이미지 피라미드 : 입력 이미지의 크기를 단계적으로 변화시켜 원하는 단계에 도달할 때까지 진행하는 분석 작업 > 가우시안 피라미드, 라플라시안 피라미드

 

이미지 확대(Pyramid Up)

# 이미지 확대 함수

dst = cv2.pyrUp(

    src,

    dstsize=None,

    borderType=None

)

 

입력 이미지(src)의 행과 열을 2배로 키워 이미지를 확대하는 변환 함수. 이미지를 흐림효과 후 업샘플링 적용. 입력 이미지에 새로운 열과 행을 추가해 짝수 행과 열을 만들고 0의 값 할당. 이후 색상이 결정되지 않는 픽셀은 근사값으로 채워 가우시안 필터로 컨벌루션 진행

새롭게 삽입된 요소 모두 픽셀값이 0이며, 각 차원의 방향으로 2배 피라미드 업샘플링 수행했기 때문에 평균 밝기로 복원하기 위해 4로 정규화된 커널 사용.



이미지 축소(Pyramid Down)

# 이미지 축소 함수

dst = cv2.pyrDown(

    src,

    dstsize=None,

    borderType=None

)

 

입력 이미지(src)의 행과 열을 2배로 줄여 이미지를 축소하는 변환 함수. 이미지를 흐림효과 후 다운샘플링 적용. 이미지를 2배 작게 만들어야 하므로 홀수 크기의 이미지에는 +1을 해서 짝수 크기의 이미지로 변경. Gi 레이어를 컨벌루션하고 모든 짝수행과 열을 제거해 Gi+1을 생성. 생성된레이어는 src의 ¼ 이미지를 가짐. (형렬이기 때문에 크기는 2배이나 면적은 4배)

 

# 이미지 축소

import cv2



src = cv2.imread("Chapter6/Example-06-02-Py/ferris-wheel.jpg")

dst = src.copy()



for i in range(3):

    dst = cv2.pyrDown(dst)



cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

반복문을 활용해 다운샘플링을 3회 적용해서 출력 이미지(dst) 크기를 따로 지정하지 않아도  ⅛ 크기로 변환. 입력 이미지(src)와 출력 이미지(src) 매개 변수에 동일한 변수를 구성한다면 간단하게 변환 가능. dst 변수에 원본 이미지를 복사해 메모리를 미리 할당한다면 반복문을 활용해 연속적으로 적용 가능.