Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F81074341
rescore.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Sep 4, 02:14
Size
4 KB
Mime Type
text/x-python
Expires
Fri, Sep 6, 02:14 (2 d)
Engine
blob
Format
Raw Data
Handle
20512880
Attached To
R6289 Motion correction paper
rescore.py
View Options
import
sys
,
Image
from
numpy
import
*
import
scipy.ndimage
def
score_from_autocorr
(
img0
,
img1
,
corres
):
# Code by Philippe Weinzaepfel
# Compute autocorrelation
# parameters
sigma_image
=
0.8
# for the gaussian filter applied to images before computing derivatives
sigma_matrix
=
3.0
# for the integration gaussian filter
derivfilter
=
array
([
-
0.5
,
0
,
0.5
])
# function to compute the derivatives
# smooth_images
tmp
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
img0
.
astype
(
float32
),
sigma_image
,
axis
=
0
,
order
=
0
,
mode
=
'nearest'
)
img0_smooth
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
tmp
,
sigma_image
,
axis
=
1
,
order
=
0
,
mode
=
'nearest'
)
# compute the derivatives
img0_dx
=
scipy
.
ndimage
.
filters
.
convolve1d
(
img0_smooth
,
derivfilter
,
axis
=
0
,
mode
=
'nearest'
)
img0_dy
=
scipy
.
ndimage
.
filters
.
convolve1d
(
img0_smooth
,
derivfilter
,
axis
=
1
,
mode
=
'nearest'
)
# compute the auto correlation matrix
dx2
=
sum
(
img0_dx
*
img0_dx
,
axis
=
2
)
dxy
=
sum
(
img0_dx
*
img0_dy
,
axis
=
2
)
dy2
=
sum
(
img0_dy
*
img0_dy
,
axis
=
2
)
# integrate it
tmp
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
dx2
,
sigma_matrix
,
axis
=
0
,
order
=
0
,
mode
=
'nearest'
)
dx2_smooth
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
tmp
,
sigma_matrix
,
axis
=
1
,
order
=
0
,
mode
=
'nearest'
)
tmp
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
dxy
,
sigma_matrix
,
axis
=
0
,
order
=
0
,
mode
=
'nearest'
)
dxy_smooth
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
tmp
,
sigma_matrix
,
axis
=
1
,
order
=
0
,
mode
=
'nearest'
)
tmp
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
dy2
,
sigma_matrix
,
axis
=
0
,
order
=
0
,
mode
=
'nearest'
)
dy2_smooth
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
tmp
,
sigma_matrix
,
axis
=
1
,
order
=
0
,
mode
=
'nearest'
)
# compute minimal eigenvalues: it is done by computing (dx2+dy2)/2 - sqrt( ((dx2+dy2)/2)^2 + (dxy)^2 - dx^2*dy^2)
tmp
=
0.5
*
(
dx2_smooth
+
dy2_smooth
)
small_eigen
=
tmp
-
sqrt
(
maximum
(
0
,
tmp
*
tmp
+
dxy_smooth
*
dxy_smooth
-
dx2_smooth
*
dy2_smooth
))
# the numbers can be negative in practice due to rounding errors
large_eigen
=
tmp
+
sqrt
(
maximum
(
0
,
tmp
*
tmp
+
dxy_smooth
*
dxy_smooth
-
dx2_smooth
*
dy2_smooth
))
# Compute weight as flow score: preparing variable
#parameters
sigma_image
=
0.8
# gaussian applied to images
derivfilter
=
array
([
1.0
,
-
8.0
,
0.0
,
8.0
,
-
1.0
])
/
12.0
# filter to compute the derivatives
sigma_score
=
50.0
# gaussian to convert dist to score
mul_coef
=
10.0
# multiplicative coefficients
# smooth images
tmp
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
img0
.
astype
(
float32
),
sigma_image
,
axis
=
0
,
order
=
0
,
mode
=
'nearest'
)
img0_smooth
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
tmp
,
sigma_image
,
axis
=
1
,
order
=
0
,
mode
=
'nearest'
)
tmp
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
img1
.
astype
(
float32
),
sigma_image
,
axis
=
0
,
order
=
0
,
mode
=
'nearest'
)
img1_smooth
=
scipy
.
ndimage
.
filters
.
gaussian_filter1d
(
tmp
,
sigma_image
,
axis
=
1
,
order
=
0
,
mode
=
'nearest'
)
# compute derivatives
img0_dx
=
scipy
.
ndimage
.
filters
.
convolve1d
(
img0_smooth
,
derivfilter
,
axis
=
0
,
mode
=
'nearest'
)
img0_dy
=
scipy
.
ndimage
.
filters
.
convolve1d
(
img0_smooth
,
derivfilter
,
axis
=
1
,
mode
=
'nearest'
)
img1_dx
=
scipy
.
ndimage
.
filters
.
convolve1d
(
img1_smooth
,
derivfilter
,
axis
=
0
,
mode
=
'nearest'
)
img1_dy
=
scipy
.
ndimage
.
filters
.
convolve1d
(
img1_smooth
,
derivfilter
,
axis
=
1
,
mode
=
'nearest'
)
# compute it
res
=
[]
for
pos0
,
pos1
,
score
in
corres
:
p0
,
p1
=
tuple
(
pos0
)[::
-
1
],
tuple
(
pos1
)[::
-
1
]
# numpy coordinates
dist
=
sum
(
abs
(
img0_smooth
[
p0
]
-
img1_smooth
[
p1
])
+
abs
(
img0_dx
[
p0
]
-
img1_dx
[
p1
])
+
abs
(
img0_dy
[
p0
]
-
img1_dy
[
p1
])
)
score
=
mul_coef
*
sqrt
(
max
(
0
,
small_eigen
[
p0
]))
/
(
sigma_score
*
sqrt
(
2
*
pi
))
*
exp
(
-
0.5
*
square
(
dist
/
sigma_score
));
res
.
append
((
pos0
,
pos1
,
score
))
return
res
if
__name__
==
'__main__'
:
args
=
sys
.
argv
[
1
:]
img0
=
array
(
Image
.
open
(
args
[
0
])
.
convert
(
'RGB'
))
img1
=
array
(
Image
.
open
(
args
[
1
])
.
convert
(
'RGB'
))
out
=
open
(
args
[
2
])
if
len
(
args
)
>=
3
else
sys
.
stdout
ty0
,
tx0
=
img0
.
shape
[:
2
]
ty1
,
tx1
=
img1
.
shape
[:
2
]
rint
=
lambda
s
:
int
(
0.5
+
float
(
s
))
retained_matches
=
[]
for
line
in
sys
.
stdin
:
line
=
line
.
split
()
if
not
line
or
len
(
line
)
!=
6
or
not
line
[
0
][
0
]
.
isdigit
():
continue
x0
,
y0
,
x1
,
y1
,
score
,
index
=
line
retained_matches
.
append
(((
min
(
tx0
-
1
,
rint
(
x0
)),
min
(
ty0
-
1
,
rint
(
y0
))),
(
min
(
tx1
-
1
,
rint
(
x1
)),
min
(
ty1
-
1
,
rint
(
y1
))),
0
))
assert
retained_matches
,
'error: no matches piped to this program'
for
p0
,
p1
,
score
in
score_from_autocorr
(
img0
,
img1
,
retained_matches
):
print
>>
out
,
'
%d
%d
%d
%d
%f
'
%
(
p0
[
0
],
p0
[
1
],
p1
[
0
],
p1
[
1
],
score
)
Event Timeline
Log In to Comment