Bilinear Spline Warping

1 개요

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

2 알고리즘 상세 설명

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

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

  1. API

    SetInterpolationMethod(EInterpolationMethod eMethod = EInterpolationMethod_Bilinear)
    
    • Bilinear Spline Warping 연산 시 보간 방법을 설정합니다. eMethod - Default Value : EInterpolationMethod_Bilinear
    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. 예제 코드

    CBilinearSplineWarping BilinearSplineWarping;
    // LearnImage 설정
    CFLImage fliLearnImage;
    
    if(fliLearnImage.Load(L"../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
    	break;
    
    BilinearSplineWarping.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 설정
    BilinearSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
    // Calibration Points 연장 길이 값 설정
    // Calibrate 수행
    if(BilinearSplineWarping.Calibrate().IsFail())
    	break;
    // Calibration 정보 저장
    if(BilinearSplineWarping.Save(L"../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
    	break;
    // Calibration 정보 불러오기
    if(BilinearSplineWarping.Load(L"../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
    	break;
    // 소스 이미지 불러오기
    CFLImage fliSourceImage;
    if(fliSourceImage.Load(L"../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
    	break;
    BilinearSplineWarping.SetSourceImage(fliSourceImage);
    // 결과 이미지 설정
    CFLImage fliDestinationImage;
    BilinearSplineWarping.SetDestinationImage(fliDestinationImage);
    // 알고리즘 수행
    if(BilinearSplineWarping.Execute().IsFail())
    	break;
    // 결과 이미지 저장
    if(fliDestinationImage.Save(L"../../ExampleImages/BilinearSplineWarping/Result.flif").IsFail())
    	break;
    
    CBilinearSplineWarping BilinearSplineWarping = new CBilinearSplineWarping();
    
    // LearnImage 설정
    CFLImage fliLearnImage = new CFLImage();
    
    if(fliLearnImage.Load("../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
        break;
    
    BilinearSplineWarping.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 설정
    BilinearSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
    // Calibration Points 연장 길이 값 설정
    // Calibrate 수행
    if(BilinearSplineWarping.Calibrate().IsFail())
        break;
    // Calibration 정보 저장
    if(BilinearSplineWarping.Save("../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
        break;
    // Calibration 정보 불러오기
    if(BilinearSplineWarping.Load("../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
        break;
    // 소스 이미지 불러오기
    CFLImage fliSourceImage = new CFLImage();
    if(fliSourceImage.Load("../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
        break;
    BilinearSplineWarping.SetSourceImage(ref fliSourceImage);
    // 결과 이미지 설정
    CFLImage fliDestinationImage = new CFLImage();
    BilinearSplineWarping.SetDestinationImage(ref fliDestinationImage);
    // 알고리즘 수행
    if(BilinearSplineWarping.Execute().IsFail())
        break;
    // 결과 이미지 저장
    if(fliDestinationImage.Save("../../ExampleImages/BilinearSplineWarping/Result.flif").IsFail())
        break;
    
    def main():
        bilinearSplineWarping = CBilinearSplineWarping()
    
        # LearnImage 설정
        fliLearnImage = CFLImage()
    
        if (res := fliLearnImage.Load('../../ExampleImages/BilinearSplineWarping/chess.flif')).IsFail():
            ErrorPrint(res, 'Failed to load the image file.')
            return
    
        bilinearSplineWarping.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 설정
        bilinearSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination)
        # Calibrate 수행
        if (res := bilinearSplineWarping.Calibrate()).IsFail():
            ErrorPrint(res, 'Failed to calibrate.')
            return
    
        # Calibration 정보 저장
        if (res := bilinearSplineWarping.Save("../../ExampleImages/BilinearSplineWarping/learnCalibration")).IsFail():
            ErrorPrint(res, 'Failed to save.')
            return
    
        # Calibration 정보 불러오기
        if (res := bilinearSplineWarping.Load("../../ExampleImages/BilinearSplineWarping/learnCalibration")).IsFail():
            ErrorPrint(res, 'Failed to load.')
            return
    
        # 소스 이미지 불러오기
        fliSourceImage = CFLImage()
    
        if (res := fliSourceImage.Load('../../ExampleImages/BilinearSplineWarping/chess.flif')).IsFail():
            ErrorPrint(res, 'Failed to load the image file.')
            return
    
        bilinearSplineWarping.SetSourceImage(fliSourceImage)
        # 결과 이미지 설정
        fliDestinationImage = CFLImage()
        bilinearSplineWarping.SetDestinationImage(fliDestinationImage)
        # 알고리즘 수행
        if (res := bilinearSplineWarping.Execute()).IsFail():
            ErrorPrint(res, 'Failed to execute.')
            return
    
        # 결과 이미지 저장
        if (res := fliDestinationImage.Save("../../ExampleImages/BilinearSplineWarping/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()}')