function
Vision.Matching.RGBDPatchTracking.SmoothBinomial
Public declarations
Explicit source declarations; dimensions, modifications and defaults are shown as written, without evaluation.
| Role | Name | Type | Dimensions / attributes / default | Description |
|---|---|---|---|---|
| input | gray | Real | [:,:] | |
| output | filtered | Real | [size(gray,1),size(gray,2)] | -1 where complete valid support is unavailable |
| output | valid | Boolean | [size(gray,1),size(gray,2)] |
Modelica declarations and implementation
Show parameters, interfaces and source
Parameters, inputs, outputs, defaults and equations from the source file.
function SmoothBinomial
input Real gray[:,:];
output Real filtered[size(gray,1),size(gray,2)] "-1 where complete valid support is unavailable";
output Boolean valid[size(gray,1),size(gray,2)];
protected
constant Integer tapCount = 5;
constant Real weights[tapCount] = {1,4,6,4,1};
constant Real weightSum = 16;
Real horizontal[size(gray,1),size(gray,2)]; Real values[tapCount]; Boolean supportValid;
algorithm
filtered := fill(-1.0,size(gray,1),size(gray,2));
valid := fill(false,size(gray,1),size(gray,2));
horizontal := fill(-1.0,size(gray,1),size(gray,2));
// All taps have positive weight: invalid samples are never renormalized away.
// The outer two-pixel border has no complete support; no padding is invented.
if size(gray,1) < tapCount or size(gray,2) < tapCount then return; end if;
for row in 1:size(gray,1) loop
for column in 3:size(gray,2)-2 loop
supportValid := true;
for tap in 1:tapCount loop
values[tap] := gray[row,column+tap-3];
supportValid := supportValid and values[tap] >= 0 and values[tap] <= 1;
end for;
if supportValid then horizontal[row,column] := weights*values/weightSum; end if;
end for;
end for;
for row in 3:size(gray,1)-2 loop
for column in 3:size(gray,2)-2 loop
supportValid := true;
for tap in 1:tapCount loop
values[tap] := horizontal[row+tap-3,column];
supportValid := supportValid and values[tap] >= 0 and values[tap] <= 1;
end for;
if supportValid then
filtered[row,column] := weights*values/weightSum; valid[row,column] := true;
end if;
end for;
end for;
end SmoothBinomial;