src/Translate.jl

Mon, 18 Nov 2019 15:13:04 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 18 Nov 2019 15:13:04 -0500
changeset 2
684032c29023
parent 0
eef71dd7202b
child 5
29b38780d52b
permissions
-rw-r--r--

consistent signs

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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 module Translate
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 ##########
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 # Exports
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 ##########
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 export interpolate2d,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 interpolate2d_quadrants,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 extract_subimage!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 translate_image!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 DisplacementFull,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 DisplacementConstant,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 Displacement,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 Image
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 # Types
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 # Two different types of displacement data supported:
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 # a) given in each pixel
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 # b) constant in space
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 Image = Array{Float64,2}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 DisplacementFull = Array{Float64,3}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 DisplacementConstant = Array{Float64,1}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 Displacement = Union{DisplacementFull,DisplacementConstant}
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 #############################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 # Base interpolation routine
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 #############################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 @inline function interpolate2d_quadrants(v, (x, y))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 (m, n) = size(v)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 clipx = xʹ -> max(1, min(xʹ, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 clipy = yʹ -> max(1, min(yʹ, n))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 xfℤ = clipx(floor(Int, x))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 xcℤ = clipx(ceil(Int, x))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 yfℤ = clipy(floor(Int, y))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 ycℤ = clipy(ceil(Int, y))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 xf = convert(Float64, xfℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 xc = convert(Float64, xcℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 yf = convert(Float64, yfℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 yc = convert(Float64, ycℤ)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 xm = (xf+xc)/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 ym = (yf+yc)/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 vff = @inbounds v[xfℤ, yfℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 vfc = @inbounds v[xfℤ, ycℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 vcf = @inbounds v[xcℤ, yfℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 vcc = @inbounds v[xcℤ, ycℤ]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 vmm = (vff+vfc+vcf+vcc)/4
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 if xfℤ==xcℤ
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 if yfℤ==ycℤ
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 # Completely degenerate case
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 v = vmm
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 # Degenerate x
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 v = vff+(y-yf)/(yc-yf)*(vfc-vff)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 elseif yfℤ==ycℤ
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 # Degenerate y
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 v = vff + (x-xf)/(xc-xf)*(vcf-vff)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 elseif y-ym ≥ x-xm
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 # top-left half
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 if (y-ym) + (x-xm) ≥ 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 # top quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 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
75 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 # left quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 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
78 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 # bottom-left half
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 if (y-ym) + (x-xm) ≥ 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 # right quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 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
84 else
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 # bottom quadrant
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 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
87 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 return v
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 interpolate2d = interpolate2d_quadrants
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 @polly function translate_image!(x, z, u::DisplacementFull)
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 @inbounds @simd for i=1:size(x, 1)
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])
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 x[i, j] = interpolate2d(z, pt)
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 @polly function translate_image!(x, z, u::DisplacementConstant)
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 @inbounds @simd for i=1:size(x, 1)
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])
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 x[i, j] = interpolate2d(z, pt)
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 @polly function extract_subimage!(b, im, v::DisplacementConstant)
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 @inbounds @simd for i=px:qx
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 for j=py:qy
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 b[i, j] = interpolate2d(im, (i+vxʹ, j+vyʹ))
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 end

mercurial