-
Notifications
You must be signed in to change notification settings - Fork 1
/
slicerCollage.m
141 lines (128 loc) · 4.41 KB
/
slicerCollage.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
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
function slicerCollage(varargin)
%SLICERCOLLAGE Combine multiple slicer's images into a single image.
% SLICERCOLLAGE() searches into the current folder for any slicer's image
% and concatenate them along the longest dimension. To be concatenated
% images must have the same number of pixels in the dimension used for
% concatenation. The collage is saved in the current folder as
% "slicerCollage.png" (a mat file with slicer info is saved as well).
%
% The default behaviour can be modified using the following parameters
% (each parameter must be followed by its value ie, 'param1',value1,
% 'param2',value2):
%
% dim - Select the dimension along which to concatenate the
% images. Default: the longest dimension.
% order - Vector of integers indicating the concatenation order.
% Default: 1:N, where N is the number of images.
% output - Output name. Default: 'slicerCollage'.
% folder - The path (relative or absolute) of the folder
% containing slicer images. Default: './' (i.e., the
% current folder).
% wildcard - Char expression for matching slicer images (e.g.,:
% 'slicer_BOLD*.png'). Default: 'slicer_*.png'.
% show - Show combined image. Default: true.
%
% See also SLICER, COLORMAPS
%__________________________________________________________________________
% Daniele Mascali
% ITAB, UDA, Chieti - 2021
% danielemascali@gmail.com
%--------------VARARGIN----------------------------------------------------
params = {'order','dim', 'output','show','folder','wildcard'};
defParms = { [], [],'slicerCollage', 1, './','slicer_*.png'};
legalValues{1} = [];
legalValues{2} = [1,2];
legalValues{3} = [];
legalValues{4} = [0,1];
legalValues{5} = [];
legalValues{6} = [];
[order,dim,output,show,folder,...,
wildcard] = ParseVarargin(params,defParms,legalValues,varargin,1);
%--------------------------------------------------------------------------
%get function name
funcName = mfilename;
fprintf('%s - welcome\n',funcName);
%get list of slicer images
if folder(end) ~= '/'; folder(end+1) = '/'; end
%check if extension is present, otherwise add it:
if ~strcmpi(wildcard(end-3:end),'.png')
wildcard = [wildcard,'.png'];
end
pattern = [folder,wildcard];
fprintf('%s - looking for images using the pattern:\n',funcName);
fprintf('-> %s\n',pattern);
list = dir(pattern);
nImg = length(list);
if isempty(list)
disp('No slicer png found.');
return
elseif nImg == 1
disp('Only one image was found, not enough to create a collage.');
return
end
if isempty(order)
order = 1:nImg;
end
if max(order) > nImg
error('Values in "order" exceed the number of images.');
end
if isempty(dim)
img = imread([folder,list(order(1)).name]);
s1 = size(img); [~,dim] = min(s1(1:2));
end
switch dim
% notDim is the dimension that has to have the same number of pixels across
% images
case 1; notDim = 2;
case 2; notDim = 1;
end
fprintf('%s - dime = %d\n',funcName,dim);
fprintf(['%s - order = ',repmat('%d ', 1, length(order)),'\n'],funcName,order);
fprintf('%s - concatenating images:\n',funcName);
% determine the minimum size across images.
count = 1;
img = cell(length(order),1);
sizeImg = nan(length(order),2);
MAT = [];
for l = order
img{count} = imread([folder,list(l).name]);
if exist([folder,list(l).name(1:end-3),'mat'],'file')
MAT = [MAT;load([folder,list(l).name(1:end-3),'mat'])];
end
s = size(img{count});
sizeImg(count,:) = [s(1) s(2)];
count = count +1;
end
commonSize = min(sizeImg);
IMG = [];
count = 1;
for l = order
fprintf('-> %d(%d) %s\n',count,l,list(l).name);
if l > 1 %check size consistency
if size(img{count},notDim)~= s1(notDim)
if abs(size(img{count},notDim) - s1(notDim)) > 3
error('Images must have equal size.');
end
end
end
switch dim
case 2; IMG = cat(dim,IMG,img{count}(1:commonSize(1),1:end,:));
case 1; IMG = cat(dim,IMG,img{count}(1:end,1:commonSize(2),:));
end
count = count +1;
end
imwrite(IMG,[output,'.png']);
%save also opt if present
if ~isempty(MAT)
opt = {MAT.opt};
save([output,'.mat'],'opt');
end
if show
figure('Name','SlicerCollage','MenuBar', 'None');
warning off
imshow(IMG,'border','tight');
warning on
end
fprintf('%s - end\n',funcName);
return
end