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;
    
    def main():
        bicubicSplineWarping = CBicubicSplineWarping()
    
        # LearnImage 설정
        fliLearnImage = CFLImage()
    
        if (res := fliLearnImage.Load('../../ExampleImages/BicubicSplineWarping/chess.flif')).IsFail():
            ErrorPrint(res, 'Failed to load the image file.')
            return
    
        bicubicSplineWarping.SetSourceImage(fliLearnImage)
        # Source Calibration Points 생성 2 x2
        flpaSource = CFLPointArray()
        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
        flpaDestination = CFLPointArray()
        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 (res := bicubicSplineWarping.Calibrate()).IsFail():
            ErrorPrint(res, 'Failed to calibrate.')
            return
    
        # Calibration 정보 저장
        if (res := bicubicSplineWarping.Save("../../ExampleImages/BicubicSplineWarping/learnCalibration")).IsFail():
            ErrorPrint(res, 'Failed to save.')
            return
    
        # Calibration 정보 불러오기
        if (res := bicubicSplineWarping.Load("../../ExampleImages/BicubicSplineWarping/learnCalibration")).IsFail():
            ErrorPrint(res, 'Failed to load.')
            return
    
        # 소스 이미지 불러오기
        fliSourceImage = CFLImage()
    
        if (res := fliSourceImage.Load('../../ExampleImages/BicubicSplineWarping/chess.flif')).IsFail():
            ErrorPrint(res, 'Failed to load the image file.')
            return
    
        bicubicSplineWarping.SetSourceImage(fliSourceImage)
        # 결과 이미지 설정
        fliDestinationImage = CFLImage()
        bicubicSplineWarping.SetDestinationImage(fliDestinationImage)
        # 알고리즘 수행
        if (res := bicubicSplineWarping.Execute()).IsFail():
            ErrorPrint(res, 'Failed to execute.')
            return
    
        # 결과 이미지 저장
        if (res := fliDestinationImage.Save("../../ExampleImages/BicubicSplineWarping/Result.flif")).IsFail():
            ErrorPrint(res, 'Failed to save the image file.')
            return
    
    def ErrorPrint(res, str):
        if len(str) > 1:
            print(str)
    
        print(f'Error code : {res.GetResultCode()}\nError name : {res.GetString()}')