OpenCV 이미지 크기 조정 resize 다양한 플러그 인 방식 비교

1.사이즈 함수 설명
    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.총화
    테스트 결과:
  •  속도 비교:INTERNEAREST(최근 인접 플러그 인)>INTERLINEAR(선형 삽입 값)>INTERCUBIC(세 번 의 플러그 인)>INTERAREA  (영역 삽입 값)
  • 이미 지 를 축소 할 때 파문 현상 이 발생 하지 않도록 INTER 를 추천 합 니 다.AREA 영역 삽입 방법
  • OpenCV 추천:그림 을 축소 하려 면\#INTER 를 사용 하 는 것 을 추천 합 니 다.AREA 플러그 인 효과 가 가장 좋 고 그림 을 확대 하려 면 보통 INTER 을 사용 합 니 다.CUBIC(속도 가 느 리 지만 효과 가 가장 좋다)또는 INTER 사용리 니 어.최근 인접 플러그 인 INTERNEAREST,일반적으로 추천 하지 않 습 니 다.
  • OpenCV 이미지 크기 조정 resize 의 다양한 플러그 인 방식 에 대한 비교 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 OpenCV 이미지 크기 조정 resize 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기