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
4ffb8a32
Commit
4ffb8a32
authored
May 29, 2019
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
working on calculating grids for low frequency pattern
parent
78aea970
Changes
12
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
2675 additions
and
1560 deletions
+2675
-1560
JP46_Reader_camera0.java
src/main/java/JP46_Reader_camera0.java
+6
-2
Aberration_Calibration.java
...com/elphel/imagej/calibration/Aberration_Calibration.java
+338
-131
DistortionProcessConfiguration.java
...el/imagej/calibration/DistortionProcessConfiguration.java
+37
-15
EyesisAberrations.java
...java/com/elphel/imagej/calibration/EyesisAberrations.java
+267
-260
Goniometer.java
src/main/java/com/elphel/imagej/calibration/Goniometer.java
+4
-0
LensAdjustment.java
...in/java/com/elphel/imagej/calibration/LensAdjustment.java
+212
-208
MatchSimulatedPattern.java
.../com/elphel/imagej/calibration/MatchSimulatedPattern.java
+1534
-843
DoubleFHT.java
src/main/java/com/elphel/imagej/common/DoubleFHT.java
+111
-89
ShowDoubleFloatArrays.java
.../java/com/elphel/imagej/common/ShowDoubleFloatArrays.java
+24
-0
JP46_Reader_camera.java
src/main/java/com/elphel/imagej/jp4/JP46_Reader_camera.java
+6
-1
LwirReaderParameters.java
...ain/java/com/elphel/imagej/lwir/LwirReaderParameters.java
+126
-5
EyesisTiff.java
src/main/java/com/elphel/imagej/readers/EyesisTiff.java
+10
-6
No files found.
src/main/java/JP46_Reader_camera0.java
View file @
4ffb8a32
...
...
@@ -1413,9 +1413,13 @@ Exception in thread "Thread-3564" java.lang.ArrayIndexOutOfBoundsException: 8970
NodeList
allNodes
=
doc
.
getDocumentElement
().
getElementsByTagName
(
"*"
);
for
(
int
i
=
0
;
i
<
allNodes
.
getLength
();
i
++)
{
String
name
=
allNodes
.
item
(
i
).
getNodeName
();
String
value
=
allNodes
.
item
(
i
).
getFirstChild
().
getNodeValue
();
imp
.
setProperty
(
name
,
value
);
String
value
=
""
;
try
{
value
=
allNodes
.
item
(
i
).
getFirstChild
().
getNodeValue
();
}
catch
(
Exception
e
)
{
}
imp
.
setProperty
(
name
,
value
);
}
return
true
;
...
...
src/main/java/com/elphel/imagej/calibration/Aberration_Calibration.java
View file @
4ffb8a32
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/calibration/DistortionProcessConfiguration.java
View file @
4ffb8a32
...
...
@@ -23,15 +23,16 @@ package com.elphel.imagej.calibration;
**
*/
import
ij.IJ
;
import
ij.Prefs
;
import
ij.gui.GenericDialog
;
import
java.io.File
;
import
java.io.FilenameFilter
;
import
java.util.Properties
;
import
com.elphel.imagej.common.WindowTools
;
import
ij.IJ
;
import
ij.Prefs
;
import
ij.gui.GenericDialog
;
public
class
DistortionProcessConfiguration
{
public
String
sourceDirectory
=
""
;
...
...
@@ -207,4 +208,25 @@ import com.elphel.imagej.common.WindowTools;
return
sourceFiles
;
}
public
String
[]
selectSourceSets
()
{
File
dir
=
new
File
(
this
.
sourceDirectory
);
if
(
this
.
debugLevel
>
1
)
System
.
out
.
println
(
"selectSourceSets, dir="
+
this
.
sourceDirectory
);
if
(!
dir
.
exists
())
{
String
error
=
"Source directory "
+
this
.
sourceDirectory
+
" does not exist."
;
IJ
.
showMessage
(
"No files selected"
);
if
(
this
.
debugLevel
>
1
)
System
.
out
.
println
(
"selectSourceFiles() ERROR:"
+
error
);
return
null
;
}
File
[]
sourceFileSets
=
dir
.
listFiles
(
new
FilenameFilter
()
{
@Override
public
boolean
accept
(
File
current
,
String
name
)
{
return
new
File
(
current
,
name
).
isDirectory
();
}
});
String
[]
sourceSets
=
new
String
[
sourceFileSets
.
length
];
for
(
int
i
=
0
;
i
<
sourceSets
.
length
;
i
++)
sourceSets
[
i
]=
sourceFileSets
[
i
].
getPath
();
return
sourceSets
;
}
}
src/main/java/com/elphel/imagej/calibration/EyesisAberrations.java
View file @
4ffb8a32
package
com
.
elphel
.
imagej
.
calibration
;
import
ij.IJ
;
import
ij.ImagePlus
;
import
ij.ImageStack
;
import
ij.Prefs
;
import
ij.gui.GenericDialog
;
import
ij.io.FileSaver
;
import
ij.io.Opener
;
import
ij.process.FloatProcessor
;
import
ij.process.ImageProcessor
;
import
java.awt.Rectangle
;
import
java.io.File
;
import
java.util.ArrayList
;
...
...
@@ -19,14 +9,22 @@ import java.util.concurrent.atomic.AtomicInteger;
import
javax.swing.SwingUtilities
;
import
com.elphel.imagej.calibration.CalibrationFileManagement.MultipleExtensionsFileFilter
;
import
com.elphel.imagej.calibration.SimulationPattern.SimulParameters
;
import
com.elphel.imagej.common.DoubleFHT
;
import
com.elphel.imagej.common.DoubleGaussianBlur
;
import
com.elphel.imagej.common.ShowDoubleFloatArrays
;
import
com.elphel.imagej.common.WindowTools
;
import
com.elphel.imagej.jp4.JP46_Reader_camera
;
import
ij.IJ
;
import
ij.ImagePlus
;
import
ij.ImageStack
;
import
ij.Prefs
;
import
ij.gui.GenericDialog
;
import
ij.io.FileSaver
;
import
ij.io.Opener
;
import
ij.process.FloatProcessor
;
import
ij.process.ImageProcessor
;
public
class
EyesisAberrations
{
public
double
[][][][]
pdfKernelMap
=
null
;
JP46_Reader_camera
JP4_INSTANCE
=
new
JP46_Reader_camera
(
false
);
...
...
@@ -181,6 +179,7 @@ public class EyesisAberrations {
final
int
numberOfKernelsInChn
=
tilesY
*
tilesX
;
for
(
int
ithread
=
0
;
ithread
<
threads
.
length
;
ithread
++)
{
threads
[
ithread
]
=
new
Thread
()
{
@Override
public
void
run
()
{
float
[]
pixels
=
null
;
double
[]
kernel
=
new
double
[
inverseParameters
.
dSize
*
inverseParameters
.
dSize
];
...
...
@@ -555,7 +554,7 @@ public class EyesisAberrations {
iy
=-
iy
;
}
ix
=
(
ix
+
size
)
%
size
;
floatPixels
[
i
]=
(
float
)
clusterMap
[
iy
][
ix
];
floatPixels
[
i
]=
clusterMap
[
iy
][
ix
];
}
ip
.
setPixels
(
floatPixels
);
ip
.
resetMinAndMax
();
...
...
@@ -639,8 +638,8 @@ public class EyesisAberrations {
row2
=(
fftsize
-
row1
)
%
fftsize
;
for
(
col1
=
0
;
col1
<
fftsize
;
col1
++)
{
col2
=(
fftsize
-
col1
)
%
fftsize
;
fht_pixels
[
row1
*
fftsize
+
col1
]=
(
double
)
(
fft
[
row1
][
col1
][
0
]-
fft
[
row1
][
col1
][
1
])
;
fht_pixels
[
row2
*
fftsize
+
col2
]=
(
double
)
(
fft
[
row1
][
col1
][
0
]+
fft
[
row1
][
col1
][
1
])
;
fht_pixels
[
row1
*
fftsize
+
col1
]=
fft
[
row1
][
col1
][
0
]-
fft
[
row1
][
col1
][
1
]
;
fht_pixels
[
row2
*
fftsize
+
col2
]=
fft
[
row1
][
col1
][
0
]+
fft
[
row1
][
col1
][
1
]
;
}
}
return
fht_pixels
;
...
...
@@ -1281,6 +1280,8 @@ public class EyesisAberrations {
int
rslt
=
matchSimulatedPattern
.
calculateDistortions
(
distortionParameters
,
//
patternDetectParameters
,
patternDetectParameters
.
minGridPeriod
/
2
,
patternDetectParameters
.
maxGridPeriod
/
2
,
simulParameters
,
colorComponents
.
equalizeGreens
,
imp
,
...
...
@@ -2313,6 +2314,7 @@ public class EyesisAberrations {
for
(
int
ithread
=
0
;
ithread
<
threads
.
length
;
ithread
++)
{
// Concurrently run in as many threads as CPUs
threads
[
ithread
]
=
new
Thread
()
{
@Override
public
void
run
()
{
// Each thread processes a few items in the total list
...
...
@@ -2399,6 +2401,7 @@ public class EyesisAberrations {
}
final
int
numFinished
=
tilesFinishedAtomic
.
getAndIncrement
();
SwingUtilities
.
invokeLater
(
new
Runnable
()
{
@Override
public
void
run
()
{
IJ
.
showProgress
(
numFinished
,
patternCells
);
}
...
...
@@ -2679,6 +2682,8 @@ public class EyesisAberrations {
if
(
matchSimulatedPattern
.
PATTERN_GRID
==
null
)
{
double
[][]
distortedPattern
=
matchSimulatedPattern
.
findPatternDistorted
(
input_bayer
,
// pixel array to process (no windowing!)
patternDetectParameters
,
patternDetectParameters
.
minGridPeriod
/
2
,
patternDetectParameters
.
maxGridPeriod
/
2
,
true
,
//(greensToProcess==4), // boolean greens, // this is a pattern for combined greens (diagonal), adjust results accordingly
title
);
// title prefix to use for debug images
...
...
@@ -4148,7 +4153,7 @@ if (globalDebugLevel>2)globalDebugLevel=0; //***********************************
ImageProcessor
ip
=
new
FloatProcessor
(
size
,
size
);
float
[]
floatPixels
=
new
float
[
size
*
size
];
for
(
i
=
0
;
i
<
floatPixels
.
length
;
i
++)
{
floatPixels
[
i
]=
(
float
)
clusterMap
[
i
/
size
][
i
%
size
];
floatPixels
[
i
]=
clusterMap
[
i
/
size
][
i
%
size
];
}
ip
.
setPixels
(
floatPixels
);
ip
.
resetMinAndMax
();
...
...
@@ -4404,11 +4409,11 @@ if (globalDebugLevel>2)globalDebugLevel=0; //***********************************
if
(
debug
)
{
SDFA_INSTANCE
.
showArrays
(
debugPixels
,
title
+
"_mask_PSF"
);
double
[]
doublePixelsPSFCount
=
new
double
[
pixelsPSF
.
length
];
for
(
j
=
0
;
j
<
doublePixelsPSFCount
.
length
;
j
++)
doublePixelsPSFCount
[
j
]=
(
double
)
pixelsPSFCount
[
j
];
for
(
j
=
0
;
j
<
doublePixelsPSFCount
.
length
;
j
++)
doublePixelsPSFCount
[
j
]=
pixelsPSFCount
[
j
];
SDFA_INSTANCE
.
showArrays
(
doublePixelsPSFCount
,
title
+
"_PSF_bin_count"
);
SDFA_INSTANCE
.
showArrays
(
pixelsPSFWeight
,
title
+
"_PSF_bin_weight"
);
double
[]
doubleContrastCache
=
new
double
[
contrastCache
.
length
];
for
(
j
=
0
;
j
<
doubleContrastCache
.
length
;
j
++)
doubleContrastCache
[
j
]=(
double
)((
contrastCache
[
j
]>=
0.0
)?
contrastCache
[
j
]:-
0.00001
)
;
for
(
j
=
0
;
j
<
doubleContrastCache
.
length
;
j
++)
doubleContrastCache
[
j
]=(
contrastCache
[
j
]>=
0.0
)?
contrastCache
[
j
]:-
0.00001
;
SDFA_INSTANCE
.
showArrays
(
doubleContrastCache
,
title
+
"_ContrastCache"
);
}
return
pixelsPSF
;
...
...
@@ -4988,6 +4993,7 @@ if (globalDebugLevel>2)globalDebugLevel=0; //***********************************
this
.
thresholdHigh
=
thresholdHigh
;
this
.
thresholdLow
=
thresholdLow
;
}
@Override
public
OTFFilterParameters
clone
()
{
return
new
OTFFilterParameters
(
this
.
deconvInvert
,
...
...
@@ -5076,6 +5082,7 @@ if (globalDebugLevel>2)globalDebugLevel=0; //***********************************
}
@Override
public
PSFParameters
clone
(){
return
new
PSFParameters
(
this
.
minContrast
,
...
...
src/main/java/com/elphel/imagej/calibration/Goniometer.java
View file @
4ffb8a32
...
...
@@ -668,6 +668,8 @@ horizontal axis:
// allow more of grid around pointers?
distortionParameters
,
//
this
.
patternDetectParameters
,
this
.
patternDetectParameters
.
minGridPeriod
/
2
,
this
.
patternDetectParameters
.
maxGridPeriod
/
2
,
simulParameters
,
equalizeGreens
,
imp_eq
,
this
.
laserPointers
,
// null, //LASER_POINTERS, //
...
...
@@ -841,6 +843,8 @@ horizontal axis:
// allow more of grid around pointers?
distortionParameters
,
//
this
.
patternDetectParameters
,
this
.
patternDetectParameters
.
minGridPeriod
/
2
,
this
.
patternDetectParameters
.
maxGridPeriod
/
2
,
simulParameters
,
equalizeGreens
,
imp_eq
,
this
.
laserPointers
,
// null, //LASER_POINTERS, //
...
...
src/main/java/com/elphel/imagej/calibration/LensAdjustment.java
View file @
4ffb8a32
...
...
@@ -25,7 +25,6 @@ package com.elphel.imagej.calibration;
import
java.awt.Rectangle
;
import
java.util.Properties
;
import
com.elphel.imagej.calibration.SimulationPattern.SimulParameters
;
import
com.elphel.imagej.common.ShowDoubleFloatArrays
;
import
com.elphel.imagej.common.WindowTools
;
...
...
@@ -136,6 +135,8 @@ public class LensAdjustment {
null
,
// is not used in update mode
distortionParameters
,
//
patternDetectParameters
,
patternDetectParameters
.
minGridPeriod
/
2
,
patternDetectParameters
.
maxGridPeriod
/
2
,
simulParameters
,
equalizeGreens
,
imp_eq
,
// image to process
...
...
@@ -158,6 +159,8 @@ public class LensAdjustment {
numAbsolutePoints
=
matchSimulatedPattern
.
calculateDistortions
(
// allow more of grid around pointers?
distortionParameters
,
//
patternDetectParameters
,
patternDetectParameters
.
minGridPeriod
/
2
,
patternDetectParameters
.
maxGridPeriod
/
2
,
simulParameters
,
equalizeGreens
,
imp_eq
,
...
...
@@ -806,6 +809,7 @@ public class LensAdjustment {
this
.
reportTemperature
=
reportTemperature
;
this
.
showLegacy
=
showLegacy
;
}
@Override
public
FocusMeasurementParameters
clone
(){
return
new
FocusMeasurementParameters
(
this
.
gridGeometryFile
,
...
...
src/main/java/com/elphel/imagej/calibration/MatchSimulatedPattern.java
View file @
4ffb8a32
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/common/DoubleFHT.java
View file @
4ffb8a32
...
...
@@ -124,15 +124,7 @@ public class DoubleFHT {
public
boolean
transform
(
double
[]
data
,
boolean
inverse
)
{
//IJ.log("transform: "+maxN+" "+inverse);
updateMaxN
(
data
);
// maxN = (int) Math.sqrt(data.length);
// if ((S==null) || (S.length!=(maxN/4))) {
// makeSinCosTables(maxN);
// makeBitReverseTable(maxN);
// tempArr = new double[maxN];
// }
// float[] fht = (float[])getPixels();
rc2DFHT
(
data
,
inverse
,
this
.
maxN
);
// isFrequencyDomain = !inverse;
return
true
;
}
...
...
@@ -141,13 +133,7 @@ public class DoubleFHT {
double
lowPass
){
return
createFrequencyFilter
(
null
,
highPass
,
lowPass
);
}
/* public double []createFrequencyFilter(
double [] data,
double highPass,
double lowPass){
return createFrequencyFilter(data.length,highPass,lowPass);
}
*/
public
double
[]
createFrequencyFilter
(
double
[]
data
,
//int n,
double
highPass
,
...
...
@@ -155,7 +141,7 @@ public class DoubleFHT {
if
(
data
!=
null
)
updateMaxN
(
data
);
// int n;
if
((
this
.
freqMask
!=
null
)
&&
(
this
.
freqPass
[
0
]==
highPass
)
&&
(
this
.
freqPass
[
0
]==
lowPass
))
return
this
.
freqMask
;
if
((
this
.
freqMask
!=
null
)
&&
(
this
.
freqPass
[
0
]==
highPass
)
&&
(
this
.
freqPass
[
1
]==
lowPass
))
return
this
.
freqMask
;
this
.
freqMask
=
new
double
[(
this
.
maxN
+
1
)*
this
.
maxN
/
2
+
1
];
double
[]
lo
=
new
double
[
this
.
maxN
];
double
[]
hi
=
new
double
[
this
.
maxN
];
...
...
@@ -177,12 +163,9 @@ public class DoubleFHT {
if
(
j
>
this
.
maxN
/
2
)
j
=
this
.
maxN
-
j
;
this
.
freqMask
[
index
]=(
1.0
-
hi
[
i
]*
hi
[
j
])*
lo
[
i
]*
lo
[
j
];
}
// this.freqMaskN=n;
this
.
freqPass
=
new
double
[
2
];
this
.
freqPass
[
0
]=
highPass
;
this
.
freqPass
[
1
]=
lowPass
;
// this.freqMask_cache[this.ln2]=this.freqMask;
// this.freqPass_cache[this.ln2]=this.freqPass;
return
this
.
freqMask
;
}
/**
...
...
@@ -195,49 +178,6 @@ public class DoubleFHT {
*/
public
double
[]
shift
(
double
[]
data
,
double
dx
,
double
dy
){
return
shift
(
data
,
1
,
dx
,
dy
);
/*
updateMaxN(data);
double sX=2*Math.PI*dx/this.maxN;
double sY=2*Math.PI*dy/this.maxN;
int halfN=this.maxN/2;
double [] cosDX = new double[this.maxN];
double [] sinDX = new double[this.maxN];
double [] cosDY = new double[halfN+1];
double [] sinDY = new double[halfN+1];
for (int i=0;i<=halfN;i++){ // need less?
cosDX[i]=Math.cos(sX*i);
sinDX[i]=Math.sin(sX*i);
cosDY[i]=Math.cos(sY*i);
sinDY[i]=Math.sin(sY*i);
}
for (int i=1;i<halfN;i++){ // need less?
cosDX[this.maxN-i]= cosDX[i];
sinDX[this.maxN-i]=-sinDX[i];
}
swapQuadrants(data);
if (!transform(data,false)) return null; // direct FHT
for (int row =0; row<=halfN; row++) {
int rowMod = (this.maxN - row) % this.maxN;
int maxCol=(row<halfN)?(this.maxN-1):halfN;
for (int col=0; col<=maxCol; col++) {
int colMod = (this.maxN - col) % this.maxN;
int index= row * this.maxN + col;
int indexMod=rowMod * this.maxN + colMod;
double re=0.5*(data[index]+data[indexMod]);
double im=0.5*(data[index]-data[indexMod]);
if ((col==halfN) || (row==halfN)) im=0;
double cosDelta= cosDX[col]*cosDY[row] - sinDX[col]*sinDY[row]; // cos(deltaX)*cos(deltaY)-sin(deltaX)*sin(deltaY)
double sinDelta= sinDX[col]*cosDY[row] + cosDX[col]*sinDY[row]; // sin(deltaX)*cos(deltaY)+cos(deltaX)*sin(deltaY)
double reMod=re*cosDelta-im*sinDelta;
double imMod=re*sinDelta+im*cosDelta;
data[index]= reMod+imMod;
data[indexMod]=reMod-imMod;
}
}
if (!transform(data,true)) return null; // inverse FHT
swapQuadrants(data);
return data;
*/
}
/**
* Upsample input array by padding in the frequency domain
...
...
@@ -247,30 +187,6 @@ public class DoubleFHT {
*/
public
double
[]
upsample
(
double
[]
first
,
int
scale
){
return
shift
(
first
,
scale
,
0.0
,
0.0
);
/*
if (scale <=1) return first.clone();
updateMaxN(first);
swapQuadrants(first);
if (!transform(first,false)) return null; // direct FHT
int halfN=this.maxN/2;
int shift=this.maxN*(scale-1);
int scaledN=this.maxN*scale;
double [] result =new double [first.length*scale*scale];
for (int i=0;i<result.length;i++) result [i]=0.0;
double scale2=scale*scale;
for (int i=0;i<first.length;i++){
int iy=i/this.maxN;
int ix=i%this.maxN;
if (ix>halfN) ix+=shift;
if (iy>halfN) iy+=shift;
result[scaledN*iy+ix]=scale2*first[i];
}
updateMaxN(result);
if (!transform(result,true)) return null; // inverse FHT
swapQuadrants(result);
return result;
*/
}
/**
...
...
@@ -408,6 +324,54 @@ public class DoubleFHT {
swapQuadrants
(
first
);
return
first
;
}
public
double
[]
phaseCorrelate
(
double
[]
first
,
double
phaseCoeff
,
double
high_pass
,
double
low_pass
)
{
// high/low pass filtering
return
phaseCorrelate
(
first
,
phaseCoeff
,
high_pass
,
low_pass
,
null
);
}
public
double
[]
phaseCorrelate
(
double
[]
first
,
double
phaseCoeff
,
double
high_pass
,
double
low_pass
,
// high/low pass filtering
double
[]
fht_save
){
//null-OK
updateMaxN
(
first
);
double
[]
filter
=
null
;
if
((
high_pass
>
0
)
||
(
low_pass
>
0
))
{
filter
=
createFrequencyFilter
(
high_pass
,
low_pass
);
}
return
phaseCorrelate
(
first
,
phaseCoeff
,
filter
,
fht_save
);
}
public
double
[]
phaseCorrelate
(
double
[]
first
,
double
phaseCoeff
,
double
[]
filter
)
{
// high/low pass filtering
return
phaseCorrelate
(
first
,
phaseCoeff
,
filter
,
null
);
}
public
double
[]
phaseCorrelate
(
double
[]
first
,
double
phaseCoeff
,
double
[]
filter
,
// high/low pass filtering
double
[]
fht_save
){
//null-OK
updateMaxN
(
first
);
swapQuadrants
(
first
);
if
(!
transform
(
first
,
false
))
return
null
;
// direct FHT
if
(
fht_save
!=
null
)
{
System
.
arraycopy
(
first
,
0
,
fht_save
,
0
,
first
.
length
);
}
first
=
phaseMultiplyNorm
(
first
,
first
,
phaseCoeff
);
// correlation, not convolution
if
(
filter
!=
null
)
multiplyByReal
(
first
,
filter
);
transform
(
first
,
true
)
;
// inverse transform
swapQuadrants
(
first
);
return
first
;
}
//
public
double
[]
applyFreqFilter
(
double
[]
first
,
double
[]
filter
...
...
@@ -2024,6 +1988,7 @@ public class DoubleFHT {
return
product
;
}
public
double
[]
phaseMultiply
(
double
[]
h1
,
double
[]
h2
,
double
phaseCoeff
)
{
int
rowMod
,
colMod
;
double
h2e
,
h2o
,
d
;
...
...
@@ -2041,6 +2006,54 @@ public class DoubleFHT {
return
product
;
}
public
double
[]
phaseMultiplyNorm
(
double
[]
h1
,
double
[]
h2
,
double
phaseCoeff
)
{
int
size
=
maxN
;
int
size2
=
size
>>
1
;
int
size21
=
size
*
size2
;
int
rowMod
,
colMod
,
base
,
baseMod
;
double
h2e
,
h2o
;
double
[]
product
=
new
double
[
size
*
size
];
for
(
int
r
=
0
;
r
<
size
;
r
++)
{
rowMod
=
(
size
-
r
)
%
size
;
for
(
int
c
=
0
;
c
<
size
;
c
++)
{
colMod
=
(
size
-
c
)
%
size
;
h2e
=
(
h2
[
r
*
size
+
c
]
+
h2
[
rowMod
*
size
+
colMod
])
/
2
;
h2o
=
(
h2
[
r
*
size
+
c
]
-
h2
[
rowMod
*
size
+
colMod
])
/
2
;
product
[
r
*
size
+
c
]
=
(
h1
[
r
*
size
+
c
]
*
h2e
-
h1
[
rowMod
*
size
+
colMod
]
*
h2o
);
}
}
double
[]
amplitude
=
calculateAmplitudeHalf
(
product
);
double
avg_ampl
=
0.0
;
for
(
int
row
=
1
;
row
<
size2
;
row
++)
{
base
=
row
*
size
;
for
(
int
col
=
0
;
col
<
size
;
col
++)
{
avg_ampl
+=
amplitude
[
col
+
base
];
}
}
avg_ampl
*=
2
;
for
(
int
col
=
0
;
col
<
size
;
col
++)
{
avg_ampl
+=
amplitude
[
col
]
+
amplitude
[
col
+
size21
];
}
avg_ampl
/=
size
*
size
;
double
aoffs
=
(
1.0
-
phaseCoeff
)
*
avg_ampl
;
double
ampl
;
for
(
int
row
=
0
;
row
<=
size2
;
row
++)
{
base
=
row
*
size
;
rowMod
=
(
size
-
row
)
%
size
;
baseMod
=
rowMod
*
size
;
for
(
int
col
=
0
;
col
<
size
;
col
++)
{
ampl
=
phaseCoeff
*
amplitude
[
col
+
base
]
+
aoffs
;
product
[
col
+
base
]
/=
ampl
;
if
((
row
>
0
)
&&
(
row
<
size2
))
{
colMod
=
(
size
-
col
)
%
size
;
product
[
colMod
+
baseMod
]
/=
ampl
;
}
}
}
return
product
;
}
// Multiply by real array (i.e. filtering in frequency domain). Array m length should be at least maxN*maxN/2+1
public
void
multiplyByReal
(
double
[]
h
,
double
[]
m
)
{
...
...
@@ -2094,6 +2107,17 @@ public class DoubleFHT {
swapQuadrants
(
amp
);
return
amp
;
}
public
double
[]
calculateAmplitudeHalf
(
double
[]
fht
)
{
int
size
=(
int
)
Math
.
sqrt
(
fht
.
length
);
int
size2
=
(
size
>>
1
)
+
1
;
double
[]
amp
=
new
double
[
size
*
size2
];
for
(
int
row
=
0
;
row
<
size2
;
row
++)
{
amplitude
(
row
,
size
,
fht
,
amp
);
}
return
amp
;
}
public
double
[]
calculateAmplitude2
(
double
[]
fht
)
{
int
size
=(
int
)
Math
.
sqrt
(
fht
.
length
);
double
[]
amp
=
new
double
[
size
*
size
];
...
...
@@ -2133,8 +2157,6 @@ public class DoubleFHT {
row2
=(
fftsize
-
row1
)
%
fftsize
;
for
(
col1
=
0
;
col1
<
fftsize
;
col1
++)
{
col2
=(
fftsize
-
col1
)
%
fftsize
;
// fftHalf[row1][col1]= complex( 0.5*(fht_pixels[row1*fftsize+col1] + fht_pixels[row2*fftsize+col2]),
// 0.5*(fht_pixels[row2*fftsize+col2] - fht_pixels[row1*fftsize+col1]));
fftHalf
[
row1
][
col1
][
0
]=
0.5
*(
fht_pixels
[
row1
*
fftsize
+
col1
]
+
fht_pixels
[
row2
*
fftsize
+
col2
]);
fftHalf
[
row1
][
col1
][
1
]=
0.5
*(
fht_pixels
[
row2
*
fftsize
+
col2
]
-
fht_pixels
[
row1
*
fftsize
+
col1
]);
}
...
...
src/main/java/com/elphel/imagej/common/ShowDoubleFloatArrays.java
View file @
4ffb8a32
...
...
@@ -112,6 +112,30 @@ import ij.process.ImageProcessor;
return
;
}
else
showArrays
(
pixels
,
width
,
height
,
titles
);
}
public
void
showComplex
(
double
[][][]
cpixels
,
String
title
)
{
int
height
=
cpixels
.
length
;
int
width
=
cpixels
[
0
].
length
;
double
[][]
pixels
=
new
double
[
height
*
width
][];
int
indx
=
0
;
for
(
int
y
=
0
;
y
<
height
;
y
++)
{
for
(
int
x
=
0
;
x
<
width
;
x
++)
{
pixels
[
indx
++]
=
cpixels
[
y
][
x
];
}
}
showComplex
(
pixels
,
width
,
title
);
}
public
void
showComplex
(
double
[][]
cpixels
,
int
width
,
String
title
)
{
int
height
=
cpixels
.
length
/
width
;
double
[][]
pixels
=
new
double
[
2
][
cpixels
.
length
];
for
(
int
i
=
0
;
i
<
cpixels
.
length
;
i
++)
{
pixels
[
0
][
i
]=
cpixels
[
i
][
0
];
pixels
[
1
][
i
]=
cpixels
[
i
][
1
];
}
String
[]
titles
=
{
"Re"
,
"Im"
};
showArrays
(
pixels
,
width
,
height
,
true
,
title
,
titles
);
}
public
void
showArrays
(
float
[][]
pixels
,
int
width
,
int
height
,
boolean
asStack
,
String
title
,
String
[]
titles
)
{
int
i
,
j
;
...
...
src/main/java/com/elphel/imagej/jp4/JP46_Reader_camera.java
View file @
4ffb8a32
...
...
@@ -1407,7 +1407,12 @@ Exception in thread "Thread-3564" java.lang.ArrayIndexOutOfBoundsException: 8970
NodeList
allNodes
=
doc
.
getDocumentElement
().
getElementsByTagName
(
"*"
);
for
(
int
i
=
0
;
i
<
allNodes
.
getLength
();
i
++)
{
String
name
=
allNodes
.
item
(
i
).
getNodeName
();
String
value
=
allNodes
.
item
(
i
).
getFirstChild
().
getNodeValue
();
String
value
=
""
;
try
{
value
=
allNodes
.
item
(
i
).
getFirstChild
().
getNodeValue
();
}
catch
(
Exception
e
)
{
}
imp
.
setProperty
(
name
,
value
);
}
...
...
src/main/java/com/elphel/imagej/lwir/LwirReaderParameters.java
View file @
4ffb8a32
...
...
@@ -26,10 +26,14 @@
*/
package
com
.
elphel
.
imagej
.
lwir
;
import
java.io.File
;
import
java.io.FilenameFilter
;
import
java.util.Properties
;
import
com.elphel.imagej.common.GenericJTabbedDialog
;
import
ij.Prefs
;
public
class
LwirReaderParameters
{
private
boolean
parameters_updated
=
false
;
protected
int
avg_number
=
4
;
// number of measurements to average
...
...
@@ -49,6 +53,7 @@ public class LwirReaderParameters {
protected
double
vnir_gain_g
=
2.0
;
protected
double
vnir_gain_rg
=
0.7705
;
// 1.116; halogen/fluorescent
protected
double
vnir_gain_bg
=
2.401
;
// 1.476;
protected
boolean
[]
selected_channels
=
{
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
};
/*
protected double [] vnir_exp_corr = {1.0, 1.0, 1.0, 1.0};
...
...
@@ -106,6 +111,7 @@ public class LwirReaderParameters {
properties
.
setProperty
(
prefix
+
"max_mismatch_ms"
,
this
.
max_mismatch_ms
+
""
);
properties
.
setProperty
(
prefix
+
"max_frame_diff"
,
this
.
max_frame_diff
+
""
);
properties
.
setProperty
(
prefix
+
"debug_level"
,
this
.
debug_level
+
""
);
properties
.
setProperty
(
prefix
+
"selected_channels"
,
arr_to_str
(
this
.
selected_channels
));
}
...
...
@@ -134,6 +140,7 @@ public class LwirReaderParameters {
if
(
properties
.
getProperty
(
prefix
+
"max_mismatch_ms"
)!=
null
)
this
.
max_mismatch_ms
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"max_mismatch_ms"
));
if
(
properties
.
getProperty
(
prefix
+
"max_frame_diff"
)!=
null
)
this
.
max_frame_diff
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"max_frame_diff"
));
if
(
properties
.
getProperty
(
prefix
+
"debug_level"
)!=
null
)
this
.
debug_level
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"debug_level"
));
if
(
properties
.
getProperty
(
prefix
+
"selected_channels"
)!=
null
)
this
.
selected_channels
=
str_to_barr
(
properties
.
getProperty
(
prefix
+
"selected_channels"
));
parameters_updated
=
true
;
}
@Override
...
...
@@ -163,6 +170,7 @@ public class LwirReaderParameters {
lrp
.
max_mismatch_ms
=
this
.
max_mismatch_ms
;
lrp
.
max_frame_diff
=
this
.
max_frame_diff
;
lrp
.
debug_level
=
this
.
debug_level
;
lrp
.
selected_channels
=
this
.
selected_channels
.
clone
();
return
lrp
;
}
...
...
@@ -198,7 +206,8 @@ public class LwirReaderParameters {
(
lrp
.
vnir_lag
==
this
.
vnir_lag
)
&&
(
lrp
.
max_mismatch_ms
==
this
.
max_mismatch_ms
)
&&
(
lrp
.
max_frame_diff
==
this
.
max_frame_diff
)
&&
(
lrp
.
debug_level
==
this
.
debug_level
);
(
lrp
.
debug_level
==
this
.
debug_level
)
&&
(
java
.
util
.
Arrays
.
equals
(
lrp
.
selected_channels
,
this
.
selected_channels
));
}
@Override
...
...
@@ -225,6 +234,7 @@ public class LwirReaderParameters {
result
=
prime
*
result
+
arr_to_str
(
vnir_exp_corr
).
hashCode
();
result
=
prime
*
result
+
arr_to_str
(
vnir_gcorr_rbgb
).
hashCode
();
result
=
prime
*
result
+
(
new
Integer
(
lwir_trig_dly
)).
hashCode
();
result
=
prime
*
result
+
arr_to_str
(
selected_channels
).
hashCode
();
// next are not needed to be programmed to the cameras
// result = prime * result + (new Integer(vnir_lag)).hashCode();
// result = prime * result + (new Double(max_mismatch_ms)).hashCode();
...
...
@@ -241,7 +251,7 @@ public class LwirReaderParameters {
gd
.
addStringField
(
"LWIR channels"
,
arr_to_str
(
this
.
lwir_channels
),
20
,
"Space-separated list of used LWIR camera channels, such as '0 1 2 3'"
);
gd
.
addStringField
(
"VNIR channels"
,
arr_to_str
(
this
.
vnir_channels
),
20
,
"Space-separated list of used visible range camera channels, such as '0 1 2 3'"
);
gd
.
addCheckbox
(
"LWIR telemetry"
,
this
.
lwir_telemetry
,
"Set LWIR sesnors to provide telemetry data in the last 2 lines (may become mandatory later)"
);
gd
.
addNumericField
(
"VNIR quality"
,
this
.
vnir_quality
,
3
,
6
,
"
ms
"
,
"Visible range camera JPEG compression quality (all channels)"
);
gd
.
addNumericField
(
"VNIR quality"
,
this
.
vnir_quality
,
3
,
6
,
"
%
"
,
"Visible range camera JPEG compression quality (all channels)"
);
gd
.
addCheckbox
(
"VNIR undo white balance"
,
this
.
vnir_scale
,
"Undo in-camera white balancing"
);
gd
.
addCheckbox
(
"VNIR autoexposure"
,
this
.
vnir_autoexp
,
"Enable autoexposure for the visible range camera"
);
gd
.
addNumericField
(
"VNIR vnir_max_autoexp_ms"
,
this
.
vnir_max_autoexp_ms
,
3
,
6
,
"ms"
,
"Visible range camera maximal exposure in autoexposure mode"
);
...
...
@@ -257,6 +267,7 @@ public class LwirReaderParameters {
gd
.
addNumericField
(
"Max mismatch"
,
this
.
max_mismatch_ms
,
3
,
6
,
"ms"
,
"Maximal mismatch between image timestamps. Larger mismatch requires LWIR sinsor reinitialization"
);
gd
.
addNumericField
(
"Max frame diff"
,
this
.
max_frame_diff
,
0
,
3
,
""
,
"Maximal difference in frames between simultaneously acquired channels as calculated from the timestamps"
);
gd
.
addNumericField
(
"Debug level"
,
this
.
debug_level
,
0
,
3
,
""
,
"Image acquisition log level: -3: OFF, -2:FATAL, -1:ERROR, 0:WARN, 1:INFO, 2:DEBUG"
);
gd
.
addStringField
(
"Selected channels"
,
arr_to_str
(
this
.
selected_channels
),
20
,
"Space-separated channel selection (1 - selected, 0 - unselected)"
);
}
public
void
dialogAnswers
(
GenericJTabbedDialog
gd
)
{
...
...
@@ -284,6 +295,7 @@ public class LwirReaderParameters {
this
.
max_mismatch_ms
=
gd
.
getNextNumber
();
this
.
max_frame_diff
=
(
int
)
gd
.
getNextNumber
();
this
.
debug_level
=
(
int
)
gd
.
getNextNumber
();
this
.
selected_channels
=
str_to_barr
(
gd
.
getNextString
());
parameters_updated
=
true
;
}
...
...
@@ -307,6 +319,80 @@ public class LwirReaderParameters {
parameters_updated
=
false
;
}
public
boolean
[]
getSelected
(){
return
selected_channels
;
}
public
boolean
[]
getSelectedLwir
(){
boolean
[]
sel
=
selected_channels
.
clone
();
for
(
int
i
=
lwir_channels
.
length
;
i
<
sel
.
length
;
i
++
)
{
sel
[
i
]
=
false
;
}
return
sel
;
}
public
boolean
[]
getSelectedVnir
(){
boolean
[]
sel
=
selected_channels
.
clone
();
for
(
int
i
=
0
;
i
<
lwir_channels
.
length
;
i
++
)
{
sel
[
i
]
=
false
;
}
return
sel
;
}
public
String
[]
getSourceFilesFlat
(
String
[]
sets
,
boolean
[]
channels
)
{
int
num_sel
=
0
;
for
(
boolean
s:
channels
)
if
(
s
)
num_sel
++;
String
[]
files
=
new
String
[
sets
.
length
*
num_sel
];
int
indx
=
0
;
for
(
String
set:
sets
)
{
for
(
int
i
=
0
;
i
<
channels
.
length
;
i
++)
if
(
channels
[
i
])
{
String
file_base
=
set
;
if
(
set
.
indexOf
(
Prefs
.
getFileSeparator
())
>=
0
)
{
file_base
=
set
.
substring
(
set
.
lastIndexOf
(
Prefs
.
getFileSeparator
())+
1
);
}
files
[
indx
++]
=
set
+
Prefs
.
getFileSeparator
()+
file_base
+
"_"
+
i
+
".tiff"
;
}
}
return
files
;
}
// Image set may have different timestamps, only lwir0 matches
public
String
[][]
getSourceFiles
(
String
[]
sets
,
boolean
[]
channels
)
{
String
[][]
files
=
new
String
[
sets
.
length
][
channels
.
length
];
for
(
int
nset
=
0
;
nset
<
sets
.
length
;
nset
++)
{
// read all files in the directory
File
set_dir
=
new
File
(
sets
[
nset
]);
File
[]
channel_files
=
set_dir
.
listFiles
(
new
FilenameFilter
()
{
@Override
public
boolean
accept
(
File
current
,
String
name
)
{
if
(!(
new
File
(
current
,
name
).
isFile
())
||
!
name
.
endsWith
(
".tiff"
))
return
false
;
String
base
=
name
.
substring
(
0
,
name
.
lastIndexOf
(
".tiff"
));
int
undr
=
base
.
lastIndexOf
(
"_"
);
if
(
undr
<
0
)
return
false
;
int
chn
=
-
1
;
try
{
chn
=
Integer
.
parseInt
(
base
.
substring
(
undr
+
1
));
}
catch
(
Exception
e
)
{
}
return
chn
>=
0
;
}
});
for
(
File
f:
channel_files
)
{
String
base
=
f
.
getName
().
substring
(
0
,
f
.
getName
().
lastIndexOf
(
".tiff"
));
int
undr
=
base
.
lastIndexOf
(
"_"
);
int
chn
=
Integer
.
parseInt
(
base
.
substring
(
undr
+
1
));
if
((
chn
>=
0
)
&&
(
chn
<
channels
.
length
)
&&
channels
[
chn
])
{
files
[
nset
][
chn
]
=
f
.
getPath
();
}
}
}
return
files
;
}
// --- internal methods
private
String
arr_to_str
(
int
[]
arr
)
{
...
...
@@ -321,6 +407,23 @@ public class LwirReaderParameters {
return
s
.
trim
();
}
private
String
arr_to_str
(
boolean
[]
arr
)
{
String
s
=
""
;
for
(
boolean
c:
arr
)
s
+=
(
c
?
1
:
0
)+
" "
;
return
s
.
trim
();
}
private
boolean
[]
str_to_barr
(
String
s
)
{
int
[]
iarr
=
str_to_iarr
(
s
);
if
(
iarr
==
null
)
return
null
;
boolean
[]
barr
=
new
boolean
[
iarr
.
length
];
for
(
int
i
=
0
;
i
<
barr
.
length
;
i
++)
{
barr
[
i
]
=
iarr
[
i
]
!=
0
;
}
return
barr
;
}
private
int
[]
str_to_iarr
(
String
s
)
{
String
[]
sa
;
if
(
s
.
indexOf
(
","
)
>=
0
)
{
...
...
@@ -349,4 +452,22 @@ public class LwirReaderParameters {
return
darr
;
}
public
boolean
[]
selectSourceChannels
(){
return
selectSourceChannels
(
selected_channels
);
}
public
boolean
[]
selectSourceChannels
(
boolean
[]
sel
)
{
GenericJTabbedDialog
gd
=
new
GenericJTabbedDialog
(
"Set CLT parameters"
,
300
,
500
);
for
(
int
i
=
0
;
i
<
sel
.
length
;
i
++)
{
gd
.
addCheckbox
(
"Channel "
+
i
,
sel
[
i
],
"Enable processing camera channel "
+
i
);
}
gd
.
showDialog
();
if
(
gd
.
wasCanceled
())
return
null
;
for
(
int
i
=
0
;
i
<
sel
.
length
;
i
++)
{
sel
[
i
]
=
gd
.
getNextBoolean
();
}
return
sel
;
}
}
src/main/java/com/elphel/imagej/readers/EyesisTiff.java
View file @
4ffb8a32
...
...
@@ -640,7 +640,7 @@ the type of pixel data in this file getPixelType()
}
// copied from JP46_Reader_camera.java
public
ImagePlus
encodeProperiesToInfo
(
ImagePlus
imp
){
public
static
ImagePlus
encodeProperiesToInfo
(
ImagePlus
imp
){
String
info
=
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><properties>"
;
Set
<
Object
>
jp4_set
;
Properties
jp4_prop
;
...
...
@@ -661,7 +661,7 @@ the type of pixel data in this file getPixelType()
return
imp
;
}
public
boolean
decodeProperiesFromInfo
(
ImagePlus
imp
){
public
static
boolean
decodeProperiesFromInfo
(
ImagePlus
imp
){
if
(
imp
.
getProperty
(
"Info"
)==
null
)
return
false
;
String
xml
=
(
String
)
imp
.
getProperty
(
"Info"
);
...
...
@@ -684,11 +684,15 @@ the type of pixel data in this file getPixelType()
NodeList
allNodes
=
doc
.
getDocumentElement
().
getElementsByTagName
(
"*"
);
for
(
int
i
=
0
;
i
<
allNodes
.
getLength
();
i
++)
{
String
name
=
allNodes
.
item
(
i
).
getNodeName
();
String
value
=
allNodes
.
item
(
i
).
getFirstChild
().
getNodeValue
();
// System.out.print(name+" -> ");
String
value
=
""
;
try
{
value
=
allNodes
.
item
(
i
).
getFirstChild
().
getNodeValue
();
}
catch
(
Exception
e
)
{
}
// System.out.println(value);
imp
.
setProperty
(
name
,
value
);
}
return
true
;
}
...
...
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