Bicubic Spline Warping
1 개요
Bicubic Spline Warping은 설정된 제어 점들을 이용하여 Bicubic spline interpolation 방식을 통해 이미지를 변환하는 알고리즘입니다.
2 알고리즘 상세 설명
Source |
Source points |
Dest points |
Result |
 |
 |
 |
 |
Fig. 알고리즘 수행 결과
3 파라미터 설정 및 사용 방법
-
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)
-
예제 코드
CBicubicSplineWarping bicubicSplineWarping;
CFLImage fliLearnImage;
if(fliLearnImage.Load(L"../../ExampleImages/BicubicSplineWarping/chess.flif").IsFail())
break;
bicubicSplineWarping.SetSourceImage(fliLearnImage);
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));
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));
bicubicSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
bicubicSplineWarping.SetExtension(1);
if(bicubicSplineWarping.Calibrate().IsFail())
break;
if(bicubicSplineWarping.Save(L"../../ExampleImages/BicubicSplineWarping/learnCalibration").IsFail())
break;
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();
CFLImage fliLearnImage = new CFLImage();
if(fliLearnImage.Load("../../ExampleImages/BicubicSplineWarping/chess.flif").IsFail())
break;
bicubicSplineWarping.SetSourceImage(ref fliLearnImage);
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));
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));
bicubicSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
bicubicSplineWarping.SetExtension(1);
if(bicubicSplineWarping.Calibrate().IsFail())
break;
if(bicubicSplineWarping.Save("../../ExampleImages/BicubicSplineWarping/learnCalibration").IsFail())
break;
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()
fliLearnImage = CFLImage()
if (res := fliLearnImage.Load('../../ExampleImages/BicubicSplineWarping/chess.flif')).IsFail():
ErrorPrint(res, 'Failed to load the image file.')
return
bicubicSplineWarping.SetSourceImage(fliLearnImage)
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))
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))
bicubicSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination)
bicubicSplineWarping.SetExtension(1)
if (res := bicubicSplineWarping.Calibrate()).IsFail():
ErrorPrint(res, 'Failed to calibrate.')
return
if (res := bicubicSplineWarping.Save("../../ExampleImages/BicubicSplineWarping/learnCalibration")).IsFail():
ErrorPrint(res, 'Failed to save.')
return
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()}')