이전 발행 글
OpenCV를 이용한 이미지/영상 처리 - 이미지 출력
8. 크기 조정
이미지 크기 조정
이미지 크기를 조정하는 방법에는 사용자가 원하는 값의 크기로 변환하는 고정크기가 있고, 2배, 3배 또는 0.5배와 같이 비율에 따른 조정이 있다.
1. 고정 크기로 조정
고정크기로 조정할 때는 cv2.resize() 를 이용해 각각 가로와 세로의 값을 튜블로 전달하여 조정한다.
cv2.resize(image_file, (width, height))
예를 들어 img.jpg 이미지 파일을 가로 500, 세로 400으로 조정할 경우 다음과 같이 나타낸다.
import cv2
img = cv2.imread('img.jpg')
dst = cv2.resize(img, (500, 400))
cv2.imshow('image', img)
cv2.imshow('resize_image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
왼쪽이 원본(image)와 오른쪽이 크기가 조정된 이미지출력된 이미지(resize_image)를 비교했을 때 확실히 이미지 크기가 바뀐 것을 알 수 있다.
2. 비율로 조정
비율 조정의 경우 이미지의 크기는 None으로 입력하고, fx와 fy에 값을 입력하여 가로와 세로를 각각 비율을 조정할 수 있다.
cv2.resize(image_file, None, fx = n, fy = m)
예를 들어 img.jpg 이미지 파일을 가로와 세로 모두 1.2배로 확장할 경우 다음과 같이 나타낸다.
import cv2
img = cv2.imread("img.jpg")
dst = cv2.resize(img, None, fx = 1.2, fy = 1.2)
cv2.imshow('image', img)
cv2.imshow('resize_image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
이 처럼 이미지 확대가 가능하며 1보다 작은 수를 입력하면 축소도 가능하다. 또한 가로와 세로에 각각 다른 비율로 조정할 수 있다.
# ex. 가로는 1.2배, 세로는 0.7배
import cv2
img = cv2.imread("img.jpg")
dst = cv2.resize(img, None, fx = 1.2, fy = 0.7)
cv2.imshow('image', img)
cv2.imshow('resize_image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 보간법
보간법이란 주변 픽셀 값을 기반으로 이미지의 새 픽셀 값을 추정하는 방법으로 이미지의 크기를 키우거나 줄일때 이미지가 깨지는 현상을 해결하고 해상도를 향상시킬 수 있다. 보간법을 적용하기 위해서는 cv2.resize() 함수에서 interpolation 옵션을 입력하면 된다.
- cv2.INTER_AREA : 크기를 줄일 때 사용
- cv2.INTER_CUBIC : 크기를 늘릴 때 사용 (속도 느림, 퀄리티 좋음)
- cv2.INTER_LINEAR : 크기를 늘릴 때 사용(기본 값)
보간법을 적용해 확대한 이미지와 보간법을 적용하지 않고 확대한 이미지를 비교하면 다음과 같다.
# ex
import cv2
img = cv2.imread("img.jpg")
dst1 = cv2.resize(img, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)
dst2 = cv2.resize(img, None, fx = 2, fy = 2)
cv2.imshow('resize_interpolation', dst1)
cv2.imshow('resize', dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()
육안으로 확인하긴 어렵지만 보간법을 적용하여 확대한 이미지가 조금 더 선명해진 듯한 느낌이 든다.
동영상 크기 조정
동영상 크기를 조정하는 것은 이미지 크기 조정하는 방법과 크게 다르지 않다. 동영상도 이미지의 경우와 같이 cv2.resize()함수를 이용해 고정 크기로 조정하거나 비율로 조정할 수 있다. 보간법또한 동일하게 적용된다.
1. 고정 크기로 조정
원본 동영상을 출력하는 과정은 다음과 같았다.
import cv2
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imshow('video', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
위 영상을 가로 400, 세로 500으로 조정하여 출력하면 다음과 같다
# w = 400, h = 500
import cv2
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_resized = cv2.resize(frame, (400, 500))
cv2.imshow('video', frame_resized)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
2. 비율로 조정
비율로 조정하는 방법도 이미지와 같다. cv2.resize() 함수에서 크기(dsize) 값은 None으로 두고 fx와 fy으로 각각 가로와 세로의 비율을 지정한다. 이때 interpolation에 cv2.INTER_CUBIC으로 보간법을 적용해 화질을 개선할 수 있다.
import cv2
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_resized = cv2.resize(frame, None, fx = 1.5, fy = 1.5,
interpolation = cv2.INTER_CUBIC)
cv2.imshow('video', frame_resized)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 변형(흑백, 흐림, 원근) (1) | 2023.05.24 |
---|---|
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 처리 (0) | 2023.05.19 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 파일 저장 (0) | 2023.05.17 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 텍스트 (0) | 2023.05.12 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 도형그리기2(원형, 사각형, 다각형) (0) | 2023.05.04 |