Bicubic Spline Warping

1 개요

Bicubic Spline Warping은 설정된 제어 점들을 이용하여 Bicubic spline interpolation 방식을 통해 이미지를 변환하는 알고리즘입니다.

2 알고리즘 상세 설명

Source Source points Dest points Result
Source Result Result Result
Fig. 알고리즘 수행 결과

3 파라미터 설정 및 사용 방법

  1. API

    SetInterpolationMethod(EInterpolationMethod eMethod = EInterpolationMethod_Bilinear)
    
    • Bicubic Spline Warping 연산 시 보간 방법을 설정합니다. eMethod - Default Value : EInterpolationMethod_Bilinear
    SetExtension(int32_t i32Extension)
    
    • Bicubic Spline Warping 연산 시 컨트롤 포인트의 연장 길이 값을 설정 합니다. i32Extension - Default Value : 1
    SetCalibrationPointArray(Foundation::CFLPointArray& flpaSource,Foundation::CFLPointArray& flpaDestination)
    
    • Source및 Destination의 캘리브레이션 포인트를 설정 합니다.
    Calibrate()
    
    • 설정된 Source Points Array와 Destination Points Array로 Calibrate를 수행합니다.
    Load(Base::CFLString<wchar_t> wstrPath)
    
    • 저장된 캘리브레이션 파일을 로드합니다.
    Save(Base::CFLString<wchar_t> wstrPath)
    
    • 캘리브레이션 파일을 저장합니다.
  2. 예제 코드

    CBicubicSplineWarping bicubicSplineWarping;
    
    // LearnImage 설정
    CFLImage fliLearnImage;
    
    if(fliLearnImage.Load(L"../../ExampleImages/BicubicSplineWarping/chess.flif").IsFail())
    	break;
    
    bicubicSplineWarping.SetSourceImage(fliLearnImage);
    // Source Calibration Points 생성 2 x2
    CFLPointArray flpaSource;
    flpaSource.PushBack(CFLPoint<double>());
    
    flpaSource.PushBack(CFLPoint<double>(300.000000, 0.000000));
    
    flpaSource.PushBack(CFLPoint<double>(0.000000, 420.000000));
    
    flpaSource.PushBack(CFLPoint<double>(300.000000, 420.000000));
    
    // Destination Calibration Points 생성 2 x2
    CFLPointArray flpaDestination;
    flpaDestination.PushBack(CFLPoint<double>(43.003413, 34.402730));
    
    flpaDestination.PushBack(CFLPoint<double>(277.064846, 28.668942));
    
    flpaDestination.PushBack(CFLPoint<double>(24.368601, 398.498294));
    
    flpaDestination.PushBack(CFLPoint<double>(232.627986, 362.662116));
    
    /// Source & Destination Calibration Point Array 설정
    bicubicSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
    // Calibration Points 연장 길이 값 설정
    bicubicSplineWarping.SetExtension(1);
    // Calibrate 수행
    if(bicubicSplineWarping.Calibrate().IsFail())
    	break;
    // Calibration 정보 저장
    if(bicubicSplineWarping.Save(L"../../ExampleImages/BicubicSplineWarping/learnCalibration").IsFail())
    	break;
    // Calibration 정보 불러오기
    if(bicubicSplineWarping.Load(L"../../ExampleImages/BicubicSplineWarping/learnCalibration").IsFail())
    	break;
    // 소스 이미지 불러오기
    CFLImage fliSourceImage;
    if(fliSourceImage.Load(L"../../ExampleImages/BicubicSplineWarping/chess.flif").IsFail())
    	break;
    bicubicSplineWarping.SetSourceImage(fliSourceImage);
    // 결과 이미지 설정
    CFLImage fliDestinationImage;
    bicubicSplineWarping.SetDestinationImage(fliDestinationImage);
    // 알고리즘 수행
    if(bicubicSplineWarping.Execute().IsFail())
    	break;
    // 결과 이미지 저장
    if(fliDestinationImage.Save(L"../../ExampleImages/BicubicSplineWarping/Result.flif").IsFail())
    	break;
    
    CBicubicSplineWarping bicubicSplineWarping = new CBicubicSplineWarping();
    
    // LearnImage 설정
    CFLImage fliLearnImage = new CFLImage();
    
    if(fliLearnImage.Load("../../ExampleImages/BicubicSplineWarping/chess.flif").IsFail())
        break;
    
    bicubicSplineWarping.SetSourceImage(ref fliLearnImage);
    // Source Calibration Points 생성 2 x2
    CFLPointArray flpaSource = new CFLPointArray();
    flpaSource.PushBack(new CFLPoint<double>());
    
    flpaSource.PushBack(new CFLPoint<double>(300.000000, 0.000000));
    
    flpaSource.PushBack(new CFLPoint<double>(0.000000, 420.000000));
    
    flpaSource.PushBack(new CFLPoint<double>(300.000000, 420.000000));
    
    // Destination Calibration Points 생성 2 x2
    CFLPointArray flpaDestination = new CFLPointArray();
    flpaDestination.PushBack(new CFLPoint<double>(43.003413, 34.402730));
    
    flpaDestination.PushBack(new CFLPoint<double>(277.064846, 28.668942));
    
    flpaDestination.PushBack(new CFLPoint<double>(24.368601, 398.498294));
    
    flpaDestination.PushBack(new CFLPoint<double>(232.627986, 362.662116));
    
    /// Source & Destination Calibration Point Array 설정
    bicubicSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
    // Calibration Points 연장 길이 값 설정
    bicubicSplineWarping.SetExtension(1);
    // Calibrate 수행
    if(bicubicSplineWarping.Calibrate().IsFail())
        break;
    // Calibration 정보 저장
    if(bicubicSplineWarping.Save("../../ExampleImages/BicubicSplineWarping/learnCalibration").IsFail())
        break;
    // Calibration 정보 불러오기
    if(bicubicSplineWarping.Load("../../ExampleImages/BicubicSplineWarping/learnCalibration").IsFail())
        break;
    // 소스 이미지 불러오기
    CFLImage fliSourceImage = new CFLImage();
    if(fliSourceImage.Load("../../ExampleImages/BicubicSplineWarping/chess.flif").IsFail())
        break;
    bicubicSplineWarping.SetSourceImage(ref fliSourceImage);
    // 결과 이미지 설정
    CFLImage fliDestinationImage = new CFLImage();
    bicubicSplineWarping.SetDestinationImage(ref fliDestinationImage);
    // 알고리즘 수행
    if(bicubicSplineWarping.Execute().IsFail())
        break;
    // 결과 이미지 저장
    if(fliDestinationImage.Save("../../ExampleImages/BicubicSplineWarping/Result.flif").IsFail())
        break;