Conditional Replacer

1 개요

스칼라 또는 이미지의 값과 비교해 조건에 따라 참이면 특정값을 반환, 거짓이면 원본 이미지값을 반환하는 알고리즘입니다.

2 알고리즘 상세 설명

Source Threshold Value : 128
Replacement Value : 255
Greater Greater Equal Equal Not Equal Less Equal Less
Source0 Greater Result Greater Equal Result Equal Result Not Equal Result Less Equal Result Less Result
Fig. Threshold Condition에 따른 결과 비교

Conditional Replacer 알고리즘은 임계 조건에 따라 연산 결과가 참이면 Replacement 값으로 결과 픽셀을 출력하고, 거짓이면 원본 이미지로 결과 픽셀을 출력합니다.
위의 예시에서는 원본 이미지값 128이 임곗값 128과 같기 때문에 Greater Equal/Equal/Less Equal에서 참이므로 Replacement 값 255를 출력합니다. 그 외의 경우 거짓이므로 원본 이미지값 128을 출력합니다.

CConditionalReplacer conditionalReplacer;

CFLImage fliSourceImage;
conditionalReplacer.SetSourceImage(fliSourceImage);

CMultiVar<int64_t> mvLogicalCondition;
mvLogicalCondition.PushBack((int64_t)(ELogicalCondition_Greater));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition);

CMultiVar<double> mvThreshold1;
mvThreshold1.PushBack(128);
conditionalReplacer.SetThreshold(mvThreshold1);

CMultiVar<double> mvReplacement;
mvReplacement.PushBack(255);
conditionalReplacer.SetReplacementValue(mvReplacement);

conditionalReplacer.Execute();
CConditionalReplacer conditionalReplacer = new CConditionalReplacer();

CFLImage fliSourceImage = new CFLImage();
conditionalReplacer.SetSourceImage(ref fliSourceImage);

CMultiVar<Int64> mvLogicalCondition = new CMultiVar<Int64>();
mvLogicalCondition.PushBack((Int64)(ELogicalCondition.Greater));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition);

CMultiVar<double> mvThreshold1 = new CMultiVar<double>();
mvThreshold1.PushBack(128);
conditionalReplacer.SetThreshold(mvThreshold1);

CMultiVar<double> mvReplacement = new CMultiVar<double>();
mvReplacement.PushBack(255);
conditionalReplacer.SetReplacementValue(mvReplacement);

conditionalReplacer.Execute();
Source Threshold Condition : (Greater, Greater, Greater)
Threshold Value : (128, 128, 128)
Replacement Value : (255, 255, 255)
And Or
Source1 And Result Or Result
Fig. Logical Condition of Channels에 따른 결과 비교

이미지가 다중 채널인 경우, 각 채널들의 임계 조건에 따른 결과들을 사용자가 지정한 조건으로 논리 연산을 수행합니다. 위와 같이 논리 연산 결과가 참이면 Replacement 값으로 결과 픽셀을 출력하고, 거짓이면 원본 이미지 픽셀 값으로 결과를 출력합니다.
위의 예시에서는 하나의 채널이 임곗값 128보다 크지 않은 126이기 때문에 And에서는 거짓이고, Or에서는 참이 되어 채널 논리 조건 연산에 따라 다른 결과를 출력합니다.

CConditionalReplacer conditionalReplacer;

CFLImage fliSourceImage;
conditionalReplacer.SetSourceImage(fliSourceImage);

CMultiVar<int64_t> mvLogicalCondition;
mvLogicalCondition.PushBack((int64_t)(ELogicalCondition_Greater));
mvLogicalCondition.PushBack((int64_t)(ELogicalCondition_Greater));
mvLogicalCondition.PushBack((int64_t)(ELogicalCondition_Greater));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition);

conditionalReplacer.SetLogicalConditionOfChannels(ELogicalConditionOfChannels_And);

CMultiVar<double> mvThreshold1;
mvThreshold1.PushBack(128);
mvThreshold1.PushBack(128);
mvThreshold1.PushBack(128);
conditionalReplacer.SetThreshold(mvThreshold1);

CMultiVar<double> mvReplacement;
mvReplacement.PushBack(255);
mvReplacement.PushBack(255);
mvReplacement.PushBack(255);
conditionalReplacer.SetReplacementValue(mvReplacement);

conditionalReplacer.Execute();
CConditionalReplacer conditionalReplacer = new CConditionalReplacer();

CFLImage fliSourceImage = new CFLImage();
conditionalReplacer.SetSourceImage(ref fliSourceImage);

CMultiVar<Int64> mvLogicalCondition = new CMultiVar<Int64>();
mvLogicalCondition.PushBack((Int64)(ELogicalCondition.Greater));
mvLogicalCondition.PushBack((Int64)(ELogicalCondition.Greater));
mvLogicalCondition.PushBack((Int64)(ELogicalCondition.Greater));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition);

conditionalReplacer.SetLogicalConditionOfChannels(ELogicalConditionOfChannels.And);

CMultiVar<double> mvThreshold1 = new CMultiVar<double>();
mvThreshold1.PushBack(128);
mvThreshold1.PushBack(128);
mvThreshold1.PushBack(128);
conditionalReplacer.SetThreshold(mvThreshold1);

CMultiVar<double> mvReplacement = new CMultiVar<double>();
mvReplacement.PushBack(255);
mvReplacement.PushBack(255);
mvReplacement.PushBack(255);
conditionalReplacer.SetReplacementValue(mvReplacement);

conditionalReplacer.Execute();
Source Threshold Condition1 : Greater
Threshold Condition2 : Less Equal
Threshold Value1 : 128
Threshold Value2 : 255
Replacement Value : 255
Dual And Dual Or
Source1 Dual And Result Dual Or Result
Fig. Threshold Mode에 따른 결과 비교

17.6.1과 17.6.2의 예시는 Threshold Mode가 Single인 경우이며, Dual 연산도 수행 가능합니다. Dual 연산의 경우 두 개의 임계 조건에 따른 연산을 수행합니다.
위의 예시에서 첫 번째 임계 조건 Greater에서 원본 이미지값 128이 첫 번째 임곗값 128보다 크지 않으므로 연산 결과가 거짓이고, 두 번째 임계 조건 Less Equal에서는 두 번째 임곗값인 255 이하이므로 연산 결과가 참입니다. 따라서 Threshold Mode가 Dual And인 경우, 각 연산 결과의 And 연산에 의해 거짓이므로 원본 이미지 픽셀 값 128을 출력하고 Threshold Mode가 Dual Or인 경우, Or 연산에 의해 참이므로 Replacement 값 255를 출력합니다.

CConditionalReplacer conditionalReplacer;

CFLImage fliSourceImage;
conditionalReplacer.SetSourceImage(fliSourceImage);

CMultiVar<int64_t> mvLogicalCondition;
mvLogicalCondition.PushBack((int64_t)(ELogicalCondition_Greater));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition);

CMultiVar<int64_t> mvLogicalCondition2;
mvLogicalCondition2.PushBack((int64_t)(ELogicalCondition_LessEqual));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition2, ThresholdIndex_Second);

conditionalReplacer.SetThresholdMode(EThresholdMode_Dual_And);

CMultiVar<double> mvThreshold1;
mvThreshold1.PushBack(128);
conditionalReplacer.SetThreshold(mvThreshold1);

CMultiVar<double> mvThreshold2;
mvThreshold2.PushBack(255);
conditionalReplacer.SetThreshold(mvThreshold2, EThresholdIndex_Second);

CMultiVar<double> mvReplacement;
mvReplacement.PushBack(255);
conditionalReplacer.SetReplacementValue(mvReplacement);

conditionalReplacer.Execute();
CConditionalReplacer conditionalReplacer = new CConditionalReplacer();

CFLImage fliSourceImage = new CFLImage();
conditionalReplacer.SetSourceImage(ref fliSourceImage);

CMultiVar<Int64> mvLogicalCondition = new CMultiVar<Int64>();
mvLogicalCondition.PushBack((Int64)(ELogicalCondition.Greater));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition);

CMultiVar<Int64> mvLogicalCondition2 = new CMultiVar<Int64>();
mvLogicalCondition2.PushBack((Int64)(ELogicalCondition.LessEqual));
conditionalReplacer.SetLogicalCondition(mvLogicalCondition2, EThresholdIndex.Second);

conditionalReplacer.SetThresholdMode(EThresholdMode.Dual_And);

CMultiVar<double> mvThreshold1 = new CMultiVar<double>();
mvThreshold1.PushBack(128);
conditionalReplacer.SetThreshold(mvThreshold1);

CMultiVar<double> mvThreshold2 = new CMultiVar<double>();
mvThreshold2.PushBack(255);
conditionalReplacer.SetThreshold(mvThreshold2, EThresholdIndex.Second);

CMultiVar<double> mvReplacement = new CMultiVar<double>();
mvReplacement.PushBack(255);
conditionalReplacer.SetReplacementValue(mvReplacement);

conditionalReplacer.Execute();

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

멤버함수 파라미터 설 명
SetThresholdMode ImageProcessing::EThresholdMode eThresholdMode IN Threshold Mode 설정값

Threshold Mode를 설정합니다. Single을 선택하면 하나의 임계 조건에 대한 연산을 진행합니다. Dual And를 선택하면 두 임계 조건 모두 만족 시 최종 결과가 참이 됩니다. Dual Or를 선택하면 두 임계 조건 중 하나라도 만족 시 최종 결과가 참이 됩니다.
eThresholdMode - Default Value: EThresholdMode_Single, Recommended Value: EThresholdMode_Single

멤버함수 파라미터 설 명
SetThreshold double f64Threshold IN 임곗값
ImageProcessing::EThresholdIndex eIndex IN 임곗값 Index
멤버함수 파라미터 설 명
SetThreshold CMultiVar<double> mvThreshold IN 임곗값
EThresholdIndex eIndex IN 임곗값 Index

설정한 Threshold Index에 따라 첫 번째 또는 두 번째 임곗값을 설정합니다. Threshold Index를 First로 설정 시 첫 번째 임곗값을 설정하고, Second 설정 시 두 번째 임곗값을 설정합니다.
eIndex - Default Value: EThresholdIndex_First, Recommended Value: EThresholdIndex_First

멤버함수 파라미터 설 명
SetThreshold CMultiVar<double> mvThreshold1 IN 첫 번째 임곗값
CMultiVar<double> mvThreshold2 IN 두 번째 임곗값

첫 번째, 두 번째 임곗값을 설정합니다. mvThreshold1에 첫 번째 임곗값을 설정하고, mvThreshold2에 두 번째 임곗값을 설정합니다.

멤버함수 파라미터 설 명
SetReplacementValue CMultiVar<double> mvReplacementValue IN 연산 결과가 참인 경우, Replacement 출력 결과값

연산 결과가 참인 경우 출력할 Replacement 값을 설정합니다.

멤버함수 파라미터 설 명
SetLogicalCondition Base::ELogicalCondition eThresholdCondition IN 논리 조건 설정값
ImageProcessing::EThresholdIndex eIndex IN 논리 조건 Index
멤버함수 파라미터 설 명
SetLogicalCondition int64_t i64ThresholdCondition IN 논리 조건 설정값
ImageProcessing::EThresholdIndex eIndex IN 논리 조건 Index
멤버함수 파라미터 설 명
SetLogicalCondition CMultiVar<int64_t> mvThresholdCondition IN 논리 조건 설정값
ImageProcessing::EThresholdIndex eIndex IN 논리 조건 Index

설정한 Threshold Index에 따라 첫 번째 또는 두 번째 논리 조건을 설정합니다. 논리 조건은 Greater(큼), Greater Equal(크거나 같음), Equal(같음), Not Equal(같지 않음), Less Equal(작거나 같음), Less(작음)으로 설정 가능합니다.
eIndex - Default Value: EThresholdIndex_First, Recommended Value: EThresholdIndex_First

멤버함수 파라미터 설 명
SetLogicalCondition CMultiVar<int64_t> mvThresholdCondition1 IN 첫 번째 논리 조건 설정값
CMultiVar<int64_t> mvThresholdCondition2 IN 두 번째 논리 조건 설정값

첫 번째, 두 번째 논리 조건을 설정합니다. mvThresholdCondition1에 첫 번째 논리 조건을 설정하고, mvThresholdCondition2에 두 번째 논리 조건을 설정합니다.

멤버함수 파라미터 설 명
SetLogicalConditionOfChannels ImageProcessing::ELogicalConditionOfChannels eLogicalConditionOfChannels IN 각 채널의 결과에 대한 논리 연산 방식

채널별 결과들을 어떤 논리 연산 방식으로 처리할지 설정합니다. And를 선택하면 모든 채널의 연산 결과가 참인 경우 최종 결과가 참이 되고, Or를 선택하면 하나의 채널이라도 연산 결과가 참이라면 최종 결과가 참이 됩니다.
eCondition - Default Value: ELogicalConditionOfChannels_And, Recommended Value: ELogicalConditionOfChannels_And