-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfusion_using_wt.m
More file actions
168 lines (157 loc) · 5.93 KB
/
Copy pathfusion_using_wt.m
File metadata and controls
168 lines (157 loc) · 5.93 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
function [fig,bdm] = fusion_using_wt(fig_origin1,fig_origin2,wname,rule,iter,iterations)
% -------------------------------------------------------------------------
% This function implements image fusion algorithm using wavelet transform.
% Inputs:
% fig_origin1: first image of an image fusion pair.
% fig_origin1: second image of an image fusion pair.
% wname: wavelet name.
% rule: rules of fusion; 'max' or 'modified'(modified feature selection alg
% orithm).
% iter: wavelet decomposition level.
% iterations: consistency verification level.
% Outputs:
% fig: fusioned image.
% bdm: binary decision map.
% -------------------------------------------------------------------------
%% format transform
fig_origin1 = im2double(fig_origin1);
fig_origin2 = im2double(fig_origin2);
%% wavelet transform
fig1 = fig_origin1;
fig2 = fig_origin2;
% set the wavelet type to haar
[row, col] = size(fig1);
% l = length;
% w = width;
[c1,s] = wavedec2(fig1,iter,wname);
[c2,~] = wavedec2(fig2,iter,wname);
%% fusion process
%% maximum selection rule
if strcmp(rule,'max')
len = length(c1);
coef_fusion = zeros(1,len);
coef_fusion(1:s(1,1)*s(1,2)) = (c1(1:s(1,1)*s(1,2))+c2(1:s(1,1)*s(1,2)))/2;
mm1 = c1(s(1,1)*s(1,2)+1:len);
mm2 = c2(s(1,1)*s(1,2)+1:len);
id = abs(mm1)>abs(mm2);
mm = (mm1.*id)+(~id.*mm2);
coef_fusion(s(1,1)*s(1,2)+1:len)=mm;
bdm = [];
elseif strcmp(rule,'modified')
%% modified feature selection algorithm
fig1 = appcoef2(c1,s,wname,iter);
fig2 = appcoef2(c2,s,wname,iter);
wd_size = 3; % specify the window size
fig = (fig1+fig2)/2;
if strcmp(wname,'haar')
bdm = 0.5*ones(size(fig));
for i = iter:-1:1
[H1,V1,D1] = detcoef2('all',c1,s,i);
[H2,V2,D2] = detcoef2('all',c2,s,i);
H1_pd = padarray(H1,[(wd_size-1)/2,(wd_size-1)/2]);%padding
H2_pd = padarray(H2,[(wd_size-1)/2,(wd_size-1)/2]);
V1_pd = padarray(V1,[(wd_size-1)/2,(wd_size-1)/2]);%padding
V2_pd = padarray(V2,[(wd_size-1)/2,(wd_size-1)/2]);
D1_pd = padarray(D1,[(wd_size-1)/2,(wd_size-1)/2]);%padding
D2_pd = padarray(D2,[(wd_size-1)/2,(wd_size-1)/2]);
H1_pd = abs(H1_pd);H2_pd = abs(H2_pd);
V1_pd = abs(V1_pd);V2_pd = abs(V2_pd);
D1_pd = abs(D1_pd);D2_pd = abs(D2_pd);
H1_pd = dlarray(H1_pd);H2_pd = dlarray(H2_pd);
V1_pd = dlarray(V1_pd);V2_pd = dlarray(V2_pd);
D1_pd = dlarray(D1_pd);D2_pd = dlarray(D2_pd);
H1_mp = maxpool(H1_pd,wd_size,'Stride',1,'DataFormat','SSCB');%maxpooling
H2_mp = maxpool(H2_pd,wd_size,'Stride',1,'DataFormat','SSCB');
V1_mp = maxpool(V1_pd,wd_size,'Stride',1,'DataFormat','SSCB');%maxpooling
V2_mp = maxpool(V2_pd,wd_size,'Stride',1,'DataFormat','SSCB');
D1_mp = maxpool(D1_pd,wd_size,'Stride',1,'DataFormat','SSCB');%maxpooling
D2_mp = maxpool(D2_pd,wd_size,'Stride',1,'DataFormat','SSCB');
H1_mp = extractdata(H1_mp);H2_mp = extractdata(H2_mp);
V1_mp = extractdata(V1_mp);V2_mp = extractdata(V2_mp);
D1_mp = extractdata(D1_mp);D2_mp = extractdata(D2_mp);
bdmH = H1_mp>H2_mp; % binary decision map(1 for fig1,0 for fig2)
bdmV = V1_mp>V2_mp;
bdmD = D1_mp>D2_mp;
% consisteny verification
% convo = [1,1,1;1,0,1;1,1,1];
% bdm_f = zeros(size(bdm));
% bdm_m = ones(size(bdm));%initial
% while ~min(min(bdm_f == bdm_m))
i = iterations;
while i
% bdm_m = bdm;
% mid = conv2(bdm,convo,'same');
% bdm = mid>4;
% bdm_f = bdm; % final binary decision map
bdmH = bwmorph(bdmH,'majority');
bdmV = bwmorph(bdmV,'majority');
bdmD = bwmorph(bdmD,'majority');
i = i-1;
end
H = bdmH.*H1;
H = H+~bdmH.*H2;
V = bdmV.*V1;
V = V+~bdmV.*V2;
D = bdmD.*D1;
D = D+~bdmD.*D2;
fig = [fig,H;V,D];
bdm = [bdm,bdmH;bdmV,bdmD];
end
coef_fusion = [];
coef_fusion(1:(row/2^iter)*(col/2^iter)) = reshape(fig(1:row/2^iter,1:col/2^iter),1,[]);
for i = iter:-1:1
V = reshape(fig(row/2^i+1:row/(2^(i-1)),1:col/(2^i)),1,[]);
H = reshape(fig(1:row/(2^i),col/2^i+1:col/(2^(i-1))),1,[]);
D = reshape(fig(row/2^i+1:row/(2^(i-1)),col/2^i+1:col/(2^(i-1))),1,[]);
coef_fusion = [coef_fusion,H,V,D];
end
else
fig = reshape(fig,1,[]);
for i = iter:-1:1
[H1,V1,D1] = detcoef2('all',c1,s,i);
[H2,V2,D2] = detcoef2('all',c2,s,i);
H1_pd = padarray(H1,[(wd_size-1)/2,(wd_size-1)/2]);%padding
H2_pd = padarray(H2,[(wd_size-1)/2,(wd_size-1)/2]);
V1_pd = padarray(V1,[(wd_size-1)/2,(wd_size-1)/2]);%padding
V2_pd = padarray(V2,[(wd_size-1)/2,(wd_size-1)/2]);
D1_pd = padarray(D1,[(wd_size-1)/2,(wd_size-1)/2]);%padding
D2_pd = padarray(D2,[(wd_size-1)/2,(wd_size-1)/2]);
H1_pd = abs(H1_pd);H2_pd = abs(H2_pd);
V1_pd = abs(V1_pd);V2_pd = abs(V2_pd);
D1_pd = abs(D1_pd);D2_pd = abs(D2_pd);
H1_pd = dlarray(H1_pd);H2_pd = dlarray(H2_pd);
V1_pd = dlarray(V1_pd);V2_pd = dlarray(V2_pd);
D1_pd = dlarray(D1_pd);D2_pd = dlarray(D2_pd);
H1_mp = maxpool(H1_pd,wd_size,'Stride',1,'DataFormat','SSCB');%maxpooling
H2_mp = maxpool(H2_pd,wd_size,'Stride',1,'DataFormat','SSCB');
V1_mp = maxpool(V1_pd,wd_size,'Stride',1,'DataFormat','SSCB');%maxpooling
V2_mp = maxpool(V2_pd,wd_size,'Stride',1,'DataFormat','SSCB');
D1_mp = maxpool(D1_pd,wd_size,'Stride',1,'DataFormat','SSCB');%maxpooling
D2_mp = maxpool(D2_pd,wd_size,'Stride',1,'DataFormat','SSCB');
H1_mp = extractdata(H1_mp);H2_mp = extractdata(H2_mp);
V1_mp = extractdata(V1_mp);V2_mp = extractdata(V2_mp);
D1_mp = extractdata(D1_mp);D2_mp = extractdata(D2_mp);
bdmH = H1_mp>H2_mp; % binary decision map(1 for fig1,0 for fig2)
bdmV = V1_mp>V2_mp;
bdmD = D1_mp>D2_mp;
i = iterations;
while i
bdmH = bwmorph(bdmH,'majority');
bdmV = bwmorph(bdmV,'majority');
bdmD = bwmorph(bdmD,'majority');
i = i-1;
end
H = bdmH.*H1;
H = H+~bdmH.*H2;
V = bdmV.*V1;
V = V+~bdmV.*V2;
D = bdmD.*D1;
D = D+~bdmD.*D2;
fig = [fig,reshape(H,1,[]),reshape(V,1,[]),reshape(D,1,[])];
end
coef_fusion = fig;
bdm = [];
end
end
%% inverse wavelet transform
fig = waverec2(coef_fusion,s,wname);