198 while true |
198 while true |
199 # Extract subwindow of original image and add noise |
199 # Extract subwindow of original image and add noise |
200 b_true = zeros(sz...) |
200 b_true = zeros(sz...) |
201 extract_subimage!(b_true, im, v_cumul; threads=true) |
201 extract_subimage!(b_true, im, v_cumul; threads=true) |
202 b = b_true .+ params.noise_level.*randn(rng,sz...) |
202 b = b_true .+ params.noise_level.*randn(rng,sz...) |
203 v = v_true.*(1.0 .+ params.shake_noise_level.*randn(rng,size(v_true)...)) |
203 v = v_true.*(1.0 .+ zero_factor*params.shake_noise_level.*randn(rng,size(v_true)...)) |
204 # Pass data to iteration routine |
204 # Pass data to iteration routine |
205 data = OnlineData{DisplacementConstant}(b_true, b, v, v_true, v_cumul) |
205 data = OnlineData{DisplacementConstant}(b_true, b, v, v_true, v_cumul) |
206 if !put_unless_closed!(datachannel, data) |
206 if !put_unless_closed!(datachannel, data) |
207 return |
207 return |
208 end |
208 end |
225 |
225 |
226 |
226 |
227 ######################################################################## |
227 ######################################################################## |
228 # PETscan |
228 # PETscan |
229 ######################################################################## |
229 ######################################################################## |
230 function generate_radon(im, sz, |
230 function generate_sinogram(im, sz, |
231 :: Type{DisplacementConstant}, |
231 :: Type{DisplacementConstant}, |
232 datachannel :: Channel{PetOnlineData{DisplacementConstant}}, |
232 datachannel :: Channel{PetOnlineData{DisplacementConstant}}, |
233 params :: NamedTuple) |
233 params :: NamedTuple) |
234 |
234 |
235 # Set up counter and zero factor for stabilisation |
235 # Set up counter and zero factor for stabilisation |
255 tform = recenter(RotMatrix(theta_cumul), center_point) |
255 tform = recenter(RotMatrix(theta_cumul), center_point) |
256 |
256 |
257 # Apply the transformation to the image using warp |
257 # Apply the transformation to the image using warp |
258 b_true = copy(warp(im, tform, axes(im), fillvalue=Flat())) |
258 b_true = copy(warp(im, tform, axes(im), fillvalue=Flat())) |
259 |
259 |
260 v = v_true.*(1.0 .+ params.shake_noise_level.*randn(rng,size(v_true)...)) |
260 v = v_true.*(1.0 .+ zero_factor*params.shake_noise_level.*randn(rng,size(v_true)...)) |
261 theta = theta_true*(1.0 + params.rotation_noise_level.*randn(rng)) |
261 theta = theta_true*(1.0 + zero_factor*params.rotation_noise_level.*randn(rng)) |
262 |
262 |
263 # Generate the true and noisy sinograms |
263 # Generate the true and noisy sinograms |
264 sinogram_true = zeros(params.radondims...) |
264 sinogram_true = zeros(params.radondims...) |
265 sinogram_true .*= params.scale |
265 sinogram_true .*= params.scale |
266 radon!(sinogram_true, b_true) |
266 radon!(sinogram_true, b_true) |
291 end |
291 end |
292 |
292 |
293 function imgen_shepplogan_radon(sz) |
293 function imgen_shepplogan_radon(sz) |
294 im = convert(Array{Float64},TestImages.shepp_logan(sz[1], highContrast=true)) |
294 im = convert(Array{Float64},TestImages.shepp_logan(sz[1], highContrast=true)) |
295 dynrange = maximum(im) |
295 dynrange = maximum(im) |
296 return ImGen(curry(generate_radon, im, sz), sz, 1, dynrange, "shepplogan$(sz[1])x$(sz[2])") |
296 return ImGen(curry(generate_sinogram, im, sz), sz, 1, dynrange, "shepplogan$(sz[1])x$(sz[2])") |
297 end |
297 end |
298 |
298 |
299 function imgen_brainphantom_radon(sz) |
299 function imgen_brainphantom_radon(sz) |
300 data = matread("src/PET/phantom_slice.mat") |
300 data = matread("src/PET/phantom_slice.mat") |
301 im = normalise(imresize(convert(Array{Float64},data["square_data"]),sz)) |
301 im = normalise(imresize(convert(Array{Float64},data["square_data"]),sz)) |
302 dynrange = maximum(im) |
302 dynrange = maximum(im) |
303 return ImGen(curry(generate_radon, im, sz), sz, 1, dynrange, "brainphantom$(sz[1])x$(sz[2])") |
303 return ImGen(curry(generate_sinogram, im, sz), sz, 1, dynrange, "brainphantom$(sz[1])x$(sz[2])") |
304 end |
304 end |
305 |
305 |
306 normalise = (data) -> data./maximum(data) |
306 normalise = (data) -> data./maximum(data) |
307 end # Module |
307 end # Module |