source: aedes_createmosaic.m @ 162

Last change on this file since 162 was 160, checked in by tjniskan, 8 years ago
  • Detached the code for creating mosaic images from aedes_export_gui.m to aedes_createmosaic.m

A aedes_createmosaic.m
M aedes_export_gui.m
M aedes_revision.m

File size: 14.2 KB
Line 
1function aedes_createmosaic(DATA,ROI,overlay,varargin)
2% AEDES_CREATEMOSAIC - Create a figure containing mosaic of MR images
3%
4%
5% Synopsis:
6%
7% Description:
8%
9% Examples:
10%
11% See also:
12%       AEDES, AEDES_EXPORT_GUI
13
14% This function is a part of Aedes - A graphical tool for analyzing
15% medical images
16%
17% Copyright (C) 2006 Juha-Pekka Niskanen <Juha-Pekka.Niskanen@uku.fi>
18%
19% Department of Physics, Department of Neurobiology
20% University of Kuopio, FINLAND
21%
22% This program may be used under the terms of the GNU General Public
23% License version 2.0 as published by the Free Software Foundation
24% and appearing in the file LICENSE.TXT included in the packaging of
25% this program.
26%
27% This program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28% WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29
30% Defaults
31sliceDir = 1; % X-direction
32roi_ind = 1:length(ROI);
33drawSliceNbr = false;
34drawColorbar = true;
35drawFileName = false;
36drawOverlay = true;
37drawRois = true;
38colmap = gray(256);
39sliceInd = [];
40rows = [];
41cols = [];
42Clim_in = [];
43roiTransp = 1;
44showRoiEdges = false;
45Dat.currentVol = 1;
46
47% Go through varargin
48for ii=1:2:length(varargin)
49        switch lower(varargin{ii})
50                case 'slicedir'
51                        sliceDir = varargin{ii+1};
52                case 'drawslicenbr'
53                        drawSliceNbr = varargin{ii+1};
54                case 'drawrois'
55                        drawRois = varargin{ii+1};
56                case 'drawoverlay'
57                        drawOverlay = varargin{ii+1};
58                case 'drawcolorbar'
59                        drawColorbar = varargin{ii+1};
60                case 'drawfilename'
61                        drawFileName = varargin{ii+1};
62                case 'roiind'
63                        roi_ind = varargin{ii+1};
64                case 'colormap'
65                        colmap = varargin{ii+1};
66                case 'cols'
67                        cols = varargin{ii+1};
68                case 'rows'
69                        rows = varargin{ii+1};
70                case 'sliceind'
71                        sliceInd = varargin{ii+1};
72                case 'vol'
73                        Dat.currentVol = varargin{ii+1};
74                case 'clim'
75                        Clim_in = varargin{ii+1};
76                case 'roitransp'
77                        roiTransp = varargin{ii+1};
78                case 'showRoiEdges'
79                        showRoiEdges = varargin{ii+1};
80        end
81end
82
83if isempty(ROI)
84        drawRois = false;
85        roi_ind = [];
86end
87
88if nargin < 3 || isempty(overlay)
89        drawOverlay = false;
90end
91
92if ~iscell(DATA)
93        DATA = {DATA};
94end
95
96if length(DATA)>1
97        Dat.isDataMixed = true;
98else
99        Dat.isDataMixed = false;
100end
101
102% Store data sizes in all directions
103if Dat.isDataMixed
104  Dat.XSize = length(DATA);
105  Dat.YSize = 0;
106  Dat.ZSize = 0;
107else
108  Dat.XSize = size(DATA{1}.FTDATA,3);
109  Dat.YSize = size(DATA{1}.FTDATA,1);
110  Dat.ZSize = size(DATA{1}.FTDATA,2);
111  Dat.VSize = size(DATA{1}.FTDATA,4);
112end
113
114if isempty(sliceInd)
115        if sliceDir==1
116                Dat.SliceInd = 1:Dat.XSize;
117        elseif sliceDir==2
118                Dat.SliceInd = 1:Dat.YSize;
119        else
120                Dat.SliceInd = 1:Dat.ZSize;
121        end
122else
123        Dat.SliceInd = sliceInd;
124end
125
126if isempty(rows) && isempty(cols)
127        rows = floor(sqrt(length(Dat.SliceInd)));
128        cols = ceil(length(Dat.SliceInd)/rows);
129elseif isempty(rows)
130        rows = ceil(length(Dat.SliceInd)/cols);
131elseif isempty(cols)
132        cols = ceil(length(Dat.SliceInd)/rows);
133end
134
135% Estimate space for the mosaic
136if Dat.isDataMixed
137        data_sz=size(DATA{Dat.SliceInd(1)}.FTDATA);
138else
139        if sliceDir==1
140                data_sz=size(DATA{1}.FTDATA(:,:,Dat.SliceInd(1),Dat.currentVol));
141        elseif sliceDir==2
142                data_sz=size(squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(1),:,Dat.currentVol)));
143        else
144                data_sz=size(squeeze(DATA{1}.FTDATA(Dat.SliceInd(1),:,:,Dat.currentVol)));
145        end
146end
147
148% Determine figure size
149scrsz = get(0,'screensize'); % Get current display resolution
150scrsz(4) = scrsz(4)-45-70; % The 47px is for taskbar,
151scrsz(3) = scrsz(3)-16;
152gap=3;
153fig_w = cols*data_sz(2)+(cols+1)*gap;
154fig_h = rows*data_sz(1)+(rows+1)*gap;
155
156if fig_w>scrsz(3) || fig_h>scrsz(4)
157       
158        aratio_w=[fig_w fig_h]./fig_w;
159        aratio_h=[fig_w fig_h]./fig_h;
160        for ii=1:2
161                if fig_w>scrsz(3)
162                        tmp=aratio_w*scrsz(3);
163                        fig_w = tmp(1);
164                        fig_h = tmp(2);
165                elseif fig_h>scrsz(4)
166                        tmp=aratio_h*scrsz(4);
167                        fig_w = tmp(1);
168                        fig_h = tmp(2);
169                end
170        end
171end
172
173%% Determine paper orientation
174if fig_w>fig_h
175        paperorient = 'landscape';
176       
177        %% Determine paperposition
178        papersize = [29.7 21.0];
179        tmp=[fig_w,fig_h]./fig_h;
180        pap_h = tmp(2)*(papersize(2)-2);
181        pap_w = tmp(1)*(papersize(2)-2);
182        if pap_w>(papersize(1)-2)
183                pap_h=((papersize(1)-2)/pap_w)*pap_h;
184                pap_w = papersize(1)-2;
185        end
186        paperpos = [papersize(1)/2-pap_w/2 ...
187                papersize(2)/2-pap_h/2 ...
188                pap_w ...
189                pap_h];
190else
191        paperorient = 'portrait';
192       
193        %% Determine paperposition
194        papersize = [21.0 29.7];
195        tmp=[fig_w,fig_h]./fig_w;
196        pap_h = tmp(2)*(papersize(1)-2);
197        pap_w = tmp(1)*(papersize(1)-2);
198        if pap_h>(papersize(2)-2)
199                pap_w=((papersize(2)-2)/pap_h)*pap_w;
200                pap_h = papersize(2)-2;
201        end
202        paperpos = [papersize(1)/2-pap_w/2 ...
203                papersize(2)/2-pap_h/2 ...
204                pap_w ...
205                pap_h];
206end
207
208
209%% Show wait dialog
210[wait_h,txh]=aedes_calc_wait('Creating mosaic from slices...');
211
212% Draw the mosaic figure
213fh = figure('position',[scrsz(3)/2-fig_w/2+4 ...
214        scrsz(4)/2-fig_h/2+45 fig_w fig_h],...
215        'visible','on',...
216        'inverthardcopy','off',...
217        'renderer','opengl',...%'painters',...
218        'numbertitle','off',...
219        'name','Mosaic View',...
220        'colormap',colmap,...
221        'color','w',...
222        'papertype','a4',...
223        'paperpositionmode','manual',...
224        'paperorientation',paperorient,...
225        'paperunits','centimeters',...
226        'paperposition',paperpos);
227set(fh,'paperunits','inches')
228if ( roiTransp==0 | not(drawRois)) && not(drawOverlay)
229        set(fh,'renderer','painters');
230end
231
232% Set resolution information in the figure
233if ispref('Aedes','ExportMosaicImageResolution')
234        default_resolution = getpref('Aedes','ExportMosaicImageResolution');
235else
236        default_resolution = 300;
237end
238setappdata(fh,'Exportsetup',struct('Resolution',default_resolution))
239
240%% Set header text
241if ~Dat.isDataMixed
242        hs = getappdata(fh,'PrintHeaderHeaderSpec');
243        if isempty(hs)
244                hs = struct('dateformat','none',...
245                        'string',[date,',  ',...
246                        strrep(strrep(DATA{1}.HDR.fpath,'\','\\'),'_','\_'),...
247                        strrep(strrep(DATA{1}.HDR.fname,'\','\\'),'_','\_')],...
248                        'fontname','Times',...
249                        'fontsize',12,...          % in points
250                        'fontweight','normal',...
251                        'fontangle','normal',...
252                        'margin',15);            % in points
253        end
254        setappdata(fh,'PrintHeaderHeaderSpec',hs)
255end
256
257
258% Look for custom aspect ratio
259if ispref('Aedes','ExportMosaicUseCustomAspectRatio')
260        data_aspectratio = getpref('Aedes','ExportMosaicUseCustomAspectRatio');
261else
262        data_aspectratio = [1 1 1];
263end
264
265%% images and axes
266count=1;
267gap_w=gap/fig_w;
268gap_h=gap/fig_h;
269for ii=1:rows
270        for kk=1:cols
271                ax=axes('parent',fh,...
272                        'units','normal',...
273                        'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
274                        (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
275                        (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
276                        'visible','off',...
277                        'ydir','reverse',...
278                        'xtick',[],...
279                        'ytick',[],...
280                        'xticklabel',[],...
281                        'yticklabel',[],...
282                        'DataAspectRatio',data_aspectratio,...
283                        'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
284                        'PlotBoxAspectRatioMode','manual');
285                if strcmpi(get(fh,'renderer'),'opengl')
286                        roi_ax = axes('parent',fh,...
287                                'units','normal',...
288                                'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
289                                (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
290                                (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
291                                'visible','off',...
292                                'ydir','reverse',...
293                                'xtick',[],...
294                                'ytick',[],...
295                                'xticklabel',[],...
296                                'yticklabel',[],...
297                                'DataAspectRatio',data_aspectratio,...
298                                'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
299                                'PlotBoxAspectRatioMode','manual');
300                        overlay_ax = axes('parent',fh,...
301                                'units','normal',...
302                                'position',[(kk-1)*((1-(cols+1)*gap_w)/cols)+kk*gap_w ...
303                                (rows-ii)*((1-(rows+1)*gap_h)/rows)+(rows+1-ii)*gap_h ...
304                                (1-(cols+1)*gap_w)/cols (1-(rows+1)*gap_h)/rows],...
305                                'visible','off',...
306                                'ydir','reverse',...
307                                'xtick',[],...
308                                'ytick',[],...
309                                'xticklabel',[],...
310                                'yticklabel',[],...
311                                'DataAspectRatio',data_aspectratio,...
312                                'PlotBoxAspectRatio',[data_sz(2) data_sz(1) 1],...
313                                'PlotBoxAspectRatioMode','manual');
314                end
315                if count<=length(Dat.SliceInd)
316                       
317                        if Dat.isDataMixed
318                                imdata=DATA{Dat.SliceInd(count)}.FTDATA;
319                        else
320                                if sliceDir==1
321                                        imdata=DATA{1}.FTDATA(:,:,Dat.SliceInd(count),Dat.currentVol);
322                                        if drawOverlay
323                                                if overlay.isOverlayRGB
324                                                        overlay_data = squeeze(overlay.ImageOverlay(:,:,Dat.SliceInd(count),:));
325                                                else
326                                                        overlay_data = overlay.ImageOverlay(:,:,Dat.SliceInd(count),Dat.currentVol);
327                                                end
328                                        end
329                                elseif sliceDir==2
330                                        imdata=squeeze(DATA{1}.FTDATA(:,Dat.SliceInd(count),:,Dat.currentVol));
331                                        if drawOverlay
332                                                if overlay.isOverlayRGB
333                                                        overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(count),:,:));
334                                                else
335                                                        overlay_data = squeeze(overlay.ImageOverlay(:,Dat.SliceInd(count),:,Dat.currentVol));
336                                                end
337                                        end
338                                else
339                                        imdata=squeeze(DATA{1}.FTDATA(Dat.SliceInd(count),:,:,Dat.currentVol));
340                                        if drawOverlay
341                                                if overlay.isOverlayRGB
342                                                        overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(count),:,:,:));
343                                                else
344                                                        overlay_data = squeeze(overlay.ImageOverlay(Dat.SliceInd(count),:,:,Dat.currentVol));
345                                                end
346                                        end
347                                end
348                        end
349                       
350                       
351                       
352                        %% Plot image
353                        h=image('parent',ax,...
354                                'cdata',imdata,...
355                                'cdatamapping','scaled');
356                       
357                        % Plot overlay
358                        if drawOverlay
359                                if ~overlay.isOverlayRGB
360                                        ov_cmap = overlay.ImageOverlayCmap;
361                                        ov_clim = round(((overlay.ImageOverlayClim-overlay.ImOverlayMin)*256)./...
362                                                (overlay.ImOverlayMax-overlay.ImOverlayMin));
363                                        if ov_clim(1)==ov_clim(2)
364                                                if ov_clim(1)==0
365                                                        ov_clim(2)=1;
366                                                elseif ov_clim(1)==256
367                                                        ov_clim(1)=255;
368                                                end
369                                        end
370                                        ov_thold = round(((overlay.ImageOverlayThold-overlay.ImOverlayMin)*256)/...
371                                                (overlay.ImOverlayMax-overlay.ImOverlayMin));
372                                end
373                                ov_alpha_val = overlay.ImageOverlayAlpha;
374                               
375                                if ~overlay.isOverlayRGB
376                                        % Convert indexed image to RGB image
377                                        %slice1_ind=overlay.ImageOverlay(:,:,Dat.Slices(1),Dat.CurrentVol);
378                                        overlay_ind=double(overlay_data);
379                                       
380                                        % Get thresholded alpha indices
381                                        if overlay.ImageOverlayTholdDirPos==1
382                                                overlay_alpha_th = overlay_ind<ov_thold;
383                                        else
384                                                overlay_alpha_th = overlay_ind>ov_thold;
385                                        end
386                                       
387                                        % Get clim alpha indices
388                                        overlay_alpha_clim = ( overlay_ind>=ov_clim(1) & overlay_ind<=ov_clim(2) );
389                                       
390                                        overlay_ind(overlay_ind<ov_clim(1))=ov_clim(1);
391                                        overlay_ind(overlay_ind>ov_clim(2))=ov_clim(2);
392                                       
393                                        overlay_ind=ceil((overlay_ind-ov_clim(1))./diff(ov_clim)*255+1);
394                                       
395                                        sz = size(overlay_ind);
396                                        overlay_im = zeros([sz(1) sz(2) 3],'single');
397                                        overlay_im(:,:,1)= reshape(ov_cmap(overlay_ind,1),sz);
398                                        overlay_im(:,:,2)= reshape(ov_cmap(overlay_ind,2),sz);
399                                        overlay_im(:,:,3)= reshape(ov_cmap(overlay_ind,3),sz);
400                                else
401                                        overlay_im = overlay_data;
402                                end
403                               
404                                overlay_alpha = zeros(size(overlay_ind));
405                                overlay_alpha(overlay_alpha_clim) = ov_alpha_val;
406                                overlay_alpha(overlay_alpha_th) = 0;
407                               
408                                h=image('parent',overlay_ax,...
409                                        'cdata',overlay_im,...
410                                        'cdatamapping','scaled',...
411                                        'AlphaDataMapping','none',...
412                                        'AlphaData',overlay_alpha,...
413                                        'visible','on');
414                               
415                        end
416                       
417                        %% Check Clim
418                        if isempty(Clim_in)
419                                clim = [min(min(imdata)) max(max(imdata))];
420                                set(ax,'clim',clim)
421                        elseif size(Clim_in,1)>1
422                                set(ax,'clim',Clim_in(Dat.SliceInd(count),:))
423                        else
424                                clim = Clim_in;
425                                set(ax,'clim',clim)
426                        end
427                       
428                        % Draw ROIs
429                        if drawRois
430                                for tt=1:length(roi_ind)
431                                        if Dat.isDataMixed
432                                                roidata = ROI(roi_ind(tt)).voxels{Dat.SliceInd(count)};
433                                        else
434                                                if sliceDir==1
435                                                        roidata = ROI(roi_ind(tt)).voxels{1}(:,:,Dat.SliceInd(count),Dat.currentVol);
436                                                elseif sliceDir==2
437                                                        roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(:,Dat.SliceInd(count),:,Dat.currentVol));
438                                                else
439                                                        roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(Dat.SliceInd(count),:,:,Dat.currentVol));
440                                                end
441                                                if isempty(find(roidata))
442                                                        continue;
443                                                end
444                                        end
445                                       
446                                        if strcmpi(get(fh,'renderer'),'opengl')
447                                                roidata=uint8(roidata);
448                                                cdata = zeros([size(roidata) 3],'uint8');
449                                                if ROI(roi_ind(tt)).color(1)~=0
450                                                        cdata(:,:,1) = roidata*ROI(roi_ind(tt)).color(1);
451                                                end
452                                                if ROI(roi_ind(tt)).color(2)~=0
453                                                        cdata(:,:,2) = roidata*ROI(roi_ind(tt)).color(2);
454                                                end
455                                                if ROI(roi_ind(tt)).color(3)~=0
456                                                        cdata(:,:,3) = roidata*ROI(roi_ind(tt)).color(3);
457                                                end
458                                                alphadata=double(roidata)*roiTransp;
459                                               
460                                                h=image('parent',roi_ax,'cdata',cdata,...
461                                                        'AlphaDataMapping','none',...
462                                                        'cdatamapping','scaled',...
463                                                        'AlphaData',alphadata,...
464                                                        'visible','on');
465                                        end
466                                       
467                                        if showRoiEdges
468                                                B=bwboundaries(roidata,4,'holes');
469                                                for jj=1:length(B)
470                                                        boundary = B{jj};
471                                                        line('parent',ax,...
472                                                                'xdata',boundary(:,2),'ydata',boundary(:,1),...
473                                                                'color',ROI(roi_ind(tt)).color./255,...
474                                                                'tag','roiedge',...
475                                                                'linewidth',0.5,...
476                                                                'linestyle','-',...
477                                                                'hittest','off');
478                                                end % for jj=1:length(B)
479                                        end
480                                end % for tt=1:length(roi_ind)
481                        end % if drawRois
482                       
483                        % Draw slice number and filename
484                        if drawSliceNbr || drawFileName
485                                if (rows*cols)<=50
486                                        fontsz=8;
487                                elseif (rows*cols)>50 & (rows*cols)<100
488                                        fontsz=7;
489                                else
490                                        fontsz=6;
491                                end
492                                if drawSliceNbr && drawFileName
493                                        if Dat.isDataMixed
494                                                fname = DATA{Dat.SliceInd(count)}.HDR.fname;
495                                                fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
496                                        else
497                                                fname=DATA{1}.HDR.fname;
498                                                fpath = DATA{1}.HDR.fpath;
499                                        end
500                                        if strcmp(fname,'fid')
501                                                [fp,fn,fe]=fileparts(fpath(1:end-1));
502                                                fname = [fn,fe];
503                                        end
504                                        slicetxt = sprintf('%03d: %s',Dat.SliceInd(count),fname);
505                                elseif drawFileName
506                                        if Dat.isDataMixed
507                                                fname = DATA{Dat.SliceInd(count)}.HDR.fname;
508                                                fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
509                                        else
510                                                fname=DATA{1}.HDR.fname;
511                                                fpath = DATA{1}.HDR.fpath;
512                                        end
513                                        if strcmp(fname,'fid')
514                                                [fp,fn,fe]=fileparts(fpath(1:end-1));
515                                                fname = [fn,fe];
516                                        end
517                                        slicetxt = fname;
518                                elseif drawSliceNbr
519                                        slicetxt = sprintf('%03d',Dat.SliceInd(count));
520                                end
521                                tx_slice=text('parent',ax,...
522                                        'units','normal',...
523                                        'position',[0.01 0.99],...
524                                        'verticalalign','top',...
525                                        'horizontalalign','left',...
526                                        'interpreter','none',...
527                                        'string',slicetxt,...
528                                        'backgroundcolor','w',...
529                                        'clipping','off',...
530                                        'fontsize',fontsz);
531                        end
532                       
533                        count=count+1;
534                end % if count<=length(Dat.
535        end % for kk=1:cols
536end % for ii=1:rows
537
538
539delete(wait_h)
Note: See TracBrowser for help on using the repository browser.

Powered by Trac 1.0.9.Copyright © Juha-Pekka Niskanen 2008