opencv c++ Resize the Image (이미지 사이즈 변경)

  • 최초 작성일: 2022년 1월 14일(목)

목차

[TOC]


목표

앞서 GrayScaling, 노이즈 제거 등은 영상 처리의 속도를 빠르게 하기 위한 작업이었다.

마찬가지로 이미지 사이즈를 줄임으로써 연산 속도를 줄일 수 있다.

이번에는 Resize() 에 대해 알아보자.



실습

우선, 우리가 사용할 Resize() 함수를 알아보자.

Resize(src, dst, Size(cols, rows))

  • src: 입력 이미지
  • dst: 출력 이미지
  • Size(cols, rows): 원하는 이미지의 크기, Size(가로, 세로)라고 보면 됨.


resize에는 크게 두 가지가 있다. 줄인다. 늘린다.

우선, 이미지를 축소(줄인다.)시키는 것은 간단하다.

홀 수 번호의 인덱스만을 이용해 이미지를 만들면 원본 이미지의 절반 크기가 된다.

하지만, 반대의 경우에는 기존의 픽셀 사이에 새로운 픽셀을 추가 삽입해줘야 하는데, 그 픽셀에 데이터는 어떻게 들어가야 하는지를 결정하기가 어렵다.

그래서 사용되는 방법이 보간법이다.

보통 선형보간법을 사용하는데, 기존의 데이터를 기반으로 추정하는 것이 보간법인데, 이미지를 늘릴 때에도 똑같이 사용된다.

새로 삽입될 픽셀 주변의 데이터를 기반으로 선형 보간법 방정식을 이용해 최대한 부드럽게 데이터를 정해주는 것이다.

image


opencv에서는 다른 보간법들도 있으나, 기본값으로 선형 보간법을 사용하며 다른 방법들에 비해 가장 좋은 결과를 보인다고 한다.

그래도 다른 보간법들을 간단히 소개해주자면, 아래의 코드를 통해 사용할 보간법을 선택해줄 수 있다.

image


직접 실행해봤는데, 육안으로 구별이 안되어서 다른 블로그에서 이미지를 가져와보았다. 대충 이렇다 하고 넘어가면 될 거 같다.

image



소스 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main() {

	Mat img = imread("lion.png");

	Mat img_LINEAR;
	Mat img_NN;
	Mat img_CUBIC;

	Mat img_smaller;
	Mat img_bigger;
	
	cout << "size : " << img.cols << " x " << img.rows << endl;
	cout << "size : " << img.size().width << " x " << img.size().height << endl;
	// 593 x 333

	//resize(img, img_NN, Size(img.cols*1.5, img.rows * 1.5), 0, 0, INTER_NEAREST);		// 인접 보간 == 0
	//resize(img, img_LINEAR, Size(img.cols * 1.5, img.rows * 1.5), 0, 0, INTER_LINEAR);	// 선형 보간(default) == 1
	//resize(img, img_CUBIC, Size(img.cols * 1.5, img.rows * 1.5), 0, 0, INTER_CUBIC);	// 큐빅스플라인 보간 == 2

	resize(img, img_bigger, Size(593*1.5, 333*1.5));
	resize(img, img_smaller, Size(593*0.6, 333*0.6));

	//imshow("img1", img_NN);
	//imshow("img2", img_LINEAR);
	//imshow("img3", img_CUBIC);

	imshow("original", img);
	imshow("img_bigger", img_bigger);
	imshow("img_smaller", img_smaller);

	waitKey(0);

	return 0;
}


결과

아래의 이미지는 선형 보간법을 사용하여 축소 및 확대해본 결과이다.

image