OpenCV 이미지 크기 조정 resize 다양한 플러그 인 방식 비교
OpenCV 는 그림 의 크기 를 바 꾸 기 위해 resize 함 수 를 제공 합 니 다.함수 원형 은 다음 과 같 습 니 다.
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
매개 변수 설명:src:원래 그림,즉 크기 를 바 꿀 그림 을 입력 하 십시오.dst:출력,크기 변경 후의 그림 입 니 다.이 그림 은 원래 이미지 와 같은 내용 을 가지 고 있 습 니 다.크기 가 원래 이미지 와 다 를 뿐 입 니 다.dsize:출력 그림 의 크기 입 니 다.이 인자 가 0 이 아니라면 원본 그림 을 이 Size(width,height)가 지정 한 크기 로 크기 를 조정 하 는 것 을 의미 합 니 다.이 인자 가 0 이면 원래 그림 크기 조정 후의 크기 는 아래 공식 을 통 해 계산 해 야 합 니 다.
dsize = Size(round(fx*src.cols), round(fy*src.rows))
그 중에서 fx 와 fy 는 바로 아래 에서 말 하고 자 하 는 두 개의 매개 변수 로 이미지 width 방향 과 height 방향의 크기 조정 비율 입 니 다.
fx:width 방향의 크기 조정 비율 은 0 이면(double)dsize.width/src.cols 에 따라 계산 합 니 다.fy:height 방향의 크기 조정 비율 은 0 이면(double)dsize.height/src.rows 에 따라 계산 합 니 다.interpolation:이것 은 플러그 인 을 지정 하 는 방식 입 니 다.그림 크기 를 조정 한 후에 반드시 픽 셀 을 다시 계산 해 야 합 니 다.이 매개 변수 로 픽 셀 을 다시 계산 하 는 방식 을 지정 합 니 다.다음 과 같은 몇 가지 가 있 습 니 다.
INTER_NEAREST - 가장 근접 한 삽입 값
INTER_LINEAR - 이중 선형 플러그 인 입 니 다.마지막 매개 변 수 를 지정 하지 않 으 면 기본적으로 이 방법 을 사용 합 니 다.
INTER_AREA -픽 셀 영역 관 계 를 사용 하여 영역 삽입 값 을 재 샘플링 합 니 다.moire'free 결 과 를 제공 하 므 로 이미지 소수점 이하 로 사용 하 는 것 이 바람 직 할 수 있 습 니 다. INTER_NEAREST method.
INTER_CUBIC - 4x4 픽 셀 인접 도 메 인 내 더 블 큐 브 플러그 인
INTER_LANCZOS4 - 8x8 픽 셀 인접 지역 의 Lanczos 플러그 인
사용 주의사항:
dsize 와 fx/fy 는 동시에 0 이 될 수 없습니다.아니면 dsize 의 값 을 지정 하여 fx 와 fy 가 비어 있 으 면 기본 값 을 직접 사용 할 수 있 습 니 다.
resize(img, imgDst, Size(30,30));
아니면 dsize 를 0 으로 하고 fx 와 fy 의 값 을 지정 하 라 고 하 세 요.예 를 들 어 fx=fy=0.5,그러면 원 그림 의 두 방향 을 배로 줄 이 는 것 과 같 습 니 다!OpenCV 공식 설명:빨간색 테두리 에 주의 하 세 요.
To shrink an image, it will generally look best with https://docs.opencv.org/3.2.0/da/d54/group__imgproc__transform.html#ga47a974309e9102f5f08231edc7e7529d interpolation, whereas to enlarge an image, it will generally look best with cv::INTER_AREA (slow) or cv::INTER_CUBIC (faster but still looks OK).
2.각종 삽입 방식 의 비교
OpenCV 의 cv::resize 함 수 는 여러 가지 플러그 인 방식 을 지원 합 니 다.여 기 는 주로 다음 네 가지 자주 사용 하 는 플러그 인 방식 을 비교 합 니 다.
참고 자료:cv::INTER_LINEAR
2.1 INTER_NEAREST(최근 인접 플러그 인)
최근 인접 플러그 인 은 가장 간단 한 플러그 인 방법 입 니 다.항목 에서 가장 가 까 운 점 을 새로운 삽입 점 으로 선택 하고 계산 공식 은 다음 과 같 습 니 다.
플러그 인 후의 가장자리 효과:최근 의 점 을 새로운 삽입 점 으로 하기 때문에 가장자리 에 느 린 점 이 지나치게 느 린 구역 이 나타 나 지 않 고 확 대 된 이미지 에 톱니 현상 이 나타 나 기 쉽다.
2.2 INTER_CUBIC (세 번 째 플러그 인
플러그 인 후의 가장자리 효과:톱날 현상 을 효과적으로 피 할 수 있 습 니 다.
2.3 INTER_LINEAR(선형 플러그 인)
선형 플러그 인 은 거 리 를 가중치 로 하 는 플러그 인 방식 이다.
플러그 인 후의 가장자리 효과:톱날 현상 을 효과적으로 피 할 수 있 습 니 다.
2.4 INTER_AREA (영역 삽입 값)
지역 삽입 값 은 모두 세 가지 상황 으로 나 뉘 는데 이미지 가 확 대 될 때 이중 선형 삽입 값 과 유사 하고 이미지 축소(x 축,y 축 이 동시에 축소)는 두 가지 상황 으로 나 뉘 는데 이 상황 에서 파문 이 나타 나 는 것 을 피 할 수 있다.따라서 그림 을 축소 할 때 파문 현상 이 발생 하지 않도록 지역 삽입 방법 을 추천 합 니 다.
OpenGL 설명 문 서 는 이렇게 설명 되 어 있 습 니 다:To shrink an image,it will generally look best with\#INTERAREA interpolation, whereas to enlarge an image, it will generally look best with #INTER_CUBIC (slow) or #INTER_LINEAR (faster but still looks OK).
그림 을 축소 하려 면 보통 INTER 을 사용 하 는 것 을 추천 합 니 다.AREA 플러그 인 효과 가 가장 좋 고 그림 을 확대 하려 면 보통 INTER 을 사용 합 니 다.CUBIC(속도 가 느 리 지만 효과 가 가장 좋다)또는 INTER 사용리 니 어.
플러그 인 후 가장자리 효과:
테스트 코드:
#include <chrono>
#include <opencv2/opencv.hpp>
#define millisecond 1000000
#define DEBUG_PRINT(...) printf( __VA_ARGS__); printf("
")
#define DEBUG_TIME(time_) auto time_ =std::chrono::high_resolution_clock::now()
#define RUN_TIME(time_) (double)(time_).count()/millisecond
using namespace std;
cv::Mat image_resize(cv::Mat image, int width, int height, int interpolation, int num) {
cv::Mat dest;
for (int i = 0; i < num; ++i) {
cv::resize(image, dest, cv::Size(width, height), 0, 0, interpolation);//
}
return dest;
}
int main() {
string path = "../1.jpg";
cv::Mat image = cv::imread(path);
cv::resize(image, image, cv::Size(1000, 1000));
int re_width = 900;
int re_height = 900;
int num=10;
cv::Mat image2X_INTER_NEAREST;
cv::Mat image2X_INTER_LINEAR;
cv::Mat image2X_INTER_AREA;
cv::Mat image2X_INTER_CUBIC;
cv::Mat initMat;
DEBUG_PRINT("image input size:%dx%d", image.rows, image.cols);
DEBUG_TIME(T0);
image2X_INTER_NEAREST=image_resize(image, re_width, re_height, cv::INTER_NEAREST, num);
DEBUG_TIME(T1);
image2X_INTER_LINEAR=image_resize(image, re_width, re_height, cv::INTER_LINEAR, num);
DEBUG_TIME(T2);
image2X_INTER_AREA=image_resize(image, re_width, re_height, cv::INTER_AREA, num);
DEBUG_TIME(T3);
image2X_INTER_CUBIC=image_resize(image, re_width, re_height, cv::INTER_CUBIC, num);
DEBUG_TIME(T4);
DEBUG_PRINT("resize_image:%dx%d,INTER_NEAREST:%3.3fms",
image2X_INTER_NEAREST.rows,
image2X_INTER_NEAREST.cols,
RUN_TIME(T1 - T0)/num);
DEBUG_PRINT("resize_image:%dx%d,INTER_LINEAR :%3.3fms",
image2X_INTER_LINEAR.rows,
image2X_INTER_LINEAR.cols,
RUN_TIME(T2 - T1)/num);
DEBUG_PRINT("resize_image:%dx%d,INTER_AREA :%3.3fms",
image2X_INTER_AREA.rows,
image2X_INTER_AREA.cols,
RUN_TIME(T3 - T2)/num);
DEBUG_PRINT("resize_image:%dx%d,INTER_CUBIC :%3.3fms",
image2X_INTER_CUBIC.rows,
image2X_INTER_CUBIC.cols,
RUN_TIME(T4 - T3)/num);
return 0;
}
실행 결과:image input size:1000x1000
resize_image:900x900,INTER_NEAREST:0.389ms
resize_image:900x900,INTER_LINEAR :0.605ms
resize_image:900x900,INTER_AREA :2.611ms
resize_image:900x900,INTER_CUBIC :1.920ms
3.총화
테스트 결과:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 OpenCV 템플릿 프로젝트 만들기・Windows 7 Professional 64bit ・Visual Studio 2017 Version 15.9.14 · OpenCV 3.4.1 OpenCV의 도입 방법 등은 아래를 참조하십시오. Visual Stu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.