Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
imagej-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
imagej-elphel
Commits
200f2455
Commit
200f2455
authored
Oct 17, 2021
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Mixing noise - random and FPN for performance evaluation
parent
3ca96c86
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
319 additions
and
128 deletions
+319
-128
InterNoiseParameters.java
.../java/com/elphel/imagej/cameras/InterNoiseParameters.java
+56
-25
NoiseParameters.java
...java/com/elphel/imagej/tileprocessor/NoiseParameters.java
+34
-0
OpticalFlow.java
...ain/java/com/elphel/imagej/tileprocessor/OpticalFlow.java
+90
-50
QuadCLTCPU.java
...main/java/com/elphel/imagej/tileprocessor/QuadCLTCPU.java
+117
-45
TwoQuadCLT.java
...main/java/com/elphel/imagej/tileprocessor/TwoQuadCLT.java
+22
-8
No files found.
src/main/java/com/elphel/imagej/cameras/InterNoiseParameters.java
View file @
200f2455
...
...
@@ -28,64 +28,95 @@ package com.elphel.imagej.cameras;
import
java.util.Properties
;
import
com.elphel.imagej.common.GenericJTabbedDialog
;
import
com.elphel.imagej.tileprocessor.NoiseParameters
;
public
class
InterNoiseParameters
{
public
double
noise_sigma
=
1.5
;
public
double
noise_scale
=
0.01
;
public
double
initial_offset
=
1.0
;
public
NoiseParameters
noise
=
new
NoiseParameters
(
0.1
,
0.0
,
1.5
,
1.0
,
16
);
// public double noise_sigma = 1.5;
// public double noise_scale = 0.01;
// public double initial_offset = 1.0;
public
boolean
ref_only
=
false
;
// also see imgdtt_params.dbg_pair_mask to switch between all pairs (63) and binocular only (1)
public
boolean
show_final_2d
=
true
;
// show 2d correlations during last interation step
public
int
noise_debug_level
=
-
1
;
// Noise testing debug level
public
void
dialogQuestions
(
GenericJTabbedDialog
gd
)
{
gd
.
addMessage
(
"Additive noise parameters"
);
gd
.
addMessage
(
"LMA other parameters"
);
gd
.
addNumericField
(
"Noise Gaussian sigma"
,
this
.
noise
_sigma
,
3
,
5
,
"pix"
,
gd
.
addNumericField
(
"Noise Gaussian sigma"
,
this
.
noise
.
sigma
,
3
,
5
,
"pix"
,
"Blur noise with 2D Gaussian"
);
gd
.
addNumericField
(
"Scale noise"
,
this
.
noise_scale
,
6
,
8
,
""
,
gd
.
addNumericField
(
"Scale noise random (each scene indepemdent)"
,
this
.
noise
.
scale_random
,
6
,
8
,
""
,
"Scale noise relative to the average value of the color component"
);
gd
.
addNumericField
(
"Scale noise FPN (same for each scene)"
,
this
.
noise
.
scale_fpn
,
6
,
8
,
""
,
"Scale noise relative to the average value of the color component."
);
gd
.
addNumericField
(
"Offset target disparity"
,
this
.
initial_offset
,
3
,
5
,
"pix"
,
gd
.
addNumericField
(
"Offset target disparity"
,
this
.
noise
.
initial_offset
,
3
,
5
,
"pix"
,
"Offset target disparity before attempting to correlate and refine."
);
gd
.
addNumericField
(
"Subset number of sensors (2/4/8/16)"
,
this
.
noise
.
used_sensors
,
0
,
3
,
""
,
"Performance comparison - use only some of 16 sensors"
);
gd
.
addCheckbox
(
"Reference scene only"
,
this
.
ref_only
,
"Process only reference scene (intra-scene, no inter-scene accumulation)."
);
gd
.
addNumericField
(
"Debug level"
,
this
.
noise_debug_level
,
0
,
3
,
""
,
gd
.
addCheckbox
(
"Show 2d correlations for the last iteration"
,
this
.
show_final_2d
,
"Show single-scene and interframe 2d correlations for the last iteration"
);
gd
.
addNumericField
(
"Debug level"
,
this
.
noise_debug_level
,
0
,
3
,
""
,
"Debug level of interscene noise testing."
);
}
public
void
dialogAnswers
(
GenericJTabbedDialog
gd
)
{
this
.
noise_sigma
=
gd
.
getNextNumber
();
this
.
noise_scale
=
gd
.
getNextNumber
();
this
.
initial_offset
=
gd
.
getNextNumber
();
this
.
noise
.
sigma
=
gd
.
getNextNumber
();
this
.
noise
.
scale_random
=
gd
.
getNextNumber
();
this
.
noise
.
scale_fpn
=
gd
.
getNextNumber
();
this
.
noise
.
initial_offset
=
gd
.
getNextNumber
();
this
.
noise
.
used_sensors
=
(
int
)
gd
.
getNextNumber
();
this
.
ref_only
=
gd
.
getNextBoolean
();
this
.
show_final_2d
=
gd
.
getNextBoolean
();
this
.
noise_debug_level
=
(
int
)
gd
.
getNextNumber
();
}
public
void
setProperties
(
String
prefix
,
Properties
properties
){
properties
.
setProperty
(
prefix
+
"noise_sigma"
,
this
.
noise_sigma
+
""
);
properties
.
setProperty
(
prefix
+
"noise_scale"
,
this
.
noise_scale
+
""
);
properties
.
setProperty
(
prefix
+
"initial_offset"
,
this
.
initial_offset
+
""
);
properties
.
setProperty
(
prefix
+
"ref_only"
,
this
.
ref_only
+
""
);
properties
.
setProperty
(
prefix
+
"noise_debug_level"
,
this
.
noise_debug_level
+
""
);
properties
.
setProperty
(
prefix
+
"noise.sigma"
,
this
.
noise
.
sigma
+
""
);
properties
.
setProperty
(
prefix
+
"noise.scale_random"
,
this
.
noise
.
scale_random
+
""
);
properties
.
setProperty
(
prefix
+
"noise.scale_fpn"
,
this
.
noise
.
scale_fpn
+
""
);
properties
.
setProperty
(
prefix
+
"noise.initial_offset"
,
this
.
noise
.
initial_offset
+
""
);
properties
.
setProperty
(
prefix
+
"noise.used_sensors"
,
this
.
noise
.
used_sensors
+
""
);
properties
.
setProperty
(
prefix
+
"ref_only"
,
this
.
ref_only
+
""
);
properties
.
setProperty
(
prefix
+
"show_final_2d"
,
this
.
show_final_2d
+
""
);
properties
.
setProperty
(
prefix
+
"noise_debug_level"
,
this
.
noise_debug_level
+
""
);
}
public
void
getProperties
(
String
prefix
,
Properties
properties
){
if
(
properties
.
getProperty
(
prefix
+
"noise_sigma"
)!=
null
)
this
.
noise_sigma
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise_sigma"
));
if
(
properties
.
getProperty
(
prefix
+
"noise_scale"
)!=
null
)
this
.
noise_scale
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise_scale"
));
if
(
properties
.
getProperty
(
prefix
+
"initial_offset"
)!=
null
)
this
.
initial_offset
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"initial_offset"
));
if
(
properties
.
getProperty
(
prefix
+
"noise.sigma"
)!=
null
)
{
this
.
noise
.
sigma
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise.sigma"
));
}
else
if
(
properties
.
getProperty
(
prefix
+
"noise_sigma"
)!=
null
)
{
// old format
this
.
noise
.
sigma
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise_sigma"
));
}
if
(
properties
.
getProperty
(
prefix
+
"noise.scale_random"
)!=
null
)
{
this
.
noise
.
scale_random
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise.scale_random"
));
}
else
if
(
properties
.
getProperty
(
prefix
+
"noise_scale"
)!=
null
)
{
this
.
noise
.
scale_random
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise_scale"
));
}
if
(
properties
.
getProperty
(
prefix
+
"noise.scale_fpn"
)!=
null
)
this
.
noise
.
scale_fpn
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise.scale_fpn"
));
if
(
properties
.
getProperty
(
prefix
+
"noise.initial_offset"
)!=
null
)
{
this
.
noise
.
initial_offset
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"noise.initial_offset"
));
}
else
if
(
properties
.
getProperty
(
prefix
+
"initial_offset"
)!=
null
)
{
this
.
noise
.
initial_offset
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"initial_offset"
));
}
if
(
properties
.
getProperty
(
prefix
+
"noise.used_sensors"
)!=
null
)
this
.
noise
.
used_sensors
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"noise.used_sensors"
));
if
(
properties
.
getProperty
(
prefix
+
"ref_only"
)!=
null
)
this
.
ref_only
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"ref_only"
));
if
(
properties
.
getProperty
(
prefix
+
"show_final_2d"
)!=
null
)
this
.
show_final_2d
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"show_final_2d"
));
if
(
properties
.
getProperty
(
prefix
+
"noise_debug_level"
)!=
null
)
this
.
noise_debug_level
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"noise_debug_level"
));
}
@Override
public
InterNoiseParameters
clone
()
throws
CloneNotSupportedException
{
InterNoiseParameters
inp
=
new
InterNoiseParameters
();
inp
.
noise_sigma
=
this
.
noise_sigma
;
inp
.
noise_scale
=
this
.
noise_scale
;
inp
.
initial_offset
=
this
.
initial_offset
;
InterNoiseParameters
inp
=
new
InterNoiseParameters
();
inp
.
noise
=
this
.
noise
.
clone
();
inp
.
ref_only
=
this
.
ref_only
;
inp
.
show_final_2d
=
this
.
show_final_2d
;
inp
.
noise_debug_level
=
this
.
noise_debug_level
;
return
inp
;
}
}
src/main/java/com/elphel/imagej/tileprocessor/NoiseParameters.java
0 → 100644
View file @
200f2455
package
com
.
elphel
.
imagej
.
tileprocessor
;
import
com.elphel.imagej.cameras.InterNoiseParameters
;
public
class
NoiseParameters
{
public
double
scale_random
=
0.1
;
public
double
scale_fpn
=
0.0
;
public
double
sigma
=
1.5
;
public
double
initial_offset
=
1.0
;
public
int
used_sensors
=
16
;
// 2/4/8/16
public
NoiseParameters
(
double
scale_random
,
double
scale_fpn
,
double
sigma
,
double
initial_offset
,
int
used_sensors
)
{
this
.
scale_random
=
scale_random
;
this
.
scale_fpn
=
scale_fpn
;
this
.
sigma
=
sigma
;
this
.
initial_offset
=
initial_offset
;
this
.
used_sensors
=
used_sensors
;
}
@Override
public
NoiseParameters
clone
()
throws
CloneNotSupportedException
{
return
new
NoiseParameters
(
scale_random
,
scale_fpn
,
sigma
,
initial_offset
,
used_sensors
);
}
}
src/main/java/com/elphel/imagej/tileprocessor/OpticalFlow.java
View file @
200f2455
...
...
@@ -3163,7 +3163,8 @@ public class OpticalFlow {
ColorProcParameters
colorProcParameters
,
QuadCLT
.
SetChannels
[]
set_channels
,
QuadCLT
ref_scene
,
// ordered by increasing timestamps
double
[]
noise_sigma_level
,
// double []
NoiseParameters
noise_sigma_level
,
int
debug_level
)
{
...
...
@@ -3192,6 +3193,7 @@ public class OpticalFlow {
clt_parameters
,
colorProcParameters
,
//
noise_sigma_level
,
// double [] noise_sigma_level,
ref_scene
,
// QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
-
1
);
// debug_level);
scenes
[
i
].
setDSRBG
(
...
...
@@ -3276,6 +3278,7 @@ public class OpticalFlow {
combo_dsn_change
[
0
],
// final double [] disparity_ref, // disparity in the reference view tiles (Double.NaN - invalid)
margin
,
// final int margin,
nrefine
,
// final int nrefine, // just for debug title
clt_parameters
.
inp
.
show_final_2d
,
// final boolean show_2d_corr,
debug_level
-
5
);
// final int debug_level)
Runtime
.
getRuntime
().
gc
();
...
...
@@ -3386,7 +3389,8 @@ public class OpticalFlow {
boolean
ref_only
,
// process only reference frame (false - inter-scene)
ColorProcParameters
colorProcParameters
,
QuadCLT
ref_scene
,
// ordered by increasing timestamps
double
[]
noise_sigma_level
,
// double []
NoiseParameters
noise_sigma_level
,
int
debug_level
)
{
...
...
@@ -3405,6 +3409,7 @@ public class OpticalFlow {
clt_parameters
,
colorProcParameters
,
//
noise_sigma_level
,
// double [] noise_sigma_level,
ref_scene
,
// QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
-
1
);
// debug_level);
scenes
[
i
].
setDSRBG
(
...
...
@@ -3475,7 +3480,7 @@ public class OpticalFlow {
}
if
(
noise_sigma_level
!=
null
)
{
// add initial offset to the expected disparity
for
(
int
i
=
0
;
i
<
combo_dsn_change
[
0
].
length
;
i
++)
{
combo_dsn_change
[
0
][
i
]
+=
noise_sigma_level
[
2
];
combo_dsn_change
[
0
][
i
]
+=
noise_sigma_level
.
initial_offset
;
//
[2];
}
}
for
(
int
nrefine
=
0
;
nrefine
<
max_refines
;
nrefine
++)
{
...
...
@@ -3543,13 +3548,20 @@ public class OpticalFlow {
//noise_sigma_level
String
rslt_suffix
=
"-results-nonoise"
;
if
(
noise_sigma_level
!=
null
)
{
rslt_suffix
=
"-results-lev_"
+
noise_sigma_level
[
0
]+
"-sigma_"
+
noise_sigma_level
[
1
]+
"-offset"
+
noise_sigma_level
[
2
];
// rslt_suffix = "-results-lev_"+noise_sigma_level[0]+"-sigma_"+noise_sigma_level[1]+"-offset"+noise_sigma_level[2];
rslt_suffix
=
"-results-rnd_"
+
noise_sigma_level
.
scale_random
+
"-fpn_"
+
noise_sigma_level
.
scale_fpn
+
"-sigma_"
+
noise_sigma_level
.
sigma
+
// [1]+
"-offset"
+
noise_sigma_level
.
initial_offset
+
// [2];
"-sensors"
+
noise_sigma_level
.
used_sensors
;
if
(
ref_only
)
{
rslt_suffix
+=
"-nointer"
;
}
else
{
rslt_suffix
+=
"-inter"
;
}
rslt_suffix
+=
"-mask"
+
clt_parameters
.
img_dtt
.
dbg_pair_mask
;
//
rslt_suffix +="-mask"+clt_parameters.img_dtt.dbg_pair_mask;
}
ref_scene
.
saveDoubleArrayInModelDirectory
(
rslt_suffix
,
// String suffix,
...
...
@@ -3597,7 +3609,8 @@ public class OpticalFlow {
boolean
ref_only
,
// process only reference frame (false - inter-scene)
ColorProcParameters
colorProcParameters
,
QuadCLT
ref_scene
,
// ordered by increasing timestamps
double
[]
noise_sigma_level
,
// double []
NoiseParameters
noise_sigma_level
,
int
debug_level
)
{
...
...
@@ -3616,6 +3629,7 @@ public class OpticalFlow {
clt_parameters
,
colorProcParameters
,
//
noise_sigma_level
,
// double [] noise_sigma_level,
ref_scene
,
// QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
-
1
);
// debug_level);
scenes
[
i
].
setDSRBG
(
...
...
@@ -3624,31 +3638,44 @@ public class OpticalFlow {
updateStatus
,
// boolean updateStatus,
-
1
);
// debug_level); // int debugLevel)
}
// String [] combo_dsn_titles = {"disp", "strength", "num_valid","change"};
String
[]
combo_dsn_titles
=
{
"disp"
,
"strength"
,
"disp_lma"
,
"num_valid"
,
"change"
};
// final String [] iter_titles = {"disp", "diff", "strength","disp_lma"};
final
int
[]
iter_indices
=
{
0
,
1
,
2
,
4
};
// which to save for each iteration: {"disp", "strength","disp_lma","change"};
final
int
[]
initial_indices
=
{
0
,
1
,
3
};
// initial: "disp", "strength","num_valid"
double
[][]
combo_dsn
=
null
;
if
(
noise_sigma_level
==
null
)
{
combo_dsn
=
prepareInitialComboDS
(
double
[][]
combo_dsn0
=
prepareInitialComboDS
(
// 3
clt_parameters
,
// final CLTParameters clt_parameters,
scenes
,
// final QuadCLT [] scenes,
indx_ref
,
// final int indx_ref,
debug_level
-
2
);
// final int debug_level);
combo_dsn
=
new
double
[
combo_dsn_titles
.
length
-
1
][];
for
(
int
i
=
0
;
i
<
combo_dsn0
.
length
;
i
++)
{
combo_dsn
[
initial_indices
[
i
]]
=
combo_dsn0
[
i
];
// "disp", "strength", <null>, "num_valid"
}
}
else
{
combo_dsn
=
ref_scene
.
readDoubleArrayFromModelDirectory
(
combo_dsn
=
ref_scene
.
readDoubleArrayFromModelDirectory
(
//"disp", "strength","disp_lma","num_valid"
"-results-nonoise"
,
// String suffix,
3
,
// int num_slices, // (0 - all)
combo_dsn_titles
.
length
-
1
,
// 4
null
);
// int [] wh);
}
final
double
[][]
combo_dsn_change
=
new
double
[
combo_dsn
.
length
+
1
][];
for
(
int
i
=
0
;
i
<
combo_dsn
.
length
;
i
++)
{
combo_dsn_change
[
i
]
=
combo_dsn
[
i
];
}
// final double [][] combo_dsn_change = new double [combo_dsn.length+1][];
final
int
margin
=
8
;
final
int
tilesX
=
ref_scene
.
getTileProcessor
().
getTilesX
();
final
int
tilesY
=
ref_scene
.
getTileProcessor
().
getTilesY
();
String
[]
combo_dsn_titles
=
{
"disp"
,
"strength"
,
"num_valid"
,
"change"
};
final
double
[][]
combo_dsn_change
=
new
double
[
combo_dsn_titles
.
length
]
[
tilesX
*
tilesY
];
for
(
int
i
=
0
;
i
<
combo_dsn
.
length
;
i
++)
{
// 4 elements: "disp", "strength","disp_lma","num_valid"
if
(
combo_dsn
[
i
]
!=
null
)
combo_dsn_change
[
i
]
=
combo_dsn
[
i
];
// all but change
}
if
(
noise_sigma_level
!=
null
)
{
// add initial offset to the expected disparity
for
(
int
i
=
0
;
i
<
combo_dsn_change
[
0
].
length
;
i
++)
{
combo_dsn_change
[
0
][
i
]
+=
noise_sigma_level
.
initial_offset
;
// [2];
}
}
// combo_dsn_change[combo_dsn_change.length - 1] = new double [tilesX*tilesY];
if
(
debug_level
>
0
)
{
(
new
ShowDoubleFloatArrays
()).
showArrays
(
combo_dsn_change
,
...
...
@@ -3660,35 +3687,30 @@ public class OpticalFlow {
}
final
int
max_refines
=
10
;
final
String
[]
iter_titles
=
{
"disp"
,
"diff"
,
"strength"
};
final
int
[]
iter_indices
=
{
0
,
1
,
3
};
// final String [] iter_titles = {"disp", "diff", "strength"};
final
int
last_slices
=
combo_dsn_titles
.
length
;
final
int
last_initial_slices
=
last_slices
+
i
ter_titl
es
.
length
;
final
int
last_initial_slices
=
last_slices
+
i
nitial_indic
es
.
length
;
final
double
[][]
refine_results
=
new
double
[
last_slices
+
3
*
(
max_refines
+
1
)][];
// final double [][] refine_results = new double [last_slices + 3 * (max_refines + 1)][];
final
double
[][]
refine_results
=
new
double
[
last_slices
+
4
*
(
max_refines
+
1
)][];
String
[]
refine_titles
=
new
String
[
refine_results
.
length
];
for
(
int
i
=
0
;
i
<
combo_dsn_titles
.
length
;
i
++)
{
refine_results
[
i
]
=
combo_dsn_change
[
i
];
refine_titles
[
i
]
=
combo_dsn_titles
[
i
]+
"-last"
;
refine_results
[
i
]
=
combo_dsn_change
[
i
];
// first 5 - references to 5-element combo_dsn_change
refine_titles
[
i
]
=
combo_dsn_titles
[
i
]+
"-last"
;
// "disp", "strength","disp_lma","num_valid","change"
}
for
(
int
i
=
0
;
i
<
i
ter_titl
es
.
length
;
i
++)
{
refine_titles
[
last_slices
+
i
]
=
iter_titles
[
i
]+
"-initial"
;
if
(
combo_dsn_change
[
i
ter
_indices
[
i
]]
!=
null
)
{
refine_results
[
last_slices
+
i
]
=
combo_dsn_change
[
i
ter
_indices
[
i
]].
clone
();
for
(
int
i
=
0
;
i
<
i
nitial_indic
es
.
length
;
i
++)
{
refine_titles
[
last_slices
+
i
]
=
combo_dsn_titles
[
initial_indices
[
i
]]+
"-initial"
;
// "disp", "strength","num_valid"
if
(
combo_dsn_change
[
i
nitial
_indices
[
i
]]
!=
null
)
{
refine_results
[
last_slices
+
i
]
=
combo_dsn_change
[
i
nitial
_indices
[
i
]].
clone
();
}
else
{
refine_results
[
last_slices
+
i
]
=
new
double
[
tilesX
*
tilesY
];
}
}
for
(
int
nrefine
=
0
;
nrefine
<
max_refines
;
nrefine
++)
{
for
(
int
i
=
0
;
i
<
iter_
titl
es
.
length
;
i
++)
{
for
(
int
i
=
0
;
i
<
iter_
indic
es
.
length
;
i
++)
{
refine_titles
[
last_initial_slices
+
i
*
max_refines
+
nrefine
]
=
combo_dsn_titles
[
iter_indices
[
i
]]+
"-"
+
nrefine
;
}
}
if
(
noise_sigma_level
!=
null
)
{
// add initial offset to the expected disparity
for
(
int
i
=
0
;
i
<
combo_dsn_change
[
0
].
length
;
i
++)
{
combo_dsn_change
[
0
][
i
]
+=
noise_sigma_level
[
2
];
}
}
for
(
int
nrefine
=
0
;
nrefine
<
max_refines
;
nrefine
++)
{
Runtime
.
getRuntime
().
gc
();
System
.
out
.
println
(
"--- Free memory="
+
Runtime
.
getRuntime
().
freeMemory
()+
" (of "
+
Runtime
.
getRuntime
().
totalMemory
()+
")"
);
...
...
@@ -3702,10 +3724,12 @@ public class OpticalFlow {
combo_dsn_change
[
0
],
// final double [] disparity_ref, // disparity in the reference view tiles (Double.NaN - invalid)
margin
,
// final int margin,
nrefine
,
// final int nrefine, // just for debug title
(
nrefine
==
(
max_refines
-
1
))
&&
clt_parameters
.
inp
.
show_final_2d
,
// final boolean show_2d_corr,
debug_level
-
5
);
// final int debug_level)
Runtime
.
getRuntime
().
gc
();
System
.
out
.
println
(
"--- Free memory="
+
Runtime
.
getRuntime
().
freeMemory
()+
" (of "
+
Runtime
.
getRuntime
().
totalMemory
()+
")"
);
if
(
debug_level
>
0
)
{
(
new
ShowDoubleFloatArrays
()).
showArrays
(
disparity_map
,
...
...
@@ -3725,12 +3749,24 @@ public class OpticalFlow {
combo_dsn_change
[
1
][
nTile
]
=
disparity_map
[
strength_index
][
nTile
];
}
}
combo_dsn_change
[
combo_dsn_change
.
length
-
1
]
=
disparity_map
[
disparity_index
];
System
.
arraycopy
(
combo_dsn_change
[
0
],
0
,
combo_dsn_change
[
2
],
0
,
combo_dsn_change
[
0
].
length
);
// lma
// combo_dsn_change[2] = combo_dsn_change[0].clone(); // lma
double
[]
disp_lma
=
disparity_map
[
ImageDtt
.
DISPARITY_INDEX_POLY
];
if
(
disp_lma
!=
null
)
{
for
(
int
i
=
0
;
i
<
disp_lma
.
length
;
i
++)
{
if
(
Double
.
isNaN
(
disp_lma
[
i
]))
{
combo_dsn_change
[
2
][
i
]
=
Double
.
NaN
;
}
}
}
for
(
int
i
=
0
;
i
<
iter_titles
.
length
;
i
++)
{
// combo_dsn_change[combo_dsn_change.length -1] = disparity_map[disparity_index];
System
.
arraycopy
(
disparity_map
[
disparity_index
],
0
,
combo_dsn_change
[
combo_dsn_change
.
length
-
1
],
0
,
combo_dsn_change
[
0
].
length
);
// lma
for
(
int
i
=
0
;
i
<
iter_indices
.
length
;
i
++)
{
refine_results
[
last_initial_slices
+
(
i
*
max_refines
)
+
nrefine
]
=
combo_dsn_change
[
iter_indices
[
i
]].
clone
();
}
// clt_parameters.inp.show_final_2d, // final boolean show_2d_corr,
if
(
debug_level
>
0
)
{
(
new
ShowDoubleFloatArrays
()).
showArrays
(
combo_dsn_change
,
...
...
@@ -3754,13 +3790,19 @@ public class OpticalFlow {
//noise_sigma_level
String
rslt_suffix
=
"-results-nonoise"
;
if
(
noise_sigma_level
!=
null
)
{
rslt_suffix
=
"-results-lev_"
+
noise_sigma_level
[
0
]+
"-sigma_"
+
noise_sigma_level
[
1
]+
"-offset"
+
noise_sigma_level
[
2
];
rslt_suffix
=
// "-results-lev_"+noise_sigma_level[0]+
"-results-rnd_"
+
noise_sigma_level
.
scale_random
+
"-fpn_"
+
noise_sigma_level
.
scale_fpn
+
"-sigma_"
+
noise_sigma_level
.
sigma
+
// [1]+
"-offset"
+
noise_sigma_level
.
initial_offset
+
// [2];
"-sensors"
+
noise_sigma_level
.
used_sensors
;
if
(
ref_only
)
{
rslt_suffix
+=
"-nointer"
;
}
else
{
rslt_suffix
+=
"-inter"
;
}
rslt_suffix
+=
"-mask"
+
clt_parameters
.
img_dtt
.
dbg_pair_mask
;
//
rslt_suffix +="-mask"+clt_parameters.img_dtt.dbg_pair_mask;
}
ref_scene
.
saveDoubleArrayInModelDirectory
(
rslt_suffix
,
// String suffix,
...
...
@@ -4002,9 +4044,9 @@ public double[][] correlateIntersceneDebug( // only uses GPU and quad
final
double
disparity_corr
=
debug_disparity_bias
;
// 0.0; // (z_correction == 0) ? 0.0 : geometryCorrection.getDisparityFromZ(1.0/z_correction);
for
(
int
nscene
=
0
;
nscene
<
num_scenes
;
nscene
++)
{
if
(
nscene
==
indx_ref
)
{
System
.
out
.
println
(
"\nCorrelating reference scene\n"
);
System
.
out
.
println
(
"\nCorrelating reference scene
, nrefine = "
+
nrefine
+
"
\n"
);
}
else
{
System
.
out
.
println
(
"\nCorrelating scene "
+
nscene
+
"\n"
);
System
.
out
.
println
(
"\nCorrelating scene "
+
n
refine
+
":"
+
n
scene
+
"\n"
);
}
String
ts
=
scenes
[
nscene
].
getImageName
();
double
[][]
scene_pXpYD
;
...
...
@@ -4936,9 +4978,9 @@ public double[][] correlateIntersceneDebug( // only uses GPU and quad
TpTask
[]
tp_tasks_ref
=
null
;
for
(
int
nscene
=
0
;
nscene
<
num_scenes
;
nscene
++)
{
if
(
nscene
==
indx_ref
)
{
System
.
out
.
println
(
"\nCorrelating reference scene\n"
);
System
.
out
.
println
(
"\nCorrelating reference scene
, nrefine = "
+
nrefine
+
"
\n"
);
}
else
{
System
.
out
.
println
(
"\nCorrelating scene "
+
nscene
+
"\n"
);
System
.
out
.
println
(
"\nCorrelating scene "
+
n
refine
+
":"
+
n
scene
+
"\n"
);
}
String
ts
=
scenes
[
nscene
].
getImageName
();
double
[][]
scene_pXpYD
;
...
...
@@ -5479,6 +5521,7 @@ public double[][] correlateIntersceneDebug( // only uses GPU and quad
final
double
[]
disparity_ref
,
// disparity in the reference view tiles (Double.NaN - invalid)
final
int
margin
,
final
int
nrefine
,
// just for debug title
final
boolean
show_2d_corr
,
final
int
debug_level
)
{
...
...
@@ -5494,12 +5537,9 @@ public double[][] correlateIntersceneDebug( // only uses GPU and quad
double
fat_zero_single
=
clt_parameters
.
getGpuFatZero
(
ref_scene
.
isMonochrome
());
// for single scene
// TODO: make per-tile variable
double
scaled_fat_zero
=
fat_zero_single
/
(
scenes
.
length
);
boolean
show_accumulated_correlations
=
debug_level
>
-
5
;
boolean
show_reference_correlations
=
debug_level
>
-
5
;
final
float
[][][]
fclt_corr
=
(
show_accumulated_correlations
||
show_reference_correlations
)
?
(
new
float
[
tilesX
*
tilesY
][][])
:
null
;
// not all used
boolean
show_accumulated_correlations
=
show_2d_corr
||
debug_level
>
-
5
;
boolean
show_reference_correlations
=
show_2d_corr
||
debug_level
>
-
5
;
final
float
[][][]
fclt_corr
=
(
show_accumulated_correlations
||
show_reference_correlations
)
?
(
new
float
[
tilesX
*
tilesY
][][])
:
null
;
// not all used
ImageDtt
image_dtt
;
image_dtt
=
new
ImageDtt
(
numSens
,
...
...
@@ -5523,9 +5563,9 @@ public double[][] correlateIntersceneDebug( // only uses GPU and quad
TpTask
[]
tp_tasks_ref
=
null
;
for
(
int
nscene
=
0
;
nscene
<
num_scenes
;
nscene
++)
{
if
(
nscene
==
indx_ref
)
{
System
.
out
.
println
(
"\nCorrelating reference scene\n"
);
System
.
out
.
println
(
"\nCorrelating reference scene
, nrefine = "
+
nrefine
+
"
\n"
);
}
else
{
System
.
out
.
println
(
"\nCorrelating scene "
+
nscene
+
"\n"
);
System
.
out
.
println
(
"\nCorrelating scene "
+
n
refine
+
":"
+
n
scene
+
"\n"
);
}
String
ts
=
scenes
[
nscene
].
getImageName
();
double
[][]
scene_pXpYD
;
...
...
src/main/java/com/elphel/imagej/tileprocessor/QuadCLTCPU.java
View file @
200f2455
...
...
@@ -228,7 +228,8 @@ public class QuadCLTCPU {
String
set_name
,
CLTParameters
clt_parameters
,
ColorProcParameters
colorProcParameters
,
double
[]
noise_sigma_level
,
NoiseParameters
noise_sigma_level
,
QuadCLTCPU
ref_scene
,
// may be null if scale_fpn <= 0
int
threadsMax
,
int
debugLevel
)
{
...
...
@@ -238,6 +239,7 @@ public class QuadCLTCPU {
clt_parameters
,
colorProcParameters
,
noise_sigma_level
,
// double [] noise_sigma_level,
ref_scene
,
// QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
debugLevel
);
...
...
@@ -282,7 +284,8 @@ public class QuadCLTCPU {
quadCLT
.
restoreFromModel
(
clt_parameters
,
colorProcParameters
,
null
,
// double [] noise_sigma_level,
null
,
// double [] noise_sigma_level,
null
,
// final QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
debugLevel
);
...
...
@@ -614,7 +617,9 @@ public class QuadCLTCPU {
public
QuadCLTCPU
restoreFromModel
(
CLTParameters
clt_parameters
,
ColorProcParameters
colorProcParameters
,
double
[]
noise_sigma_level
,
// double []
NoiseParameters
noise_sigma_level
,
QuadCLTCPU
ref_scene
,
// may be null if scale_fpn <= 0
int
threadsMax
,
int
debugLevel
)
...
...
@@ -654,6 +659,7 @@ public class QuadCLTCPU {
if
(
noise_sigma_level
!=
null
)
{
generateAddNoise
(
"-NOISE"
,
ref_scene
,
// final QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
noise_sigma_level
,
threadsMax
,
1
);
// debugLevel); // final int debug_level)
...
...
@@ -686,12 +692,110 @@ public class QuadCLTCPU {
public
void
generateAddNoise
(
final
String
suffix
,
final
double
[]
noise_sigma_level
,
final
QuadCLTCPU
ref_scene
,
// may be null if scale_fpn <= 0
// final double []
final
NoiseParameters
noise_sigma_level
,
final
int
threadsMax
,
final
int
debug_level
)
{
final
double
scale_random
=
noise_sigma_level
.
scale_random
;
// _sigma_level[0];
final
double
scale_fpn
=
noise_sigma_level
.
scale_fpn
;
// noise_sigma_level[0];
final
double
sigma
=
noise_sigma_level
.
sigma
;
// [1];
ImagePlus
imp
=
generateAddNoise
(
suffix
,
// final String suffix,
sigma
,
// final double sigma,
threadsMax
,
// final int threadsMax,
debug_level
);
// final int debug_level) : null;
ImagePlus
imp_ref
=
null
;
if
(
scale_fpn
>
0
){
if
(
ref_scene
!=
null
)
{
imp_ref
=
ref_scene
.
generateAddNoise
(
suffix
,
// final String suffix,
sigma
,
// final double sigma,
threadsMax
,
// final int threadsMax,
debug_level
);
// final int debug_level) : null;
}
else
{
imp_ref
=
imp
;
// when calculating ref_scene itself it is provided as null
}
}
final
int
num_cams
=
this
.
image_data
.
length
;
final
int
num_cols
=
image_data
[
0
].
length
;
final
Thread
[]
threads
=
ImageDtt
.
newThreadArray
(
threadsMax
);
final
AtomicInteger
ai
=
new
AtomicInteger
(
0
);
ImageStack
imageStack
=
imp
.
getStack
();
final
float
[][]
fpixels
=
new
float
[
num_cams
][];
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
fpixels
[
q
]
=
(
float
[])
imageStack
.
getPixels
(
q
+
1
);
}
final
float
[][]
fpixels_ref
=
(
imp_ref
!=
null
)
?
(
new
float
[
num_cams
][]):
null
;
if
(
imp_ref
!=
null
)
{
ImageStack
imageStack_ref
=
imp_ref
.
getStack
();
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
fpixels_ref
[
q
]
=
(
float
[])
imageStack_ref
.
getPixels
(
q
+
1
);
}
}
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
final
int
fq
=
q
;
for
(
int
c
=
0
;
c
<
num_cols
;
c
++)
{
final
int
fc
=
c
;
ai
.
set
(
0
);
for
(
int
ithread
=
0
;
ithread
<
threads
.
length
;
ithread
++)
{
threads
[
ithread
]
=
new
Thread
()
{
public
void
run
()
{
for
(
int
i
=
ai
.
getAndIncrement
();
i
<
image_data
[
fq
][
fc
].
length
;
i
=
ai
.
getAndIncrement
())
{
if
(
image_data
[
fq
][
fc
][
i
]
!=
0.0
)
{
image_data
[
fq
][
fc
][
i
]
+=
scale_random
*
fpixels
[
fq
][
i
];
if
(
fpixels_ref
!=
null
)
{
image_data
[
fq
][
fc
][
i
]
+=
scale_fpn
*
fpixels_ref
[
fq
][
i
];
}
}
}
}
};
}
ImageDtt
.
startAndJoin
(
threads
);
}
}
if
(
debug_level
>
100
)
{
double
[][]
dbg_data
=
new
double
[
num_cams
*
num_cols
][];
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
for
(
int
c
=
0
;
c
<
num_cols
;
c
++)
{
dbg_data
[
q
*
num_cols
+
c
]
=
image_data
[
q
][
c
];
}
}
int
[]
image_wh
=
geometryCorrection
.
getSensorWH
();
String
noise_suffix
=
suffix
+
sigma
;
saveDoubleArrayInModelDirectory
(
noise_suffix
+
"-MIXED-RND"
+
scale_random
+
"-FPN"
+
scale_fpn
,
// noise_sigma_level[0], // String suffix,
null
,
// String [] labels, // or null
dbg_data
,
// double [][] data,
image_wh
[
0
],
// int width,
image_wh
[
1
]);
// int height)
}
}
// May need to run twice - for both refscene and this one if fpn >=0
/**
* Load existing noise image, generate if it did no exist
* @param suffix file name suffix (sigma will be added)
* @param sigma blur sigma (in pixels), the amount of added noise will be used by caller, noise image only depends on sigma
* @param threadsMax
* @param debug_level
* @return Noise image, one slice per sensor (Bayer mosaic still use 1 slice per sensor)
*/
public
ImagePlus
generateAddNoise
(
final
String
suffix
,
final
double
sigma
,
final
int
threadsMax
,
final
int
debug_level
)
{
final
double
scale
=
noise_sigma_level
[
0
];
final
double
sigma
=
noise_sigma_level
[
1
];
final
int
num_cams
=
this
.
image_data
.
length
;
final
int
num_cols
=
image_data
[
0
].
length
;
final
int
[]
image_wh
=
geometryCorrection
.
getSensorWH
();
...
...
@@ -815,45 +919,12 @@ public class QuadCLTCPU {
image_wh
[
0
],
// int width,
image_wh
[
1
]);
// int height)
}
ImageStack
imageStack
=
imp
.
getStack
();
float
[][]
fpixels
=
new
float
[
num_cams
][];
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
fpixels
[
q
]
=
(
float
[])
imageStack
.
getPixels
(
q
+
1
);
}
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
final
int
fq
=
q
;
for
(
int
c
=
0
;
c
<
num_cols
;
c
++)
{
final
int
fc
=
c
;
ai
.
set
(
0
);
for
(
int
ithread
=
0
;
ithread
<
threads
.
length
;
ithread
++)
{
threads
[
ithread
]
=
new
Thread
()
{
public
void
run
()
{
for
(
int
i
=
ai
.
getAndIncrement
();
i
<
image_data
[
fq
][
fc
].
length
;
i
=
ai
.
getAndIncrement
())
{
if
(
image_data
[
fq
][
fc
][
i
]
!=
0.0
)
{
image_data
[
fq
][
fc
][
i
]
+=
scale
*
fpixels
[
fq
][
i
];
}
}
}
};
}
ImageDtt
.
startAndJoin
(
threads
);
}
}
if
(
debug_level
>
100
)
{
double
[][]
dbg_data
=
new
double
[
num_cams
*
num_cols
][];
for
(
int
q
=
0
;
q
<
num_cams
;
q
++)
{
for
(
int
c
=
0
;
c
<
num_cols
;
c
++)
{
dbg_data
[
q
*
num_cols
+
c
]
=
image_data
[
q
][
c
];
}
}
saveDoubleArrayInModelDirectory
(
noise_suffix
+
"-MIXED"
+
noise_sigma_level
[
0
],
// String suffix,
null
,
// String [] labels, // or null
dbg_data
,
// double [][] data,
image_wh
[
0
],
// int width,
image_wh
[
1
]);
// int height)
}
}
return
imp
;
}
public
ImagePlus
saveDoubleArrayInModelDirectory
(
...
...
@@ -874,6 +945,7 @@ public class QuadCLTCPU {
ImagePlus
imp
=
new
ImagePlus
(
file_name
,
imageStack
);
FileSaver
fs
=
new
FileSaver
(
imp
);
fs
.
saveAsTiff
(
file_path
);
System
.
out
.
println
(
"saveDoubleArrayInModelDirectory(): saved "
+
file_path
);
return
imp
;
}
...
...
src/main/java/com/elphel/imagej/tileprocessor/TwoQuadCLT.java
View file @
200f2455
...
...
@@ -8619,6 +8619,7 @@ if (debugLevel > -100) return true; // temporarily !
clt_parameters
,
colorProcParameters
,
//
null
,
// noise_sigma_level, // double [] noise_sigma_level,
null
,
// final QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
debugLevel
);
// temporarily fix wrong sign:
...
...
@@ -8664,12 +8665,16 @@ if (debugLevel > -100) return true; // temporarily !
// double [] noise_sigma_level = {1.0, 1.5, 1.0}; // amount, sigma, offset
// double [] noise_sigma_level = {3.0, 1.5, 1.0}; // amount, sigma, offset
// double [] noise_sigma_level = {5.0, 1.5, 1.0}; // amount, sigma, offset
double
[]
noise_sigma_level
=
null
;
if
(
clt_parameters
.
inp
.
noise_scale
>
0.0
)
{
noise_sigma_level
=
new
double
[]
{
// double [] noise_sigma_level = null;
NoiseParameters
noise_sigma_level
=
null
;
if
((
clt_parameters
.
inp
.
noise
.
scale_random
>
0.0
)
||
(
clt_parameters
.
inp
.
noise
.
scale_fpn
>
0.0
)){
noise_sigma_level
=
clt_parameters
.
inp
.
noise
.
clone
();
/*
new double[] {
clt_parameters.inp.noise_scale,
clt_parameters.inp.noise_sigma,
clt_parameters.inp.initial_offset}; // amount, sigma, offset
*/
}
boolean
ref_only
=
clt_parameters
.
inp
.
ref_only
;
// true; // process only reference frame (false - inter-scene)
...
...
@@ -8692,6 +8697,7 @@ if (debugLevel > -100) return true; // temporarily !
clt_parameters
,
colorProcParameters
,
//
noise_sigma_level
,
// double [] noise_sigma_level,
null
,
// QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
clt_parameters
.
inp
.
noise_debug_level
);
// debugLevel);
/**/
...
...
@@ -8722,12 +8728,16 @@ if (debugLevel > -100) return true; // temporarily !
// double [] noise_sigma_level = {1.0, 1.5, 1.0}; // amount, sigma, offset
// double [] noise_sigma_level = {3.0, 1.5, 1.0}; // amount, sigma, offset
// double [] noise_sigma_level = {5.0, 1.5, 1.0}; // amount, sigma, offset
double
[]
noise_sigma_level
=
null
;
if
(
clt_parameters
.
inp
.
noise_scale
>=
0.0
)
{
// <0 - will generate no-noise data
noise_sigma_level
=
new
double
[]
{
// double [] noise_sigma_level = null;
NoiseParameters
noise_sigma_level
=
null
;
if
((
clt_parameters
.
inp
.
noise
.
scale_random
>=
0.0
)
||
(
clt_parameters
.
inp
.
noise
.
scale_fpn
>=
0.0
))
{
// <0 - will generate no-noise data
noise_sigma_level
=
clt_parameters
.
inp
.
noise
.
clone
();
/*
noise_sigma_level = new double[] {
clt_parameters.inp.noise_scale,
clt_parameters.inp.noise_sigma,
clt_parameters
.
inp
.
initial_offset
};
// amount, sigma, offset
clt_parameters.inp.initial_offset}; // amount, sigma, offset\
*/
}
boolean
ref_only
=
clt_parameters
.
inp
.
ref_only
;
// true; // process only reference frame (false - inter-scene)
...
...
@@ -8750,6 +8760,7 @@ if (debugLevel > -100) return true; // temporarily !
clt_parameters
,
colorProcParameters
,
//
noise_sigma_level
,
// double [] noise_sigma_level,
null
,
// final QuadCLTCPU ref_scene, // may be null if scale_fpn <= 0
threadsMax
,
clt_parameters
.
inp
.
noise_debug_level
);
// debugLevel);
/*
...
...
@@ -8760,7 +8771,10 @@ if (debugLevel > -100) return true; // temporarily !
*/
// Create 4-slice image with noise from the current data
if
(
noise_sigma_level
!=
null
)
{
String
noisy_4slice_suffix
=
"-noise-level_"
+
noise_sigma_level
[
0
]+
"-sigma_"
+
noise_sigma_level
[
1
];
String
noisy_4slice_suffix
=
"-noise-random_"
+
noise_sigma_level
.
scale_random
+
"-noise-fpn_"
+
noise_sigma_level
.
scale_fpn
+
"-sigma_"
+
noise_sigma_level
.
sigma
;
ref_quadCLT
.
genSave4sliceImage
(
clt_parameters
,
// CLTParameters clt_parameters,
noisy_4slice_suffix
,
// String suffix,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment