source: aedes_createmosaic.m

Last change on this file was 213, checked in by tjniskan, 2 years ago
  • Fixed Aedes for Handle Graphics version 2 (HG2).

M aedes.m
M aedes_createmosaic.m
M aedes_export_gui.m
M aedes_gui_defaults.m
M aedes_headerbrowser.m
M aedes_helpabout.m
M aedes_inputdlg.m
M aedes_juigetfiles.m
M aedes_readfidprefs.m
M aedes_resviewer.m
M aedes_revision.m

File size: 14.3 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                        axis(ax,'image')
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                                       
401                                        overlay_alpha = zeros(size(overlay_ind));
402                                        overlay_alpha(overlay_alpha_clim) = ov_alpha_val;
403                                        overlay_alpha(overlay_alpha_th) = 0;
404                                else
405                                        overlay_im = overlay_data;
406                                        overlay_alpha = ov_alpha_val;
407                                end
408                               
409                               
410                               
411                                h=image('parent',overlay_ax,...
412                                        'cdata',overlay_im,...
413                                        'cdatamapping','scaled',...
414                                        'AlphaDataMapping','none',...
415                                        'AlphaData',overlay_alpha,...
416                                        'visible','on');
417                               
418                        end
419                       
420                        %% Check Clim
421                        if isempty(Clim_in)
422                                clim = [min(min(imdata)) max(max(imdata))];
423                                set(ax,'clim',clim)
424                        elseif size(Clim_in,1)>1
425                                set(ax,'clim',Clim_in(Dat.SliceInd(count),:))
426                        else
427                                clim = Clim_in;
428                                set(ax,'clim',clim)
429                        end
430                       
431                        % Draw ROIs
432                        if drawRois
433                                for tt=1:length(roi_ind)
434                                        if Dat.isDataMixed
435                                                roidata = ROI(roi_ind(tt)).voxels{Dat.SliceInd(count)};
436                                        else
437                                                if sliceDir==1
438                                                        roidata = ROI(roi_ind(tt)).voxels{1}(:,:,Dat.SliceInd(count),Dat.currentVol);
439                                                elseif sliceDir==2
440                                                        roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(:,Dat.SliceInd(count),:,Dat.currentVol));
441                                                else
442                                                        roidata = squeeze(ROI(roi_ind(tt)).voxels{1}(Dat.SliceInd(count),:,:,Dat.currentVol));
443                                                end
444                                                if isempty(find(roidata))
445                                                        continue;
446                                                end
447                                        end
448                                       
449                                        if strcmpi(get(fh,'renderer'),'opengl')
450                                                roidata=uint8(roidata);
451                                                cdata = zeros([size(roidata) 3],'uint8');
452                                                if ROI(roi_ind(tt)).color(1)~=0
453                                                        cdata(:,:,1) = roidata*ROI(roi_ind(tt)).color(1);
454                                                end
455                                                if ROI(roi_ind(tt)).color(2)~=0
456                                                        cdata(:,:,2) = roidata*ROI(roi_ind(tt)).color(2);
457                                                end
458                                                if ROI(roi_ind(tt)).color(3)~=0
459                                                        cdata(:,:,3) = roidata*ROI(roi_ind(tt)).color(3);
460                                                end
461                                                alphadata=double(roidata)*roiTransp;
462                                               
463                                                h=image('parent',roi_ax,'cdata',cdata,...
464                                                        'AlphaDataMapping','none',...
465                                                        'cdatamapping','scaled',...
466                                                        'AlphaData',alphadata,...
467                                                        'visible','on');
468                                        end
469                                       
470                                        if showRoiEdges
471                                                B=bwboundaries(roidata,4,'holes');
472                                                for jj=1:length(B)
473                                                        boundary = B{jj};
474                                                        line('parent',ax,...
475                                                                'xdata',boundary(:,2),'ydata',boundary(:,1),...
476                                                                'color',ROI(roi_ind(tt)).color./255,...
477                                                                'tag','roiedge',...
478                                                                'linewidth',0.5,...
479                                                                'linestyle','-',...
480                                                                'hittest','off');
481                                                end % for jj=1:length(B)
482                                        end
483                                end % for tt=1:length(roi_ind)
484                        end % if drawRois
485                       
486                        % Draw slice number and filename
487                        if drawSliceNbr || drawFileName
488                                if (rows*cols)<=50
489                                        fontsz=8;
490                                elseif (rows*cols)>50 & (rows*cols)<100
491                                        fontsz=7;
492                                else
493                                        fontsz=6;
494                                end
495                                if drawSliceNbr && drawFileName
496                                        if Dat.isDataMixed
497                                                fname = DATA{Dat.SliceInd(count)}.HDR.fname;
498                                                fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
499                                        else
500                                                fname=DATA{1}.HDR.fname;
501                                                fpath = DATA{1}.HDR.fpath;
502                                        end
503                                        if strcmp(fname,'fid')
504                                                [fp,fn,fe]=fileparts(fpath(1:end-1));
505                                                fname = [fn,fe];
506                                        end
507                                        slicetxt = sprintf('%03d: %s',Dat.SliceInd(count),fname);
508                                elseif drawFileName
509                                        if Dat.isDataMixed
510                                                fname = DATA{Dat.SliceInd(count)}.HDR.fname;
511                                                fpath = DATA{Dat.SliceInd(count)}.HDR.fpath;
512                                        else
513                                                fname=DATA{1}.HDR.fname;
514                                                fpath = DATA{1}.HDR.fpath;
515                                        end
516                                        if strcmp(fname,'fid')
517                                                [fp,fn,fe]=fileparts(fpath(1:end-1));
518                                                fname = [fn,fe];
519                                        end
520                                        slicetxt = fname;
521                                elseif drawSliceNbr
522                                        slicetxt = sprintf('%03d',Dat.SliceInd(count));
523                                end
524                                tx_slice=text('parent',ax,...
525                                        'units','normal',...
526                                        'position',[0.01 0.99],...
527                                        'verticalalign','top',...
528                                        'horizontalalign','left',...
529                                        'interpreter','none',...
530                                        'string',slicetxt,...
531                                        'backgroundcolor','w',...
532                                        'clipping','off',...
533                                        'fontsize',fontsz);
534                        end
535                       
536                        count=count+1;
537                end % if count<=length(Dat.
538        end % for kk=1:cols
539end % for ii=1:rows
540
541
542delete(wait_h)
Note: See TracBrowser for help on using the repository browser.

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