[OpenCV] 이미지 크기 조정

8796 단어 pythonopencvTILTIL

이미지의 크기를 조정하려면 지정된 배율을 고려하여 각 축(높이 및 너비)을 따라 크기를 조정하거나 원하는 높이와 너비를 설정하면 된다.

이미지 크기를 조정할 때

  • 크기 조정된 이미지에서도 동일하게 유지하려면, 이미지의 원래 가로 세로 비율(높이별 너비)을 유지해야 한다.
  • 이미지 크기를 줄이려면 픽셀을 다시 추출해야 합니다.
  • 이미지 크기를 늘리려면 이미지를 재구성해야 한다. 즉, 새 픽셀을 삽입해야 한다.

이미지 읽기

일단 이미지 크기를 줄이거나 늘리기 위해서는 이미지를 읽어야 한다.

import cv2
import numpy as np

image = cv2.imread('image.jpg')

원본 크기 알아내기

이미지 크기를 조정하기 전에 이미지 원본의 크기를 얻어야 한다.

image.shape

# shape는 높이, 너비 및 채널 수의 세 가지 값을 반환한다
h, w, c = image.shape

OpenCV는 이미지 모양의 포맷은 높이 너비 채널 형식이다. 하지만 일부 다른 이미지 처리 라이브러리에서는 너비, 높이 형태로 출력된다.

OpenCV를 사용해서 이미지를 읽으면 NumPy 배열로 표시된다. 그리고 일반적으로 행 열(행은 높이를 나타내고, 열은 너비를 나타낸다)의 관점에서 배열의 모양을 항상 참조한다. 따라서 이러한 모양을 얻기 위해 OpenCV로 이미지를 읽을 때 동일한 NumPy 배열 규칙(높이 너비 * 채널의 형태)이 적용된다.

크기 조정

resize()

cv2.resize(src, dsize, [fx, fy, interpolation])

src: 입력 이미지의 경로가 있는 문자열
dsize: 출력 이미지의 원하는 크기로, 높이와 너비를 새로 지정
fx: 수평 축을 따라 배율을 조정
fy: 수직 축을 따라 배율을 조정
interpolation: 이미지 크기를 조정하는 다양한 방법의 옵션을 제공

너비와 높이를 지정하여 크기 조정

  • 축소시킬 너비를 300으로, 높이를 200으로 설정했다.
  • 증가시킬 너비를 600으로, 높이를 400으로 설정했다.
  • 이 두 값은 resize()함수에 필요한 2D 벡터로 결합된다.
  • 또한 기본 값이 되는 보간 방법을 지정한다.
# 축소
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resized_down = cv2.resize(image, down_points, interpolation=cv2.INTER_LINEAR)

# 확대
up_width = 600
up_height = 400
up_points = (up_width, up_height)
# resize the image
resized_up = cv2.resize(image, up_points, interpolation=cv2.INTER_LINEAR)

크기 조정시킨 이미지 표시

cv2.imshow('Resized Down', resized_down)
cv2.waitKey()
cv2.imshow('Resized Up', resized_up)
cv2.waitKey()
cv2.destroyAllWindows()

왼쪽에는 크기가 축소된 이미지이고, 오른쪽에는 크기가 확대된 이미지다. 크기 조정 작업이 예상대로 정의한 새 높이 및 너비 매개 변수에 따라 이미지가 더 커지거나 작아졌다. 그러나 한 가지 주목할 점은 폭과 높이에 대한 명시적인 값을 정의함으로써 이러한 크기 조정은 결과 이미지를 왜곡시키고 있다. 즉, 이미지의 가로 세로 비율이 그대로 유지되지 않는다.

이것을 고치기 위해서는 크기를 조정할 때 배율 인수를 사용하는 방법을 알아야 한다.

배율로 크기 조정

Scaling Factor 또는 Scale Factor는 일반적으로 이미지의 너비와 높이에 비례하는 수나 어떤 수를 곱한 숫자이다. 가로 세로 비율을 그대로 유지하고 디스플레이 품질 을 유지하는 데 도움이 된다. 따라서 이미지를 확대 또는 축소 하는 동안 이미지가 왜곡되지 않는다.

# Scaling Up 이미지 1.2배 시킬 x, y의 scale factor
scale_up_x = 1.2
scale_up_y = 1.2
# Scaling Down 이미지 0.6배 시킬 하나의 sacle factor
scale_down = 0.6
 
scaled_f_down = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_LINEAR)
scaled_f_up = cv2.resize(image, None, fx= scale_up_x, fy= scale_up_y, interpolation= cv2.INTER_LINEAR)
  • 수평 및 수직 축을 따라 새로운 배율 인수를 정의한다.
  • 배율 인수를 정의하면 너비와 높이에 대한 새 포인트가 필요 없다. 따라서 크기를 없음으로 유지한다.

크기 조정시킨 이미지

cv2.imshow('Resized Down scale factor', scaled_f_down)
cv2.waitKey()
cv2.imshow('Resized Up scaling factor', scaled_f_up)
cv2.waitKey()

왼쪽 이미지가 축소된 버전이고 오른쪽이 확대된 버전이다.

다양한 보간법으로 크기 조정

  • INTER_AREA

    • 리샘플링을 위해 픽셀 영역 관계를 사용한다.
    • 이것은 이미지의 크기를 줄이는 데 가장 적합하다.
    • 이미지를 확대할 때는 INTER_NEAREST 방법을 사용한다.
  • INTER_CUBIC

    • 이미지 크기를 조정하기 위해 bicubic 보간을 사용한다.
    • 새 픽셀의 크기를 조정하고 보간하는 동안 이 방법은 이미지의 4x4 인접 픽셀에 적용된다.
    • 그런 다음 새로운 보간 픽셀을 생성하기 위해 16픽셀의 가중치 평균을 취한다.
  • INTER_LINEAR

    • INTER_CUBIC 보간법과 다소 유사하다.
    • 그러나 이것은 2x2 인접 픽셀을 사용하여 보간된 픽셀에 대한 가중 평균을 얻는다.
  • INTER_NEAREST

    • INTER_NEAREST 방법은 보간을 위해 최근접 이웃 개념을 사용합니다.
    • 보간을 위해 이미지에서 하나의 인접 픽셀만 사용하는 가장 간단한 방법 중 하나이다.

좋은 웹페이지 즐겨찾기