알고리즘 클래스 사용 방법 튜토리얼

1 알고리즘 클래스 기본 개념

1.1 기본 개념

FLImaging® 에는 알고리즘 객체(CAlgorithmBase를 상속 받는 객체)가 있습니다. 기본적으로 알고리즘 객체에 이미지 파일만 설정해도 다른 복잡한 설정 없이 바로 Execute()를 호출할 수 있습니다. 여기서 조금 더 섬세한 결과를 얻으려면, 다양한 파라미터를 설정하고 다시 Execute()를 호출하면 됩니다.

알고리즘 수행 기본 구조 : 이미지, 파라미터 설정 → Execute(); 호출

예를 들어 Sobel Filter 알고리즘의 경우, (1)알고리즘 객체 선언, (2)원본 이미지 및 결과 이미지 설정, (3)커널 메소드 설정, (4)Execute() 호출 순서로 알고리즘 클래스를 이용할 수 있습니다. Execute() 의 리턴값으로 알고리즘 수행이 성공했는지 어떤 이유로 실패했는지 확인할 수 있습니다.

CFLImage fliSrcImage;
fliSrcImage.Load(L"D:/ExampleImage.png");

// Convolution Sobel 객체 생성 (Create Convolution Sobel object)
CSobelFilter convolutionSobel;

// Source 이미지 설정 (Set the source image)
convolutionSobel.SetSourceImage(fliSrcImage);

// 결과 이미지 설정 (Set the destination image)
CFLImage fliDstImage;
convolutionSobel.SetDestinationImage(fliDstImage);

// Convolution Sobel 커널 연산 방법 설정
convolutionSobel.SetKernelMethod(CSobelFilter::EKernel_Sobel);

// 알고리즘 수행 (Execute algorithm according to previously set parameters)
CResult res = convolutionSobel.Execute();
CFLImage fliSrcImage = new CFLImage();
fliSrcImage.Load("D:/ExampleImage.png");

// Convolution Sobel 객체 생성 (Create Convolution Sobel object)
CSobelFilter convolutionSobel = new CSobelFilter();

// Source 이미지 설정 (Set the source image)
convolutionSobel.SetSourceImage(ref fliSrcImage);

// 결과 이미지 설정 (Set the destination image)
CFLImage fliDstImage = new CFLImage();
convolutionSobel.SetDestinationImage(ref fliDstImage);

// Convolution Sobel 커널 연산 방법 설정
convolutionSobel.SetKernelMethod(CSobelFilter.EKernel.Sobel);

// 알고리즘 수행 (Execute algorithm according to previously set parameters)
CResult res = convolutionSobel.Execute();
fliSrcImage = CFLImage()
fliSrcImage.Load("D:/ExampleImage.png")

# Convolution Sobel 객체 생성 (Create Convolution Sobel object)
convolutionSobel = CSobelFilter()

# Source 이미지 설정 (Set the source image)
convolutionSobel.SetSourceImage(fliSrcImage)

# 결과 이미지 설정 (Set the destination image)
fliDstImage = CFLImage()
convolutionSobel.SetDestinationImage(fliDstImage)

# Convolution Sobel 커널 연산 방법 설정
convolutionSobel.SetKernelMethod(CSobelFilter.EKernel.Sobel)

# 알고리즘 수행 (Execute algorithm according to previously set parameters)
res = convolutionSobel.Execute()

2 Source, Operand, Destination

2.1 기본 개념

2.2 SetOperationSource 함수

함수 원형

virtual const CResult SetOperationSource(EOperationSource eOperationSource = EOperationSource_Scalar);

Parameter

3 Image, ROI 및 Pivot

3.1 기본 개념

이미지 처리의 주요 개념인 이미지 자체, ROI(Region of Interest), 그리고 Pivot(기준점) 설정 방법을 다룹니다.

3.2 각 Parameter를 지정하지 않은 경우

Source Image를 제외한 각 Image, ROI 및 Pivot은 필수 Parameter가 아니기 때문에 설정하지 않은 경우 처리 방식을 설명합니다.

3.3 Intersection 계산 과정

  1. 아래와 같이 Source 이미지를 로드하고 Source ROI, Operand ROi, Destination ROI를 지정합니다.

    Source 이미지 ROI 지정
    Image Processing Common Source Image Processing Common Source

  2. Destination Pivot을 기준으로 Source Pivot과 Operand Pivot을 이동합니다.

  3. Pivot이 이동한 만큼 Source와 Operand의 ROI도 이동합니다.

Fig. Source ROI 와 Operand ROI의 pivot 을 Destination ROI의 pivot과 일치시킨 상태
  1. Pivot이 일치된 상태에서 ROI간의 Intersection을 계산해 출력 영역을 구합니다. 위와 같이 Source ROI와 Operand ROI를 설정했을 때, Source ROI와 Operand ROI의 pivot(기본값은 center 좌표)을 일치시킨 뒤 교집합 영역에 대해 연산을 합니다.
    Source ROI Operand ROI 겹쳐진 상태
    Image Processing Common Source Image Processing Common Source Image Processing Common Source

  2. 연산 결과를 확인합니다.
    4번에서 확인한 Source ROI 영역의 이미지와 Operand ROI 영역의 이미지 간의 연산 결과가 3번에서 확인한 Destination ROI 영역의 위치에 출력됩니다. 이 때, Destination 이미지가 없는 경우에는 Source 이미지와 동일한 크기의 이미지가 새로 생성되어 결과가 출력되고 Destination 이미지가 있는 경우에는 Destination 이미지에 결과가 출력됩니다.
    Destination 이미지가 없는 경우 Destination 이미지가 있는 경우
    Image Processing Common Source
    Blank Color=RGB(200,200,200)

    Image Processing Common Source
    Blank Color=RGB(0,0,0)
    Always Fill Blank Color = TRUE

4 Blank Color

4.1 기본 개념

Blank 영역을 설정한 값으로 채웁니다. Source Image의 채널 수 만큼 각각 설정할 수 있습니다.
Blank Color 값이 Source Image의 표현범위를 벗어나면 동작하지 않습니다.

Fill Blank Color 설명

4.2 GUI 에서 설정

Fig. Fill Blank Color 설정

4.3 코드로 설정

함수 원형 - EnableFillBlankColorMode()

virtual const CResult EnableFillBlankColorMode(bool bFillBlankColor = false);

Parameter

함수 원형 - SetBlankColor()

virtual const CResult SetBlankColor(const Base::CMultiVar<double>& mvBlankColor = Base::CMultiVar<double>());

Parameter

예제 코드

COperationAdd operationAdd;
operationAdd.EnableFillBlankColorMode(true);
CMultiVar<double> mvBlankColor(255., 255., 127., 127.);
operationAdd.SetBlankColor(mvBlankColor);
COperationAdd operationAdd = new COperationAdd();
operationAdd.EnableFillBlankColorMode(true);
CMultiVar<double> mvBlankColor = new CMultiVar<double>(255.0, 255.0, 127.0, 127.0);
operationAdd.SetBlankColor(mvBlankColor);
operationAdd = COperationAdd()
operationAdd.EnableFillBlankColorMode(True)
mvBlankColor = CMultiVar[Double](255.0, 255.0, 127.0, 127.0)
operationAdd.SetBlankColor(mvBlankColor)

5 Batch Processing Setting

5.1 기본 개념

FLImaging®의 CFLImage 클래스는 Multi Page를 지원합니다.
각 페이지별로 이미지 버퍼를 관리하며, 배치 처리를 통해 한 번의 실행으로 다중 처리가 가능합니다.

5.2 GUI에서 설정

Fig. Batch Processing 설정

5.3 코드로 설정

함수 원형

virtual const CResult EnableBatchProcessing(bool bBatchProcessing);

Parameter

예제 코드

COperationAdd operationAdd;
operationAdd.EnableBatchProcessing(true);
COperationAdd operationAdd = new COperationAdd();
operationAdd.EnableBatchProcessing(true);
operationAdd = COperationAdd()
operationAdd.EnableBatchProcessing(True)

6 Processing Unit Setting

FLImaging®은 모든 알고리즘에서 SIMD 및 Multi Thread를 지원하며, 부분적인 알고리즘에 대해 GPU 연산을 지원합니다.

6.1 Processing Unit 전역 설정

6.1.1 GUI 에서 설정

Menu Pane의 Setting 메뉴에서 설정할 수 있으며, 여기서 지정한 Processing Unit에 따라 이미지 처리가 수행됩니다.

Setting Menu
Fig. Setting Menu

6.1.2 코드로 설정

아래 코드는 Processing Unit을 전역 설정하는 방법을 설명하는 예제 코드입니다.

// CPU, Multi Thread를 사용하는 경우
CProcessingUnitCPUMulti puMulti;
puMulti.SetInstruction(CProcessingUnitCPU::EInstruction_Optimal);
CProcessingUnitManager::SetProcessingUnit(puMulti);

// CPU, Single Thread를 사용하는 경우
CProcessingUnitCPU pu;
pu.SetInstruction(CProcessingUnitCPU::EInstruction_Optimal);
CProcessingUnitManager::SetProcessingUnit(pu);

// GPU, Cuda를 사용하는 경우 (단, 지원하는 알고리즘에 한함)
CProcessingUnitCuda puCuda;
CProcessingUnitManager::SetProcessingUnit(puCuda);
// CPU, Multi Thread를 사용하는 경우
CProcessingUnitCPUMulti puMulti = new CProcessingUnitCPUMulti();
puMulti.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal);
CResult resMT = CProcessingUnitManager.SetProcessingUnit(puMulti);

// CPU, Single Thread를 사용하는 경우
CProcessingUnitCPU pu = new CProcessingUnitCPU();
pu.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal);
CResult resST = CProcessingUnitManager.SetProcessingUnit(pu);

// GPU, Cuda를 사용하는 경우 (단, 지원하는 알고리즘에 한함)
CProcessingUnitCuda puCuda = new CProcessingUnitCuda();
CResult resGPU = CProcessingUnitManager.SetProcessingUnit(puCuda);
# CPU, Multi Thread를 사용하는 경우
puMulti = CProcessingUnitCPUMulti()
puMulti.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal)
resMT = CProcessingUnitManager.SetProcessingUnit(puMulti)

# CPU, Single Thread를 사용하는 경우
pu = CProcessingUnitCPU()
pu.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal)
resST = CProcessingUnitManager.SetProcessingUnit(pu)

# GPU, Cuda를 사용하는 경우 (단, 지원하는 알고리즘에 한함)
puCuda = CProcessingUnitCuda()
resGPU = CProcessingUnitManager.SetProcessingUnit(puCuda)

6.2 개별 알고리즘에 Processing Unit 설정

6.2.1 Parameter Source설명

Parameter Source
Fig. Parameter Source

6.2.2 GUI 에서 설정하기

아래 그림은 Crop 알고리즘에 대한 프로퍼티 창입니다. "Processing Unit Setting" 카테고리 하위에 Parameter Source 와 Processing Unit 아이템이 있습니다.

Algorithm 별 Processing Unit Setting
Fig. Algorithm 별 Processing Unit Setting

6.2.3 코드로 설정하기

함수 원형

virtual const CResult SetProcessingUnit(const CProcessingUnitBase& pub);

Parameter

예제 코드

COperationAdd operationAdd;

// CPU, Multi Thread를 사용하는 경우
CProcessingUnitCPUMulti puMulti;
puMulti.SetInstruction(CProcessingUnitCPU::EInstruction_Optimal);
operationAdd.SetProcessingUnit(puMulti);

// CPU, Single Thread를 사용하는 경우
CProcessingUnitCPU pu;
pu.SetInstruction(CProcessingUnitCPU::EInstruction_Optimal);
operationAdd.SetProcessingUnit(pu);

// GPU, Cuda를 사용하는 경우 (단, 지원하는 알고리즘에 한함)
CProcessingUnitCuda puCuda;
operationAdd.SetProcessingUnit(puCuda);

operationAdd.Execute();
COperationAdd operationAdd = new COperationAdd();

// CPU, Multi Thread를 사용하는 경우
CProcessingUnitCPUMulti puMulti = new CProcessingUnitCPUMulti();
puMulti.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal);
CResult resMT = operationAdd.SetProcessingUnit(puMulti);

// CPU, Single Thread를 사용하는 경우
CProcessingUnitCPU pu = new CProcessingUnitCPU();
pu.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal);
CResult resST = operationAdd.SetProcessingUnit(pu);

// GPU, Cuda를 사용하는 경우 (단, 지원하는 알고리즘에 한함)
CProcessingUnitCuda puCuda = new CProcessingUnitCuda();
CResult resGPU = operationAdd.SetProcessingUnit(puCuda);

operationAdd.Execute();
operationAdd = COperationAdd()

# CPU, Multi Thread를 사용하는 경우
puMulti = CProcessingUnitCPUMulti()
puMulti.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal)
resMT = operationAdd.SetProcessingUnit(puMulti)

# CPU, Single Thread를 사용하는 경우
pu = CProcessingUnitCPU()
pu.SetInstruction(CProcessingUnitCPU.EInstruction.Optimal)
resST = operationAdd.SetProcessingUnit(pu)

# GPU, Cuda를 사용하는 경우 (단, 지원하는 알고리즘에 한함)
puCuda = CProcessingUnitCuda()
resGPU = operationAdd.SetProcessingUnit(puCuda)

operationAdd.Execute()

7 Image Figure Transformation

CFLImage 클래스는 이미지 버퍼 뿐만 아니라 이미지 처리에 필요한 데이터를 함께 관리하여 처리 및 저장이 가능합니다. 알고리즘 클래스에서는 이 Figure 객체들을 포함하여 변환할지 여부를 설정할 수 있습니다.

7.1 Transformation 설명

Source Image Transformation = TRUE Transformation = FALSE
Source Image Image Figure Transformation True Image Figure Transformation False

위 사진은 Scale Rotation 알고리즘을 Image Figure 가 존재하는 이미지에 대해 적용한 사례입니다. Scale은 x방향은 0.5배, y 방향은 0.25배, Rotation은 30도 회전하도록 설정했습니다. 이 때, Transformation = TRUE 로 설정하면 원본 이미지의 Image Figure 에도 연산이 적용됩니다. Transformation = FALSE 로 설정하면 원본 이미지의 Image Figure가 모두 제거됩니다.

7.2 GUI 에서 설정하기

Image Figure 카테고리의 Transformation 아이템을 체크하여 true로 설정할 수 있습니다.

Image Figure Setting
Fig. Image Figure Setting

7.3 코드로 설정하기

함수 원형

virtual const CResult EnableImageFigureTransformation(bool bEnable);

Parameter

예제 코드

CScaleRotation scaleRotation;

CFLImage fliSourceImage;
fliSourceImage.Load(L"D:/ExampleImage.flif");
scaleRotation.SetSourceImage(fliSourceImage);

// ImageFigureTransformation 기능 활성화
scaleRotation.EnableImageFigureTransformation(true);

scaleRotation.SetScale(0.5, 0.25);
scaleRotation.SetAngle(30.);

scaleRotation.SetInterpolationMethod(EInterpolationMethod_Bicubic);
scaleRotation.SetResizeMethod(EResizeMethod_Resize);

scaleRotation.Execute();
CScaleRotation scaleRotation = new CScaleRotation();

CFLImage fliSourceImage = new CFLImage();
fliSourceImage.Load("D:/ExampleImage.flif");
scaleRotation.SetSourceImage(ref fliSourceImage);

// ImageFigureTransformation 기능 활성화
scaleRotation.EnableImageFigureTransformation(true);

scaleRotation.SetScale(0.5, 0.25);
scaleRotation.SetAngle(30.0);

scaleRotation.SetInterpolationMethod(EInterpolationMethod.Bicubic);
scaleRotation.SetResizeMethod(EResizeMethod.Resize);

CResult res = scaleRotation.Execute();
scaleRotation = CScaleRotation()

fliSourceImage = CFLImage()
fliSourceImage.Load("D:/ExampleImage.flif")
scaleRotation.SetSourceImage(fliSourceImage)

# ImageFigureTransformation 기능 활성화
scaleRotation.EnableImageFigureTransformation(True)

scaleRotation.SetScale(0.5, 0.25)
scaleRotation.SetAngle(30.0)

scaleRotation.SetInterpolationMethod(EInterpolationMethod.Bicubic)
scaleRotation.SetResizeMethod(EResizeMethod.Resize)

res = scaleRotation.Execute()