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
1cc8ef8f
Commit
1cc8ef8f
authored
May 07, 2024
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented configurable parameters for global matching of affines and
intensities.
parent
75c570c2
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
318 additions
and
43 deletions
+318
-43
ComboMatch.java
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
+4
-8
OrthoEqualizeLMA.java
.../java/com/elphel/imagej/orthomosaic/OrthoEqualizeLMA.java
+77
-18
OrthoMapsCollection.java
...va/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
+10
-2
OrthoMultiLMA.java
...ain/java/com/elphel/imagej/orthomosaic/OrthoMultiLMA.java
+78
-13
IntersceneMatchParameters.java
...lphel/imagej/tileprocessor/IntersceneMatchParameters.java
+148
-1
TriMesh.java
src/main/java/com/elphel/imagej/x3d/export/TriMesh.java
+1
-1
No files found.
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
View file @
1cc8ef8f
...
...
@@ -154,16 +154,12 @@ public class ComboMatch {
int
gpu_width
=
clt_parameters
.
imp
.
rln_gpu_width
;
// 3008;
int
gpu_height
=
clt_parameters
.
imp
.
rln_gpu_height
;
// 3008;
int
zoom_lev
=
-
3
;
// 0; // +1 - zoom in twice, -1 - zoom out twice
// boolean show_map_stats = false;
boolean
show_combo
=
false
;
// true;
boolean
create_overlaps
=
false
;
boolean
equalize_overlaps
=
false
;
boolean
create_map
=
false
;
boolean
create_equalize
=
false
;
// boolean show_combo_mask = false; // generate image mas (where it is defined)_
// boolean use_alt = false;
// boolean show_centers = true;
boolean
use_saved_collection
=
true
;
// false;
boolean
save_collection
=
true
;
boolean
process_correlation
=
true
;
// use false to save new version of data
...
...
@@ -780,19 +776,19 @@ public class ComboMatch {
}
if
(
create_map
)
{
OrthoMultiLMA
.
buildOrthoMap
(
int
ok
=
OrthoMultiLMA
.
buildOrthoMap
(
clt_parameters
,
// CLTParameters clt_parameters,
maps_collection
,
// OrthoMapsCollection maps_collection
orthoMapsCollection_savepath
);
// String orthoMapsCollection_path
return
true
;
return
(
ok
>=
0
)
;
}
if
(
create_equalize
)
{
OrthoEqualizeLMA
.
buildEqualize
(
int
ok
=
OrthoEqualizeLMA
.
buildEqualize
(
clt_parameters
,
// CLTParameters clt_parameters,
maps_collection
,
// OrthoMapsCollection maps_collection
orthoMapsCollection_savepath
);
// String orthoMapsCollection_path
return
true
;
return
(
ok
>=
0
)
;
}
if
(
create_overlaps
)
{
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoEqualizeLMA.java
View file @
1cc8ef8f
...
...
@@ -33,6 +33,7 @@ import java.util.ArrayList;
import
java.util.concurrent.atomic.AtomicInteger
;
import
com.elphel.imagej.cameras.CLTParameters
;
import
com.elphel.imagej.common.GenericJTabbedDialog
;
import
com.elphel.imagej.tileprocessor.ImageDtt
;
import
Jama.Matrix
;
...
...
@@ -51,30 +52,88 @@ public class OrthoEqualizeLMA {
private
int
[][]
pairs
=
null
;
private
int
[][]
pairs_ni
=
null
;
// non-intersecting pairs for multi-threaded processing
private
int
[]
indices
=
null
;
// private double [][] offsets = null; // scene offsets (rd)
private
int
num_scenes
=
0
;
private
int
num_pairs
=
0
;
public
static
int
buildEqualize
(
CLTParameters
clt_parameters
,
OrthoMapsCollection
maps_collection
,
String
orthoMapsCollection_path
)
{
int
debugLevel
=
2
;
boolean
use_inv
=
false
;
double
scale_weight
=
500
;
// relative weight of scale differences compared to offset differences
double
pull_weight
=
0.001
;
// relative weight of offsets and scales differences from 1.0 to pairs mismatch
double
half_weight_sec
=
300.0
;
// - time difference to reduce weight twice
double
min_weight_sec
=
0.01
;
// weight of pairs at very different time
double
overlap_pow
=
2.0
;
// match weight as overlap fraction to this power
double
rms_diff
=
0.000001
;
int
num_iter
=
100
;
// 50;
double
lambda
=
0.1
;
double
lambda_scale_good
=
0.5
;
double
lambda_scale_bad
=
8.0
;
double
lambda_max
=
100
;
String
orthoMapsCollection_path
)
{
boolean
ignore_equalize
=
clt_parameters
.
imp
.
pequ_ignore_equalize
;
// false; // ignore previous equalization
boolean
use_inv
=
clt_parameters
.
imp
.
pequ_use_inv
;
// false;
double
scale_weight
=
clt_parameters
.
imp
.
pequ_scale_weight
;
// 500; // relative weight of scale differences compared to offset differences
double
pull_weight
=
clt_parameters
.
imp
.
pequ_pull_weight
;
// 0.001; // relative weight of offsets and scales differences from 1.0 to pairs mismatch
double
half_weight_sec
=
clt_parameters
.
imp
.
pequ_half_weight_sec
;
// 300.0; // - time difference to reduce weight twice
double
min_weight_sec
=
clt_parameters
.
imp
.
pequ_min_weight_sec
;
// 0.01; // weight of pairs at very different time
double
overlap_pow
=
clt_parameters
.
imp
.
pequ_overlap_pow
;
// 2.0; // match weight as overlap fraction to this power
double
rms_diff
=
clt_parameters
.
imp
.
pequ_rms_diff
;
// 0.000001;
int
num_iter
=
clt_parameters
.
imp
.
pequ_num_iter
;
// 100; // 50;
int
debugLevel
=
clt_parameters
.
imp
.
pequ_debugLevel
;
// 2;
GenericJTabbedDialog
gd
=
new
GenericJTabbedDialog
(
"Pairwise Match Parameters"
,
1200
,
400
);
gd
.
addCheckbox
(
"Ignore existing equalization"
,
ignore_equalize
,
"Ignore existing equalization, start from scratch (a=1, b=0)."
);
gd
.
addCheckbox
(
"Use reversed pairs"
,
use_inv
,
"Use reversed (late-early timestamps) pairs."
);
gd
.
addNumericField
(
"Relative scale weight"
,
scale_weight
,
3
,
7
,
""
,
"Importance of a-coefficient (scale) relative to b-coefficient (offset)."
);
gd
.
addNumericField
(
"Pull weight"
,
pull_weight
,
3
,
7
,
""
,
"Relative weight of offsets and scales differences from 1.0 to pairs mismatch."
);
gd
.
addNumericField
(
"Half-weight time difference"
,
half_weight_sec
,
3
,
7
,
"s"
,
"Time difference (in a pair) to reduce weight twice."
);
gd
.
addNumericField
(
"Weight for large time offset"
,
min_weight_sec
,
3
,
7
,
""
,
"Weight of pairs at very different time."
);
gd
.
addNumericField
(
"Overlap inportance"
,
overlap_pow
,
3
,
7
,
""
,
"Raise overlap fraction (of the smaller image) to this power before using as weight."
);
gd
.
addNumericField
(
"RMSE relative improvement"
,
rms_diff
,
8
,
10
,
""
,
"Relative RMSE improvement to exit LMA."
);
gd
.
addNumericField
(
"LMA iterations"
,
num_iter
,
0
,
3
,
""
,
".Maximal number of the LMA iterations."
);
gd
.
addNumericField
(
"Debug level for equalization"
,
debugLevel
,
0
,
3
,
""
,
"Debug level for global (LMA-based) intensity equalization."
);
gd
.
showDialog
();
if
(
gd
.
wasCanceled
())
return
-
1
;
ignore_equalize
=
gd
.
getNextBoolean
();
use_inv
=
gd
.
getNextBoolean
();
scale_weight
=
gd
.
getNextNumber
();
pull_weight
=
gd
.
getNextNumber
();
half_weight_sec
=
gd
.
getNextNumber
();
min_weight_sec
=
gd
.
getNextNumber
();
overlap_pow
=
gd
.
getNextNumber
();
rms_diff
=
gd
.
getNextNumber
();
num_iter
=
(
int
)
gd
.
getNextNumber
();
debugLevel
=
(
int
)
gd
.
getNextNumber
();
return
buildEqualize
(
clt_parameters
,
// CLTParameters clt_parameters,
maps_collection
,
// OrthoMapsCollection maps_collection,
orthoMapsCollection_path
,
// String orthoMapsCollection_path,
ignore_equalize
,
// boolean ignore_equalize,
use_inv
,
// boolean use_inv,
scale_weight
,
// double scale_weight,
pull_weight
,
// double pull_weight,
half_weight_sec
,
// double half_weight_sec,
min_weight_sec
,
// double min_weight_sec,
overlap_pow
,
// double overlap_pow,
rms_diff
,
// double rms_diff,
num_iter
,
// int num_iter,
debugLevel
);
// int debugLevel);
}
public
static
int
buildEqualize
(
CLTParameters
clt_parameters
,
OrthoMapsCollection
maps_collection
,
String
orthoMapsCollection_path
,
boolean
ignore_equalize
,
boolean
use_inv
,
double
scale_weight
,
double
pull_weight
,
double
half_weight_sec
,
double
min_weight_sec
,
double
overlap_pow
,
double
rms_diff
,
int
num_iter
,
int
debugLevel
)
{
double
lambda
=
0.1
;
double
lambda_scale_good
=
0.5
;
double
lambda_scale_bad
=
8.0
;
double
lambda_max
=
100
;
boolean
last_run
=
false
;
boolean
ignore_equalization
=
false
;
// ignore previous equalization
int
[]
indices
=
maps_collection
.
getScenesSelection
(
null
,
// boolean select_all,
" to build a map"
);
// String purpose)
...
...
@@ -83,7 +142,7 @@ public class OrthoEqualizeLMA {
clt_parameters
,
// CLTParameters clt_parameters,
maps_collection
,
// OrthoMapsCollection maps_collection,
indices
,
// int [] indices,
ignore_equaliz
ation
,
// boolean ignore_equalization, // ignore previous equalization
ignore_equaliz
e
,
// boolean ignore_equalization, // ignore previous equalization
// scale_weights applies both to pairs mismatch and per-scene values difference from neutral {1.0, 0.0}
scale_weight
,
// double scale_weight, // relative weight of scale differences compared to offset differences
pull_weight
,
// double pull_weight, // relative weight of offsets and scales differences from 1.0 to pairs mismatch
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
View file @
1cc8ef8f
...
...
@@ -4453,7 +4453,7 @@ public class OrthoMapsCollection implements Serializable{
double
fill_fraction
=
clt_parameters
.
imp
.
pmtch_cent_fill
;
// should be populated not less than this
double
fill_fraction_final
=
clt_parameters
.
imp
.
pmtch_cent_final
;
// should be populated not less than this during final pass
double
ease_nosfm
=
clt_parameters
.
imp
.
pmtch_ease_nosfm
;
// ease metric_error when no SfM gain == 0;
int
min_scene
=
0
;
GenericJTabbedDialog
gd
=
new
GenericJTabbedDialog
(
"Pairwise Match Parameters"
,
1200
,
1000
);
gd
.
addMessage
(
"Number of scenes - "
+
num_scenes
+
", number of pairs (w/o inverse) - "
+
num_pairs
+
...
...
@@ -4495,7 +4495,8 @@ public class OrthoMapsCollection implements Serializable{
gd
.
addNumericField
(
"Central area minimal fill"
,
fill_fraction
,
3
,
7
,
""
,
"Central area minimal fill for all but the last iteration."
);
gd
.
addNumericField
(
"Central area minimal fill final"
,
fill_fraction_final
,
3
,
7
,
""
,
"Central area minimal fill for the last iteration."
);
gd
.
addNumericField
(
"Relax metric error for no-SfM"
,
ease_nosfm
,
3
,
7
,
""
,
"Relax metric error for no-SfM scenes (sfm_gain==0)."
);
gd
.
addNumericField
(
"Start scene (skip all earlier)"
,
min_scene
,
0
,
3
,
""
,
"To be able to continue skipping some."
);
//
gd
.
showDialog
();
if
(
gd
.
wasCanceled
())
return
false
;
...
...
@@ -4533,6 +4534,7 @@ public class OrthoMapsCollection implements Serializable{
fill_fraction
=
gd
.
getNextNumber
();
fill_fraction_final
=
gd
.
getNextNumber
();
ease_nosfm
=
gd
.
getNextNumber
();
min_scene
=
(
int
)
gd
.
getNextNumber
();
return
generatePairwiseMatches
(
clt_parameters
,
// CLTParameters clt_parameters,
...
...
@@ -4569,6 +4571,7 @@ public class OrthoMapsCollection implements Serializable{
ease_nosfm
,
// double ease_nosfm,
double_threshold
,
// double double_threshold,
max_rms_iter
,
// double [] max_rms_iter,
min_scene
,
// int min_scene,
debugLevel
);
// int debugLevel
}
...
...
@@ -4609,6 +4612,7 @@ public class OrthoMapsCollection implements Serializable{
double
ease_nosfm
,
double
double_threshold
,
double
[]
max_rms_iter
,
int
min_scene
,
int
debugLevel
)
{
boolean
batch_mode
=
true
;
...
...
@@ -4653,6 +4657,10 @@ public class OrthoMapsCollection implements Serializable{
ArrayList
<
Point
>
new_pairs
=
new
ArrayList
<
Point
>();
// started from spiral, not from the same or inverse
for
(
Point
pair:
pairs
)
{
int
[]
ipair
=
{
indices
[
pair
.
x
],
indices
[
pair
.
y
]};
if
(
ipair
[
0
]
<
min_scene
)
{
System
.
out
.
println
(
"Skipping "
+
ipair
[
0
]+
":"
+
ipair
[
1
]+
" until "
+
min_scene
);
continue
;
}
boolean
direct
=
indices
[
pair
.
x
]
<
indices
[
pair
.
y
];
int
min_zoom_lev
=
ortho_maps
[
ipair
[
0
]].
getOriginalZoomLevel
();
int
max_zoom_lev
=
ortho_maps
[
ipair
[
0
]].
getOriginalZoomLevel
();
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoMultiLMA.java
View file @
1cc8ef8f
...
...
@@ -32,6 +32,7 @@ import java.util.Arrays;
import
java.util.concurrent.atomic.AtomicInteger
;
import
com.elphel.imagej.cameras.CLTParameters
;
import
com.elphel.imagej.common.GenericJTabbedDialog
;
import
com.elphel.imagej.common.ShowDoubleFloatArrays
;
import
com.elphel.imagej.tileprocessor.ImageDtt
;
...
...
@@ -217,18 +218,84 @@ public class OrthoMultiLMA {
OrthoMapsCollection
maps_collection
,
String
orthoMapsCollection_path
)
{
int
debugLevel
=
2
;
boolean
move_only
=
false
;
boolean
move_only
=
clt_parameters
.
imp
.
pmap_move_only
;
// false;
boolean
ignore_affines
=
clt_parameters
.
imp
.
pmap_ignore_affines
;
// false;
boolean
use_inv
=
clt_parameters
.
imp
.
pmap_use_inv
;
// false;
double
skew_pull
=
clt_parameters
.
imp
.
pmap_skew_pull
;
// 1.0;
double
tilt_pull
=
clt_parameters
.
imp
.
pmap_tilt_pull
;
// 1.0;
double
scale_pull
=
clt_parameters
.
imp
.
pmap_scale_pull
;
// 0.1; // .0;
double
position_pull
=
clt_parameters
.
imp
.
pmap_position_pull
;
// 0.0001;
double
overlap_pow
=
clt_parameters
.
imp
.
pmap_overlap_pow
;
// 2.0; // match weight as overlap fraction to this power
double
rms_diff
=
clt_parameters
.
imp
.
pmap_rms_diff
;
// 0.000001;
int
num_iter
=
clt_parameters
.
imp
.
pmap_num_iter
;
// 100; // 50;
boolean
show_result
=
clt_parameters
.
imp
.
pmap_show_result
;
// false;
int
debugLevel
=
clt_parameters
.
imp
.
pmap_debugLevel
;
// 2;
GenericJTabbedDialog
gd
=
new
GenericJTabbedDialog
(
"Pairwise Match Parameters"
,
1200
,
400
);
gd
.
addCheckbox
(
"Moves only"
,
move_only
,
"Moves only, no affine transform."
);
gd
.
addCheckbox
(
"Ignore existing affines"
,
ignore_affines
,
"Start from unity matrices, ignore saved affines."
);
gd
.
addCheckbox
(
"Use reversed pairs"
,
use_inv
,
"Use reversed (late-early timestamps) pairs."
);
gd
.
addNumericField
(
"Skew pull"
,
skew_pull
,
7
,
10
,
""
,
"Intention to have axes perpendicular."
);
gd
.
addNumericField
(
"Tilt pull"
,
tilt_pull
,
7
,
10
,
""
,
"Intention to have axes same length."
);
gd
.
addNumericField
(
"Scale pull"
,
scale_pull
,
7
,
10
,
""
,
"Intention to have average scale of images = 1.0."
);
gd
.
addNumericField
(
"Position pull"
,
position_pull
,
7
,
10
,
""
,
"Intension to match IMS (GNSS) coordinates."
);
gd
.
addNumericField
(
"Overlap inportance"
,
overlap_pow
,
3
,
7
,
""
,
"Raise overlap fraction (of the smaller image) to this power before using as weight."
);
gd
.
addNumericField
(
"RMSE relative improvement"
,
rms_diff
,
8
,
10
,
""
,
"Relative RMSE improvement to exit LMA."
);
gd
.
addNumericField
(
"LMA iterations"
,
num_iter
,
0
,
3
,
""
,
".Maximal number of the LMA iterations."
);
gd
.
addCheckbox
(
"Show result image"
,
show_result
,
"."
);
gd
.
addNumericField
(
"Debug level for maps"
,
debugLevel
,
0
,
3
,
""
,
"Debug building for LMA building maps."
);
gd
.
showDialog
();
if
(
gd
.
wasCanceled
())
return
-
1
;
move_only
=
gd
.
getNextBoolean
();
ignore_affines
=
gd
.
getNextBoolean
();
use_inv
=
gd
.
getNextBoolean
();
skew_pull
=
gd
.
getNextNumber
();
tilt_pull
=
gd
.
getNextNumber
();
scale_pull
=
gd
.
getNextNumber
();
position_pull
=
gd
.
getNextNumber
();
overlap_pow
=
gd
.
getNextNumber
();
rms_diff
=
gd
.
getNextNumber
();
num_iter
=
(
int
)
gd
.
getNextNumber
();
show_result
=
gd
.
getNextBoolean
();
debugLevel
=
(
int
)
gd
.
getNextNumber
();
return
buildOrthoMap
(
clt_parameters
,
// CLTParameters clt_parameters,
maps_collection
,
// OrthoMapsCollection maps_collection,
orthoMapsCollection_path
,
// String orthoMapsCollection_path,
move_only
,
// boolean move_only,
ignore_affines
,
// boolean ignore_affines,
use_inv
,
// boolean use_inv,
skew_pull
,
// double skew_pull,
tilt_pull
,
// double tilt_pull,
scale_pull
,
// double scale_pull,
position_pull
,
// double position_pull,
overlap_pow
,
// double overlap_pow,
rms_diff
,
// double rms_diff,
num_iter
,
// int num_iter,
show_result
,
// boolean show_result,
debugLevel
);
// int debugLevel)
}
public
static
int
buildOrthoMap
(
CLTParameters
clt_parameters
,
OrthoMapsCollection
maps_collection
,
String
orthoMapsCollection_path
,
boolean
move_only
,
boolean
ignore_affines
,
boolean
use_inv
,
double
skew_pull
,
double
tilt_pull
,
double
scale_pull
,
double
position_pull
,
double
overlap_pow
,
double
rms_diff
,
int
num_iter
,
boolean
show_result
,
int
debugLevel
)
{
double
[]
val_coord
=
null
;
// 1 - valid, 0 - invalid, minimize coordinates errors
boolean
ignore_affines
=
false
;
boolean
use_inv
=
false
;
double
overlap_pow
=
2.0
;
// match weight as overlap fraction to this power
double
skew_pull
=
1.0
;
double
tilt_pull
=
1.0
;
double
scale_pull
=
0.1
;
// .0;
double
position_pull
=
0.0001
;
boolean
corr_avg
=
(
skew_pull
>
0
)
||
(
tilt_pull
>
0
)
||
(
scale_pull
>
0
);
boolean
show_result_image
=
false
;
int
[]
indices
=
maps_collection
.
getScenesSelection
(
null
,
// boolean select_all,
" to build a map"
);
// String purpose)
...
...
@@ -239,8 +306,6 @@ public class OrthoMultiLMA {
double
lambda_scale_good
=
0.5
;
double
lambda_scale_bad
=
8.0
;
double
lambda_max
=
100
;
double
rms_diff
=
0.000001
;
int
num_iter
=
100
;
// 50;
boolean
last_run
=
false
;
oml
.
prepareLMA
(
clt_parameters
,
// CLTParameters clt_parameters,
...
...
@@ -274,7 +339,7 @@ public class OrthoMultiLMA {
//Get and apply affines
oml
.
updateAffines
(
maps_collection
);
if
(
show_result
_image
)
{
if
(
show_result
)
{
double
[][][]
affines
=
oml
.
getAffines
();
double
[]
fx
=
oml
.
getFx
();
...
...
src/main/java/com/elphel/imagej/tileprocessor/IntersceneMatchParameters.java
View file @
1cc8ef8f
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/x3d/export/TriMesh.java
View file @
1cc8ef8f
...
...
@@ -2459,7 +2459,7 @@ public class TriMesh {
correctDistortions
,
// requires backdrop image to be corrected also
geometryCorrection
);
// final GeometryCorrection geometryCorrection)
/*
* Triangulate all vertice indices - combine triangulation of same-size equ
a
ilateral 45-degree
* Triangulate all vertice indices - combine triangulation of same-size equilateral 45-degree
* large (tile size) and small (tile subdivisions) and add connections between large and small ones
*/
int
[][]
triangles
=
triangulateAll
(
...
...
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