src/Translate.jl

Sat, 14 Dec 2019 19:26:33 +0200

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sat, 14 Dec 2019 19:26:33 +0200
changeset 18
0d99f8f7d261
parent 17
8ff7da7bc77d
child 20
9aef75a9452d
permissions
-rw-r--r--

Added ImFilter & simple_imfilter.

0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 ######################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 # Image subpixel accuracy translation
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 ######################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
7
ab7d59b47140 Add __precompile__() for whatever it is worth
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
5 __precompile__()
ab7d59b47140 Add __precompile__() for whatever it is worth
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
6
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 module Translate
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 ##########
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 # Exports
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 ##########
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 export interpolate2d,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 interpolate2d_quadrants,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 extract_subimage!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 translate_image!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 DisplacementFull,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 DisplacementConstant,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 Displacement,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 Image
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 # Types
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 # Two different types of displacement data supported:
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 # a) given in each pixel
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 # b) constant in space
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 Image = Array{Float64,2}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 DisplacementFull = Array{Float64,3}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 DisplacementConstant = Array{Float64,1}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 Displacement = Union{DisplacementFull,DisplacementConstant}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 #############################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 # Base interpolation routine
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 #############################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 @inline function interpolate2d_quadrants(v, (x, y))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 (m, n) = size(v)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 clipx = xʹ -> max(1, min(xʹ, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 clipy = yʹ -> max(1, min(yʹ, n))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 xfℤ = clipx(floor(Int, x))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 xcℤ = clipx(ceil(Int, x))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 yfℤ = clipy(floor(Int, y))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 ycℤ = clipy(ceil(Int, y))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 xf = convert(Float64, xfℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 xc = convert(Float64, xcℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 yf = convert(Float64, yfℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 yc = convert(Float64, ycℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 xm = (xf+xc)/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 ym = (yf+yc)/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 vff = @inbounds v[xfℤ, yfℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 vfc = @inbounds v[xfℤ, ycℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 vcf = @inbounds v[xcℤ, yfℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 vcc = @inbounds v[xcℤ, ycℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 vmm = (vff+vfc+vcf+vcc)/4
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 if xfℤ==xcℤ
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 if yfℤ==ycℤ
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 # Completely degenerate case
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 v = vmm
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 # Degenerate x
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 v = vff+(y-yf)/(yc-yf)*(vfc-vff)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 elseif yfℤ==ycℤ
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 # Degenerate y
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 v = vff + (x-xf)/(xc-xf)*(vcf-vff)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 elseif y-ym ≥ x-xm
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 # top-left half
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 if (y-ym) + (x-xm) ≥ 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 # top quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 v = vfc + (x-xf)/(xc-xf)*(vcc-vfc) + (y-yc)/(ym-yc)*(vmm-(vcc+vfc)/2)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 # left quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 v = vff + (y-yf)/(yc-yf)*(vfc-vff) + (x-xf)/(xm-xf)*(vmm-(vfc+vff)/2)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 # bottom-left half
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 if (y-ym) + (x-xm) ≥ 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 # right quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 v = vcf + (y-yf)/(yc-yf)*(vcc-vcf) + (x-xc)/(xm-xc)*(vmm-(vcc+vcf)/2)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 # bottom quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 v = vff + (x-xf)/(xc-xf)*(vcf-vff) + (y-yf)/(ym-yf)*(vmm-(vcf+vff)/2)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 return v
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 ##############
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 # Translation
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 ##############
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98
17
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
99 function translate_image!(x, z, u::DisplacementFull)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 @assert(size(u, 1)==2 && size(x)==size(u)[2:end] && size(x)==size(z))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101
17
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
102 @inbounds Threads.@threads for i=1:size(x, 1)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 @simd for j=1:size(x, 2)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 pt = (i - u[1, i, j], j - u[2, i, j])
6
cd3ca6286daa For inlining to work we cannot do function assignments
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
105 x[i, j] = interpolate2d_quadrants(z, pt)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109
17
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
110 function translate_image!(x, z, u::DisplacementConstant)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 @assert(size(u)==(2,) && size(x)==size(z))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112
17
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
113 @inbounds Threads.@threads for i=1:size(x, 1)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 @simd for j=1:size(x, 2)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 pt = (i - u[1], j - u[2])
6
cd3ca6286daa For inlining to work we cannot do function assignments
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
116 x[i, j] = interpolate2d_quadrants(z, pt)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 ######################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 # Subimage extraction
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 ######################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124
17
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
125 function extract_subimage!(b, im, v::DisplacementConstant)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 (imx, imy) = size(im)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 (bx, by) = size(b)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 # Translation from target to source coordinates
2
684032c29023 consistent signs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
130 vxʹ = (imx-bx)/2 - v[1]
684032c29023 consistent signs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
131 vyʹ = (imy-by)/2 - v[2]
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 # Target image indices within source image
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 px = ceil(Int, max(1, vxʹ + 1) - vxʹ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 py = ceil(Int, max(1, vyʹ + 1) - vyʹ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 qx = floor(Int, min(imx, vxʹ + bx) - vxʹ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 qy = floor(Int, min(imy, vyʹ + by) - vyʹ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 b .= 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140
17
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
141 @inbounds Threads.@threads for i=px:qx
8ff7da7bc77d Some threading
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
142 @simd for j=py:qy
6
cd3ca6286daa For inlining to work we cannot do function assignments
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
143 b[i, j] = interpolate2d_quadrants(im, (i+vxʹ, j+vyʹ))
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147
5
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
148 #####################################################
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
149 # Precompilation hints to speed up compilation time
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
150 # for projects depending on this package (hopefully).
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
151 ######################################################
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
152
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
153 precompile(translate_image!, (Array{Float64,2}, Array{Float64,2}, Array{Float64,1}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
154 precompile(translate_image!, (Array{Float64,2}, Array{Float64,2}, Array{Float64,3}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
155 precompile(extract_subimage!, (Array{Float64,2}, Array{Float64,2}, Array{Float64,1}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
156
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 end

mercurial