Skip to content

Commit

Permalink
MatchTemplateMask: Replace NaN's and Inf with 0
Browse files Browse the repository at this point in the history
  • Loading branch information
ollydev committed Jun 21, 2023
1 parent 0a498a1 commit f77218e
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 12 deletions.
9 changes: 5 additions & 4 deletions Source/matchtemplate/simba.matchtemplate_ccoeff.pas
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@

{$i simba.inc}

{$IFOPT D-}
{$OPTIMIZATION LEVEL4}
{$ENDIF}

{$DEFINE SIMBA_MAX_OPTIMIZATION}
{$MODESWITCH ARRAYOPERATORS OFF}

interface
Expand Down Expand Up @@ -124,6 +121,8 @@ function MatchTemplateMask_CCOEFF(Image, Template: TIntegerMatrix; Normed: Boole
Result := CrossCorrRGB(ImageChannels, TemplxMask).Merge() - (ImgMaskCorr * (TemplxMaskSum[0] / MaskSum) + (TemplxMaskSum[1] / MaskSum) + (TemplxMaskSum[2] / MaskSum));
if Normed then
Result /= ImgNormCorr * Norm(TemplxMask);

Result.ReplaceNaNAndInf(0);
end;

function MatchTemplateMask_CCOEFF_MT(Image, Template: TIntegerMatrix; Normed: Boolean): TSingleMatrix;
Expand Down Expand Up @@ -190,6 +189,8 @@ function MatchTemplateMask_CCOEFF_Cache(ACache: TMatchTemplateCacheBase; Templat
SimbaThreadPool.RunParallel(Tasks);
end else
DoMatchTemplate(0);

Result.ReplaceNaNAndInf(0);
end;

function MatchTemplate_CCOEFF(Image, Template: TIntegerMatrix; Normed: Boolean): TSingleMatrix;
Expand Down
9 changes: 5 additions & 4 deletions Source/matchtemplate/simba.matchtemplate_ccorr.pas
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@

{$i simba.inc}

{$IFOPT D-}
{$OPTIMIZATION LEVEL4}
{$ENDIF}

{$DEFINE SIMBA_MAX_OPTIMIZATION}
{$MODESWITCH ARRAYOPERATORS OFF}

interface
Expand Down Expand Up @@ -118,6 +115,8 @@ function MatchTemplateMask_CCORR(Image, Template: TIntegerMatrix; Normed: Boolea
for X := 0 to W do
Result[Y, X] := Result[Y, X] / Sqrt(Templ2Mask2Sum * TempResult[Y, X]);
end;

Result.ReplaceNaNAndInf(0);
end;

function MatchTemplateMask_CCORR_Cache(ACache: TMatchTemplateCacheBase; Template: TIntegerMatrix; Normed: Boolean): TSingleMatrix;
Expand Down Expand Up @@ -176,6 +175,8 @@ function MatchTemplateMask_CCORR_Cache(ACache: TMatchTemplateCacheBase; Template
SimbaThreadPool.RunParallel(Tasks);
end else
DoMatchTemplate(0);

Result.ReplaceNaNAndInf(0);
end;

function MatchTemplateMask_CCORR_MT(Image, Template: TIntegerMatrix; Normed: Boolean): TSingleMatrix;
Expand Down
9 changes: 5 additions & 4 deletions Source/matchtemplate/simba.matchtemplate_sqdiff.pas
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@

{$i simba.inc}

{$IFOPT D-}
{$OPTIMIZATION LEVEL4}
{$ENDIF}

{$DEFINE SIMBA_MAX_OPTIMIZATION}
{$MODESWITCH ARRAYOPERATORS OFF}

interface
Expand Down Expand Up @@ -131,6 +128,8 @@ function MatchTemplateMask_SQDIFF_Cache(ACache: TMatchTemplateCacheBase; Templat
SimbaThreadPool.RunParallel(Tasks);
end else
DoMatchTemplate(0);

Result.ReplaceNaNAndInf(0);
end;

function MatchTemplateMask_SQDIFF(Image, Template: TIntegerMatrix; Normed: Boolean): TSingleMatrix;
Expand Down Expand Up @@ -169,6 +168,8 @@ function MatchTemplateMask_SQDIFF(Image, Template: TIntegerMatrix; Normed: Boole
for X := 0 to W do
Result[Y, X] := Result[Y, X] / Sqrt(Templ2Mask2Sum * TempResult[Y, X]);
end;

Result.ReplaceNaNAndInf(0);
end;

function MatchTemplateMask_SQDIFF_MT(Image, Template: TIntegerMatrix; Normed: Boolean): TSingleMatrix;
Expand Down
13 changes: 13 additions & 0 deletions Source/script/imports/simba/simba.import_math.pas
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,16 @@ procedure _LapePointInEllipse(const Params: PParamArray; const Result: Pointer);
PBoolean(Result)^ := TSimbaGeometry.PointInEllipse(PPoint(Params^[0])^, PPoint(Params^[1])^, PDouble(Params^[2])^, PDouble(Params^[3])^);
end;

procedure _LapeIsNumberS(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
PBoolean(Result)^ := IsNumber(PSingle(Params^[0])^);
end;

procedure _LapeIsNumberD(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
PBoolean(Result)^ := IsNumber(PDouble(Params^[0])^);
end;

procedure ImportMath(Compiler: TSimbaScript_Compiler);
begin
with Compiler do
Expand All @@ -171,6 +181,9 @@ procedure ImportMath(Compiler: TSimbaScript_Compiler);
addGlobalVar(SQRT_3, 'SQRT_3').isConstant := True;
addGlobalVar(SQRT_5, 'SQRT_5').isConstant := True;

addGlobalFunc('function IsNumber(const Value: Single): Boolean; overload', @_LapeIsNumberS);
addGlobalFunc('function IsNumber(const Value: Double): Boolean; overload', @_LapeIsNumberD);

addGlobalFunc('function Distance(const X1, Y1, X2, Y2: Integer): Integer; overload', @_LapeDistance);
addGlobalFunc('function Distance(const P1, P2: TPoint): Integer; overload', @_LapeDistanceEx);
addGlobalFunc('function FixD(Deg: Double): Double', @_LapeFixD);
Expand Down
33 changes: 33 additions & 0 deletions Source/singlematrix.inc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ type
function ArgMulti(Count: Integer; HiLo: Boolean): TPointArray;
procedure Smoothen(Block: Integer);
function Sum: Double;
function Equals(Other: TSingleMatrix; Epsilon: Single = 0): Boolean;
procedure ReplaceNaNAndInf(const ReplaceWith: Single);
end;
{$ENDIF}

Expand Down Expand Up @@ -450,4 +452,35 @@ begin
Result := Result + Value;
end;
end;

function TSingleMatrixHelper.Equals(Other: TSingleMatrix; Epsilon: Single): Boolean;
var
X, Y, W, H: Integer;
begin
Result := False;
if (Self.Width <> Other.Width) or (Self.Height <> Other.Height) then
Exit;

if Self.GetSizeMinusOne(W, H) then
begin
for Y := 0 to H do
for X := 0 to W do
if (not SameValue(Self[Y,X], Other[Y,X], Epsilon)) then
Exit;

Result := True;
end;
end;

procedure TSingleMatrixHelper.ReplaceNaNAndInf(const ReplaceWith: Single);
var
X, Y, W, H: Integer;
begin
if Self.GetSizeMinusOne(W, H) then
for Y := 0 to H do
for X := 0 to W do
if not IsNumber(Self[Y,X]) then
Self[Y,X] := ReplaceWith;
end;

{$ENDIF}
16 changes: 16 additions & 0 deletions Tests/matchtemplatemask2.simba
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
var
img, templ: TMufasaBitmap;
mat: TSingleMatrix;
s: Single;
begin
img := TMufasaBitmap.CreateFromString(137, 167, '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');
img.FreeOnTerminate(True);
templ := img.copy(8,8,22,22);
templ.FreeOnTerminate(True);

mat := MatchTemplateMask(img.ToMatrix(), templ.ToMatrix(), TM_CCOEFF_NORMED);

for s in mat.Flatten() do
if not IsNumber(s) then
raise 'We have a NaN/Inf: ' + ToString(s);
end.

0 comments on commit f77218e

Please sign in to comment.