-
Notifications
You must be signed in to change notification settings - Fork 0
/
fuse_opticalflow.m
executable file
·35 lines (32 loc) · 1.42 KB
/
fuse_opticalflow.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function [fused_image, err] = fuse_opticalflow(ref, image_stack, ann_stack, n_stack)
n = n_stack;
fused_image = zeros(size(image_stack(:,:,:,1)));
error = zeros(size(image_stack(:,:,1,1)));
ref_r = ref(:,:,1);
ref_g = ref(:,:,2);
ref_b = ref(:,:,3);
for i = 1 : n
vx = double(ann_stack(:,:,1,i));
vy = double(ann_stack(:,:,2,i));
key_r = image_stack(:,:,1,i);
key_g = image_stack(:,:,2,i);
key_b = image_stack(:,:,3,i);
[x, y] = meshgrid(1:size(image_stack,2), 1:size(image_stack,1));
image_warp_r = interp2(key_r, x + vx ,y + vy);
image_warp_g = interp2(key_g, x + vx ,y + vy);
image_warp_b = interp2(key_b, x + vx ,y + vy);
image_warp_r(isnan(image_warp_r)) = ref_r(isnan(image_warp_r));
image_warp_g(isnan(image_warp_g)) = ref_g(isnan(image_warp_g));
image_warp_b(isnan(image_warp_b)) = ref_b(isnan(image_warp_b));
image_warp(:,:,1) = image_warp_r;
image_warp(:,:,2) = image_warp_g;
image_warp(:,:,3) = image_warp_b;
image_warp = double(ann_stack(:,:,:,i));
dist = mean(ref - image_warp, 3);
w = exp(-double(dist));
w_total = w_total + w;
fused_image = fused_image + repmat(w, [1 1 3]) .* image_warp;
error = error + dist;
end
fused_image = fused_image ./ repmat(w_total, [1 1 3]);
err = error / n;