-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathrp_sr_fuse.m
80 lines (66 loc) · 2.04 KB
/
rp_sr_fuse.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
function Y = rp_sr_fuse(M1, M2, zt, ap, mp, D,overlap,epsilon)
% RP-SR
% Input:
% M1 - input image A
% M2 - input image B
% zt - maximum decomposition level
% ap - coefficient selection highpass (see selc.m)
% mp - coefficient selection base image (see selb.m)
% D - Dictionary for sparse representation
% overlap - the overlapped pixels between two neighbor patches
% epsilon - sparse reconstuction error
% Output:
% Y - fused image
%
% The code is edited by Yu Liu, 01-09-2014.
% check inputs
[z1 s1] = size(M1);
[z2 s2] = size(M2);
if (z1 ~= z2) | (s1 ~= s2)
error('Input images are not of same size');
end;
% define filter
w = [1 4 6 4 1] / 16;
% define eps
eps = 1e-6;
% cells for selected images
E = cell(1,zt);
% loop over decomposition depth -> analysis
for i1 = 1:zt
% calculate and store actual image size
[z s] = size(M1);
zl(i1) = z; sl(i1) = s;
% check if image expansion necessary
if (floor(z/2) ~= z/2), ew(1) = 1; else, ew(1) = 0; end;
if (floor(s/2) ~= s/2), ew(2) = 1; else, ew(2) = 0; end;
% perform expansion if necessary
if (any(ew))
M1 = adb(M1,ew);
M2 = adb(M2,ew);
end;
% perform filtering
G1 = conv2(conv2(es2(M1,2), w, 'valid'),w', 'valid');
G2 = conv2(conv2(es2(M2,2), w, 'valid'),w', 'valid');
% decimate, undecimate and interpolate
M1T = conv2(conv2(es2(undec2(dec2(G1)), 2), 2*w, 'valid'),2*w', 'valid');
M2T = conv2(conv2(es2(undec2(dec2(G2)), 2), 2*w, 'valid'),2*w', 'valid');
% select coefficients and store them
E(i1) = {selc(M1./(M1T+eps), M2./(M2T+eps), ap)};
% decimate
M1 = dec2(G1);
M2 = dec2(G2);
end;
% select base coefficients of last decompostion stage
%M1 = selb(M1,M2,mp);
M1=sparse_fusion(M1,M2,D,overlap,epsilon);
% loop over decomposition depth -> synthesis
for i1 = zt:-1:1
% undecimate and interpolate
M1T = conv2(conv2(es2(undec2(M1), 2), 2*w, 'valid'), 2*w', 'valid');
% add coefficients
M1 = (M1T+eps) .* E{i1};
% select valid image region
M1 = M1(1:zl(i1),1:sl(i1));
end;
% copy image
Y = M1;