imlook3d.m
上传用户:dasuixin
上传日期:2016-08-08
资源大小:66k
文件大小:39k
源码类别:

医药行业

开发平台:

Matlab

  1. function varargout = imlook3d(varargin)
  2. % IMLOOK3D M-file for imlook3d.fig
  3. %      IMLOOK3D, by itself, creates a new IMLOOK3D or raises the existing
  4. %      singleton*.
  5. %
  6. %      H = IMLOOK3D returns the handle to a new IMLOOK3D or the handle to
  7. %      the existing singleton*.
  8. %
  9. %      IMLOOK3D('CALLBACK',hObject,eventData,handles,...) calls the local
  10. %      function named CALLBACK in IMLOOK3D.M with the given input arguments.
  11. %
  12. %      IMLOOK3D('Property','Value',...) creates a new IMLOOK3D or raises the
  13. %      existing singleton*.  Starting from the left, property value pairs are
  14. %      applied to the GUI before imlook3d_OpeningFunction gets called.  An
  15. %      unrecognized property name or invalid value makes property application
  16. %      stop.  All inputs are passed to imlook3d_OpeningFcn via varargin.
  17. %
  18. %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
  19. %      instance to run (singleton)".
  20. %
  21. % EXAMPLE:
  22. %  Let us first load the mri image in Matlab using
  23. %  >load mri;
  24. %  and then run imlook3d
  25. %  >imlook3d(squeeze(D)); % squeeze removes singleton dimensions
  26. %
  27. % Descriptions of Menus
  28. % ImFile:
  29. % -READ FROM WORKSPACE: Reads or displays images existing in the 
  30. %  workspace(base).
  31. % -READ A STACK (DISK): Reads (displays)slices of images into a 3D array creating
  32. %  a 3D image. It reads them from the disk. A file browser pups up and 
  33. %  allows the user to pick up the first file in the series. It reads all
  34. %  the files in the directory that has similar names except a suffix 
  35. %  changing for each file. 
  36. %  For example: slice01.tif, slice01.tif,...,slice0N.tif 
  37. % -READ DICOM SERIES: 
  38. %  Reads/displays series of DICOM images into a 3D array. A file browser 
  39. %  pups up and allows users to select the first file in the series. 
  40. %  It reads all the files in the directory that has similar names 
  41. %  except a suffix changing for each file. 
  42. % -SAVE SLICE AS TIFF:
  43. %  Saves the current slice as a tiff image.
  44. % -SAVE INTO WORKSPACE: This saves displayed 3D image into workspace as
  45. %  a 3D variable. This may be useful to save the 3D image that is 
  46. %  read by "read a stack (disk)".
  47. %
  48. % ImTools:
  49. % -PIXVAL: Allows looking at pixel intensities.
  50. % -HISTOGRAM: Displays the histogram of the current image (slice).
  51. % -PROFILE: Allows plotting intensity profiles across the image in an
  52. %  interactive manner.
  53. % -ADJUST INTENSITY RANGE: Allows adjusting the intensity range for 
  54. %  the current slice. 
  55. % -GLOBAL INTENSITY WINDOWING:
  56. %  If not checked,not global, the intensity limits are set to [min(currentslice)
  57. %  max(currentslice)]
  58. %  
  59. % VIEW MENU:
  60. %  This pup-up menu allows users to change the view of the image 
  61. %  from transverse to sagittal or coronal views. It assumes that
  62. %  original image is in transverse mode. 
  63. %
  64. % Copyright(c) Omer Demirkaya
  65. % Last Modified by GUIDE v2.5 22-May-2007 21:27:00
  66. % Begin initialization code - DO NOT EDIT
  67. % This entire code or part of it could be modified and used if the due 
  68. % credit to the original author is given.
  69. %------------------------------------------------------------------
  70. gui_Singleton = 0;
  71. gui_State = struct('gui_Name',       mfilename, ...
  72.     'gui_Singleton',  gui_Singleton, ...
  73.     'gui_OpeningFcn', @imlook3d_OpeningFcn, ...
  74.     'gui_OutputFcn',  @imlook3d_OutputFcn, ...
  75.     'gui_LayoutFcn',  [] , ...
  76.     'gui_Callback',   []);
  77. if nargin & isstr(varargin{1})
  78.     gui_State.gui_Callback = str2func(varargin{1});
  79. end
  80. if isempty(varargin)
  81.     disp('There was no image to display');
  82.     disp('USAGE: >>imlook3d(img) or use ImFile menu to load an image');
  83.     varargin{1,1} = zeros(32,32);
  84. end
  85. if nargout
  86.     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
  87. else
  88.     gui_mainfcn(gui_State, varargin{:});
  89. end
  90. % End initialization code - DO NOT EDIT
  91. % --- Executes just before imlook3d is made visible.
  92. function imlook3d_OpeningFcn(hObject, eventdata, handles, varargin)
  93. % Choose default command line output for imlook3d
  94. if isempty(varargin{:})
  95.     return;
  96. end
  97. handles.output = hObject;
  98. Std.Interruptible = 'off';
  99. Std.BusyAction = 'queue';
  100. Ax       = Std; 
  101. Ax.Units = 'Pixels'; 
  102. Ax.ydir  = 'reverse';
  103. Ax.XLim  = [.5 128.5]; 
  104. Ax.YLim  = [.5 128.5]; 
  105. Ax.XTick = []; 
  106. Ax.YTick = [];
  107. Ax.CLimMode = 'auto';
  108. set(handles.axes1,Ax);
  109. Img = Std;Img.CData = [];Img.Xdata = [];Img.Ydata = [];
  110. Img.CDataMapping = 'Scaled';
  111. Img.Erasemode = 'none';
  112. handles.image = Img;
  113. inpargs = varargin{:};
  114. [r,c,z] = size(inpargs);
  115. handles.image.CData     = inpargs;
  116. handles.imSize          = [r,c,z];
  117. handles.viewtype        = 1;
  118. handles.imageModality   = [];
  119. handles.hText           = [];
  120. handles.global_windowing= 0;
  121. handles.SliceThickness  = [];
  122. handles.imageInfo       = [];
  123. handles.currentSliceNumber = 1;
  124. handle.image.SliceSensitivityFactor =[];
  125. handles.oimage = handles.image;
  126. cimg = handles.image.CData(:,:,1);
  127. % Create image object and set the properties
  128. handles.ImgObject = image(Img,'Parent',handles.axes1);
  129. set(handles.SliceNumEdit,'String',1);
  130. set(handles.figure1,'Colormap',gray,'Units','Pixels');
  131. % Set the properties of the axes
  132. cclim =[min(cimg(:)) max(cimg(:))];
  133. if (cclim(2)>0 & cclim(2)-cclim(1) ~= 0)
  134.     set(handles.axes1,'CLim',cclim,...
  135.         'PlotBoxAspectRatio',[c r 1]);
  136. end
  137. set(handles.axes1,'XLim',[1 c],'Ylim',[1 r],...
  138.     'PlotBoxAspectRatio',[c r 1]);
  139. set(handles.ImgObject,'Xdata',[1 c],'Ydata',[1 r],'CData',cimg);
  140. drawnow
  141. % Set the slider's value and step size
  142. if z > 1
  143.     turnDisplayButtons(handles,'on')
  144.     set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  145.         1,'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  146. end
  147. % Define the line and associate it with the context menu
  148. set(handles.ImgObject,'UIContextMenu',handles.ImMaps);
  149. % Update handles structure
  150. %--------------------------------------------------------------------------
  151. %% Set appdata for the inntensity adjustment GUI
  152. setappdata(0  ,  'hMainGui'    , gcf);
  153. hMainGui = getappdata(0, 'hMainGui');
  154. maxINT = max(max(max(handles.image.CData)));
  155. minINT = min(min(min(handles.image.CData)));
  156. intensityParam = struct('lowerLimit',cclim(1),'upperLimit',cclim(2),...
  157.     'maxIntensity', maxINT, 'minIntensity',minINT);
  158. handles.intensityParam = intensityParam;
  159. setappdata(hMainGui,  'intensityParam'  ,intensityParam);
  160. %% Read and display logo image
  161. % ----------------------------------------------------------------
  162. fdir = which('imlook3d');
  163. txt = [fdir(1:end-10) 'imlook3d.png'];
  164. imlogo = imread(txt);
  165. Sz= size(imlogo);
  166. flogo = figure('Position',[10000 10000 Sz(2) + 4 Sz(1) + 4],'name','Imlook3D',...
  167.     'numbertitle','off','menubar','none');
  168. movegui(flogo,'center');
  169. set(flogo,'Units', 'pixels');
  170. image(imlogo(:,:,1:3))
  171. set(gca, ...
  172.     'Visible', 'off', ...
  173.     'Units', 'pixels', ...
  174.     'Position', [2 2 Sz(2) Sz(1)]);
  175. text(220,16,'3D Image Display Tool','Fontsize',12);
  176. text(130,355,'Version 1.2: Copyright 2006, Omer Demirkaya','Fontsize',8);
  177. pause(3);delete(flogo);clear imlogo
  178. %% ------------------------------------
  179. %--------------------------------------------------------------------------
  180. guidata(hObject, handles);
  181. %--------------------------------------------------------------------------
  182. % --- Outputs from this function are returned to the command line.
  183. function varargout = imlook3d_OutputFcn(hObject, eventdata, handles)
  184.  varargout{1} = handles.output;
  185. % --- Executes during object creation, after setting all properties.
  186. function SliceNumSlider_CreateFcn(hObject, eventdata, handles)
  187. usewhitebg = 1;
  188. if usewhitebg
  189.     set(hObject,'BackgroundColor',[.9 .9 .9]);
  190. else
  191.     set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
  192. end
  193. % --- Executes on slider movement.
  194. %------------------------------------------------------------
  195. function SliceNumSlider_Callback(hObject, eventdata, handles)
  196. NewVal= round(get(hObject,'Value'));
  197. cimg = handles.image.CData(:,:,NewVal);
  198. if ~(handles.global_windowing)
  199.     cclim = [min(cimg(:)) max(cimg(:))];
  200.     if (cclim(2)>0 & cclim(2)-cclim(1) ~= 0)
  201.         set(handles.axes1,'CLim',[min(cimg(:)) max(cimg(:))])
  202.     end
  203. else
  204.     set(handles.axes1,'CLim',[handles.intensityParam.lowerLimit  handles.intensityParam.upperLimit])
  205. end  
  206. set(handles.ImgObject,'Cdata',cimg);
  207. set(handles.SliceNumEdit,'String',num2str(NewVal));
  208. drawnow
  209. guidata(hObject, handles);
  210. % --- Executes during object creation, after setting all properties.
  211. function SliceNumEdit_CreateFcn(hObject, eventdata, handles)
  212. if ispc
  213.     set(hObject,'BackgroundColor','white');
  214. else
  215.     set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
  216. end
  217. %--------------------------------------------------------------------------
  218. function SliceNumEdit_Callback(hObject, eventdata, handles)
  219. z= size(handles.image.CData,3);
  220. strg = get(hObject,'String');
  221. if str2num(strg)>=1 & str2num(strg)<=z
  222.     set(handles.SliceNumSlider,'Value',str2num(strg));
  223.     cimg = handles.image.CData(:,:,str2num(strg));
  224.     set(handles.ImgObject,'Cdata',cimg);
  225.     handles.currentSliceNumber = str2num(strg);
  226.     drawnow
  227. end
  228. if ~(handles.global_windowing)
  229.     cclim = [min(cimg(:)) max(cimg(:))];
  230.     if (cclim(2)>0 & cclim(2)-cclim(1) ~= 0)
  231.         set(handles.axes1,'CLim',[min(cimg(:)) max(cimg(:))])
  232.     end
  233. else
  234.     set(handles.axes1,'CLim',[handles.intensityParam.lowerLimit  handles.intensityParam.upperLimit])
  235. end 
  236. guidata(hObject, handles);
  237. % --------------------------------------------------------------------
  238. % --------------------------------------------------------------------
  239. function changeColorMaps_Callback(hObject, eventdata, handles)
  240. % --------------------------------------------------------------------
  241. function petColormaps_Callback(hObject, eventdata, handles)
  242. % --------------------------------------------------------------------
  243. function CTcolormaps_Callback(hObject, eventdata, handles)
  244. % --------------------------------------------------------------------
  245. % --------------------------------------------------------------------
  246. function Hot_Callback(hObject, eventdata, handles)
  247. htable = feval('hot');
  248. set(handles.figure1,'Colormap',htable); 
  249. if handles.imSize(3)> 1 
  250.     set(handles.SliceNumEdit,'BackgroundColor',[.1 .1 .1],'ForegroundColor','r');
  251. end
  252. guidata(hObject, handles);
  253. % --------------------------------------------------------------------
  254. function Gray_Callback(hObject, eventdata, handles)
  255. htable = feval('gray');
  256. set(handles.figure1,'Colormap',htable);
  257. if handles.imSize(3)> 1 
  258.     set(handles.SliceNumEdit,'BackgroundColor','k','ForegroundColor','w');
  259. end
  260. guidata(hObject, handles);
  261. % --------------------------------------------------------------------
  262. function InvGray_Callback(hObject, eventdata, handles)
  263. htable = 1-feval('gray');
  264. set(handles.figure1,'Colormap',htable);
  265. if handles.imSize(3)> 1 
  266.     set(handles.SliceNumEdit,'BackgroundColor','w','ForegroundColor','k');
  267. end
  268. guidata(hObject, handles);
  269. % --------------------------------------------------------------------
  270. function Jet_Callback(hObject, eventdata, handles)
  271. htable = feval('jet');
  272. set(handles.figure1,'Colormap',htable);
  273. if handles.imSize(3)> 1 
  274.     set(handles.SliceNumEdit,'BackgroundColor','b','ForegroundColor','y');
  275. end
  276. guidata(hObject, handles);
  277. % --------------------------------------------------------------------
  278. function boneWindow_Callback(hObject, eventdata, handles)
  279. handles.intensityParam.lowerLimit = -250;
  280. handles.intensityParam.upperLimit = 1250;
  281. set(handles.axes1,'CLim',[-300 1250])
  282. guidata(hObject,handles);
  283. % --------------------------------------------------------------------
  284. function lungWindow_Callback(hObject, eventdata, handles)
  285. handles.intensityParam.lowerLimit = -2500;
  286. handles.intensityParam.upperLimit = 1100;
  287. set(handles.axes1,'CLim',[-2500 1100])
  288. guidata(hObject,handles);
  289. % --------------------------------------------------------------------
  290. function mediasitnalWindow_Callback(hObject, eventdata, handles)
  291. handles.intensityParam.lowerLimit = -450;
  292. handles.intensityParam.upperLimit = 350;
  293. set(handles.axes1,'CLim',[-450 350])
  294. guidata(hObject,handles);
  295. % --------------------------------------------------------------------
  296. %---------------------------------------------------------
  297. % Callbacks for imtoolsmenu
  298. %----------------------------------------------------------
  299. function imToolsMenu_Callback(hObject, eventdata, handles)
  300. % --------------------------------------------------------------------
  301. function imPixval_Callback(hObject, eventdata, handles)
  302. if isempty(handles.hText)
  303. handles.hText = impixelinfoval(handles.figure1,handles.ImgObject);
  304. set(handles.hText,'FontWeight','bold');
  305. set(handles.hText,'FontSize',10);
  306. else
  307.     delete(handles.hText);
  308.     handles.hText =[];
  309. end
  310. guidata(hObject, handles);
  311. % --------------------------------------------------------------------
  312. function imHistogram_Callback(hObject, eventdata, handles)
  313. myhistogram(1)
  314. %-------------------------------------------------------------
  315. function imProfile_Callback(hObject, eventdata, handles)
  316. improfile;
  317. title('Intensity profile');
  318. ylabel('Intensity');
  319. xlabel('Pixel position');
  320. %------------------------------------------------
  321. % Histogram function
  322. % -----------------------------------------------
  323. function myhistogram(htype)
  324. img = getimage(gcbf);
  325. if (htype==1)
  326.     figure;hist(double(img(:)),64);
  327.     title('Slice histogram');
  328.     ylabel('Frequency');
  329.     xlabel('Intensity');
  330. elseif (htype == 2)
  331.     figure;hist(log(double(img(:))+1),64);     
  332. else
  333.     htype = 0;
  334. end
  335. return;
  336. % --- Executes during object creation, after setting all properties.
  337. function popup_view_CreateFcn(hObject, eventdata, handles)
  338. if ispc
  339.     set(hObject,'BackgroundColor','white');
  340. else
  341.     set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
  342. end
  343. %-------------------------------------------------------------
  344. % --- Executes on selection change in popup_view.
  345. %-------------------------------------------------------------
  346. function popup_view_Callback(hObject, eventdata, handles)
  347. v = get(hObject,'value');
  348. if v ~=1
  349.     nimg = convert_view(handles.oimage.CData,v);
  350. else
  351.     nimg = handles.oimage.CData;
  352. end
  353. [r,c,z]=size(nimg);
  354. handles.image.CData = nimg;
  355. handles.image.Xdata = [1 c];
  356. handles.image.Ydata = [1 r];
  357. handles.viewtype = v;
  358. handles.imSize = [r,c,z];
  359. reset(handles.axes1); axis off;
  360. set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  361.     round(z/2),'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  362. set(handles.ImgObject,'Xdata',[1 c],'Ydata',[1 r]);
  363. % Set the properties of the axes
  364. set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1]);
  365. if ~isempty(handles.imageInfo)
  366.     Sthick = handles.imageInfo.SliceThickness;
  367.     if v == 2
  368.         psize = handles.imageInfo.PixelSpacing(1);
  369.         set(handles.axes1,'DataAspectRatio',[1 psize/Sthick  1]);
  370.     elseif v == 3
  371.         psize = handles.imageInfo.PixelSpacing(2);
  372.         set(handles.axes1,'DataAspectRatio',[1 psize/Sthick  1]);
  373.     else
  374.         psize = handles.imageInfo.PixelSpacing;
  375.         set(handles.axes1,'DataAspectRatio',[psize(1) psize(2)  1]);
  376.     end
  377. end
  378. set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  379. cimg = handles.image.CData(:,:,round(z/2));
  380. handles.currentSliceNumber = round(z/2);
  381. set(handles.ImgObject,'Cdata',cimg);
  382. guidata(hObject, handles);
  383. drawnow
  384. %-------------------------------------------------------------
  385. % function s= convert_view(img,desired_view)
  386. % img: input image
  387. % It assumes that the original image is in transverse view(1)
  388. % 1: transverse, 2: coronal, 3: sagittal views
  389. % s: output image
  390. function s= convert_view(img,desired_view)
  391. [r,c,z]=size(img);
  392. switch desired_view
  393.     case 2
  394.         s = permute(img,[3 2 1]);
  395.         s=flipdim(s,1);
  396.     case 3
  397.         s = permute(img,[3 1 2]);
  398.         s=flipdim(s,1);
  399.     otherwise;
  400. end
  401. % --------------------------------------------------------------------
  402. function readOrdinaryImageSeries_Callback(hObject, eventdata, handles)
  403. [filename, pathname] = uigetfile({'*.*'},'Image');
  404. if isequal(filename,0)|isequal(pathname,0)
  405.     setstatus('File not found');
  406. else
  407.     cd(pathname)
  408.     k = findstr(filename,'.');
  409.     fnames = dir(['*' filename(k+1:end)]);
  410.     timg = imread(filename);
  411.     [r,c,z] = size(timg);
  412.     numSlices = size(fnames,1);
  413.     nimg = zeros([r,c,numSlices]);
  414.     if z == 3
  415.         hw=warndlg('Color images will be converted to gray');
  416.         uiwait;
  417.         nimg(:,:,1) = rgb2gray(timg);
  418.     else
  419.         nimg(:,:,1) = timg;
  420.     end
  421.     hwb = waitbar(0,'Reading Images, please wait...');
  422.     for i=2:numSlices
  423.         waitbar(i/numSlices, hwb);
  424.         timg = imread(fnames(i).name);
  425.         [r,c,z] = size(timg);
  426.         if z == 3
  427.             nimg(:,:,i) = rgb2gray(timg);
  428.         else
  429.             nimg(:,:,i) = timg;
  430.         end
  431.     end
  432.     close(hwb);
  433.     clear timg;
  434.     [r,c,z]=size(nimg);
  435.     handles.image.CData = nimg;
  436.     handles.image.Xdata = [1 c];
  437.     handles.image.Ydata = [1 r];
  438.     handles.imSize = [r,c,z];
  439.     handles.SliceThickness = 1;
  440.     if z==1
  441.         sliderStep = 1;
  442.     else
  443.         sliderStep = 1.0/double(z-1);
  444.     end
  445.     set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  446.         round(z/2),'SliderStep',[sliderStep sliderStep]);
  447.     set(handles.ImgObject,'Xdata',[1 c],'Ydata',[1 r]);
  448.     % Set the properties of the axes
  449.     set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1]);
  450.     set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  451.     cimg = handles.image.CData(:,:,round(z/2));
  452.     set(handles.ImgObject,'Cdata',cimg);
  453.     handles.oimage = handles.image;
  454.     guidata(hObject, handles);
  455.     clear nimg;
  456.     if z > 1
  457.         turnDisplayButtons(handles,'on');
  458.         set(handles.popupmenu_imageModality,'visible','off');
  459.     end
  460.     drawnow  
  461. end
  462. % --------------------------------------------------------------------
  463. function saveImageIntoWorkspace_Callback(hObject, eventdata, handles)
  464. assignin('base','IIMG',handles.image.CData);
  465. % --------------------------------------------------------------------
  466. function imfileMenu_Callback(hObject, eventdata, handles)
  467. % --------------------------------------------------------------------
  468. function ImMaps_Callback(hObject, eventdata, handles)
  469. % --------------------------------------------------------------------
  470. % --------------------------------------------------------------------
  471. function readWorkspaceImage_Callback(hObject, eventdata, handles)
  472. Vars = evalin('base','who;');
  473. if ~isempty (Vars)
  474.     [s,v] = listdlg('PromptString','Select an image:',...
  475.         'SelectionMode','single',...
  476.         'Listsize',[150,200],...
  477.         'ListString',Vars);
  478.     if (v)
  479.         imlook3d(evalin('base',Vars{s}));
  480.     end
  481. else
  482.     disp('No workspace variable');
  483. end
  484. % --------------------------------------------------------------------
  485. % Reads series of dicom images into a 3D array
  486. % --------------------------------------------------------------------
  487. function readDicomPETSeries_Callback(hObject, eventdata, handles)
  488. [filename, pathname] = uigetfile({'*.dcm';'*.*'},'Image');
  489. if isequal(filename,0)|isequal(pathname,0)
  490.     setstatus('File not found');
  491. else
  492.     cd(pathname)
  493.     k = findstr(filename,'.');
  494.     fnames = dir([filename(1:2) '*']);
  495.     info = dicominfo(filename);
  496.     r = info.Width;
  497.     c = info.Height;
  498.     numSlices = length(fnames);
  499.     nimg = zeros([r,c,numSlices]);
  500.     hw = waitbar(0,'Reading volume image, please wait...');
  501.     for i=1:numSlices
  502.         info = dicominfo(fnames(i).name);
  503.         nimg(:,:,info.ImageIndex) = info.RescaleSlope*dicomread(info)+info.RescaleIntercept;
  504.         waitbar(i/numSlices,hw);
  505.     end
  506.     close(hw);
  507.     
  508.     fields = {'Filename','FileModDate','FileSize','ImageType','Width','Height','BitDepth',...
  509.         'NumberOfFrames','Rows','Columns','BitsAllocated','SmallestImagePixelValue',...
  510.         'LargestImagePixelValue','PixelDataGroupLength','StudyDescription','SeriesDescription',...
  511.         'StudyID','ImageID','PatientID','SliceThickness','StudyDate','AcquisitionDate',...
  512.         'AcquisitionTime','PixelSpacing'};
  513.     
  514.     myinfo = keepfield(info,fields);
  515.     
  516.     handles.imageInfo = myinfo;
  517.  
  518.     [r,c,z]=size(nimg);
  519.     handles.image.CData = nimg;
  520.     handles.image.Xdata = [1 c];
  521.     handles.image.Ydata = [1 r];
  522.     handles.imSize = [r,c,z];
  523.     set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  524.         round(z/2),'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  525.     set(handles.ImgObject,'Xdata',[1 c],'Ydata',[1 r]);
  526.     % Set the properties of the axes
  527.     set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1]);
  528.     set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  529.     cimg = handles.image.CData(:,:,round(z/2));
  530.     set(handles.ImgObject,'Cdata',cimg);
  531.     handles.oimage = handles.image;
  532.     guidata(hObject, handles);
  533.     clear nimg;
  534.     if z>1
  535.         turnDisplayButtons(handles,'on')
  536.     end
  537.     handles.imageModality = 1;
  538.     set(handles.popupmenu_imageModality,'visible','on');
  539.     set(handles.popupmenu_imageModality,'value',1);
  540.     drawnow  
  541. end
  542. % --------------------------------------------------------------------
  543. function saveCurrentSlice_Callback(hObject, eventdata, handles)
  544. [filename, pathname,filterindex] = uiputfile({'*.png';'*.tif';'*.jpg'},'Image');
  545. fformat = {'png','tif','jpg'}; 
  546. if isequal(filename,0) | isequal(pathname,0)
  547.     warndlg('No file name entered!');
  548. else
  549.     I= getframe(handles.axes1);
  550.     I=frame2im(I);
  551.     buffer=pwd;
  552.     cd(pathname);
  553.     imwrite(I,filename,fformat{filterindex});
  554.     cd(buffer);
  555. end
  556. % --------------------------------------------------------------------
  557. function adjust_intensity_window_Callback(hObject, eventdata, handles)
  558. setappdata(0  ,  'hMainGui'    , gcf);
  559. hMainGui = getappdata(0, 'hMainGui');
  560. maxINT = max(max(max(handles.image.CData)));
  561. minINT = min(min(min(handles.image.CData)));
  562. cclim = get(handles.axes1,'CLim');
  563. intensityParam = struct('lowerLimit',cclim(1),'upperLimit',cclim(2),'maxIntensity',maxINT, 'minIntensity',minINT);
  564. setappdata(hMainGui,  'intensityParam', intensityParam);
  565. adjustIntensityRangeGui;
  566. uiwait;
  567. hMainGui = getappdata(0,'hMainGui');
  568. handles.intensityParam = getappdata(hMainGui,  'intensityParam');
  569. guidata(hObject, handles);
  570. % -----------------------------------------------------------------
  571. function global_intensity_windowing_Callback(hObject, eventdata, handles)
  572. str = get(gcbo,'Checked');
  573. if strcmp(str,'off')
  574.     handles.global_windowing =1;
  575.     set(gcbo,'Checked','on');
  576. else
  577.     handles.global_windowing =0;
  578.     set(gcbo,'Checked','off');
  579. end
  580. guidata(hObject,handles);
  581. % --------------------------------------------------------------------
  582. function renderVolume_Callback(hObject, eventdata, handles)
  583. img= handles.image.CData;
  584. if size(img,3) > 1
  585.     prompt = {'Enter Lower Threshold:','Enter Upper Threshold:'};
  586.     dlg_title = 'Enter Thresholds'; num_lines = 1; def = {'1','2'};
  587.     answer = inputdlg(prompt,dlg_title,num_lines,def);
  588.     T(1) = str2num(answer{1,1});
  589.     T(2) = str2num(answer{2,1});
  590.     nimg = img >= T(1) & img <= T(2);
  591.     s = size(img);
  592.     vlim=[1 s(2) 1 s(1) 1 s(3)];
  593.     figure;
  594.     % set(get(hndl,'CurrentAxes'),'YDir','rev');
  595.     [x y z D] = subvolume(nimg,vlim);
  596.     p = patch(isosurface(x,y,z,D,0),'FaceColor','r','EdgeColor','none');
  597.     p2 = patch(isocaps(x,y,z,D,0),'FaceColor','interp','EdgeColor','none');
  598.     set(gca,'XTick',[],'YTick',[],'ZTick',[],'Box','on','Color','c');
  599.     isonormals(x,y,z,D,p);
  600.     axis tight;
  601.     daspect([1 1 1])
  602.     lighting gouraud
  603. else
  604.     msgbox('This is not a volume image','Error','modal');
  605. end
  606. % --------------------------------------------------------------------
  607. % READS CT DICOM IMAGES
  608. % --------------------------------------------------------------------
  609. function readDicomCTSeries_Callback(hObject, eventdata, handles)
  610. [filename, pathname] = uigetfile({'*.dcm';'*.*'},'Image');
  611. if isequal(filename,0)|isequal(pathname,0)
  612.     setstatus('File not found');
  613. else
  614.     cd(pathname)
  615.     k = findstr(filename,'.');
  616.     fnames = dir(['*' filename(k(end)+1:end)]);
  617.     info = dicominfo(filename);
  618.     r = info.Width;
  619.     c = info.Height;
  620.     numSlices = length(fnames);
  621.     nimg = zeros([r,c,numSlices]);
  622.     hwb = waitbar(0,'Reading Images, please wait...');
  623.     for i=1:numSlices
  624.         waitbar(i/numSlices, hwb);
  625.         info = dicominfo(fnames(i).name);
  626.         nimg(:,:,i) = info.RescaleSlope*dicomread(info)+info.RescaleIntercept;
  627.     end
  628.     close(hwb);
  629.     
  630.     fields = {'Filename','FileModDate','FileSize','ImageType','Width','Height','BitDepth',...
  631.         'NumberOfFrames','Rows','Columns','BitsAllocated','SmallestImagePixelValue',...
  632.         'LargestImagePixelValue','PixelDataGroupLength','StudyDescription','SeriesDescription',...
  633.         'StudyID','ImageID','PatientID','SliceThickness','StudyDate','AcquisitionDate','AcquisitionTime','PixelSpacing'};
  634.     
  635.     myinfo = keepfield(info,fields);
  636.     handles.imageInfo = myinfo;
  637.     
  638.     [r,c,z]=size(nimg);
  639.     handles.image.CData = nimg;
  640.     handles.image.Xdata = [1 c];
  641.     handles.image.Ydata = [1 r];
  642.     handles.imSize = [r,c,z];
  643.     set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  644.         round(z/2),'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  645.     set(handles.ImgObject,'Xdata',[1 c],'Ydata',[1 r]);
  646.     % Set the properties of the axes
  647.     set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1]);
  648.     set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  649.     cimg = handles.image.CData(:,:,round(z/2));
  650.     set(handles.ImgObject,'Cdata',cimg);
  651.     handles.oimage = handles.image;
  652.     guidata(hObject, handles);
  653.     clear nimg;
  654.     handles.imageModality = 4;
  655.     if z>1
  656.         turnDisplayButtons(handles,'on')
  657.     end
  658.     handles.imageModality = 2;
  659.     set(handles.popupmenu_imageModality,'visible','on');
  660.     set(handles.popupmenu_imageModality,'value',2);
  661.     drawnow  
  662. end
  663. % --------------------------------------------------------------------
  664. function imageProcessMenu_Callback(hObject, eventdata, handles)
  665. % --------------------------------------------------------------------
  666. function imageThresholdManual_Callback(hObject, eventdata, handles)
  667. img = getimage(gcbf);
  668. th = cell2mat(inputdlg('Enter Threshold','Threshold',1,{'100'}));
  669. if ~isempty(th)
  670.     th = str2num(th);
  671.     figure;imagesc(img>th);axis image;axis off
  672.     title('Thresholded Image');
  673. end
  674. % --------------------------------------------------------------------
  675. function automatedThresholding_Callback(hObject, eventdata, handles)
  676. img = getimage(gcbf);
  677. th=otsu_th(single(img(:)),64);
  678. figure;imagesc(img>th);axis image;axis off
  679. title('Thresholded Image');
  680. % --------------------------------------------------------------------
  681. % READS DICOM IMAGE SINGLE OR VOLUME
  682. % --------------------------------------------------------------------
  683. function readSingleDicomImage_Callback(hObject, eventdata, handles)
  684. [filename, pathname] = uigetfile({'*.dcm';'*.*'},'Image');
  685. if isequal(filename,0)|isequal(pathname,0)
  686.     setstatus('File not found');
  687. else
  688.     cd(pathname)
  689.     info = dicominfo(filename);  
  690.     if isfield(info,'NumberOfSlices')
  691.         z = info.NumberOfSlices;
  692.     elseif isfield(info,'NumberOfFrames')
  693.         z = info.NumberOfFrames;
  694.     end
  695.     if isfield(info,'SliceThickness')
  696.         handles.SliceThickness= info.SliceThickness;
  697.     end 
  698.     % Reading dicom image
  699.     nimg = squeeze(dicomread(info));
  700.     [r,c,z]=size(nimg);
  701.     handles.image.CData = nimg;
  702.     handles.image.Xdata = [1 c];
  703.     handles.image.Ydata = [1 r];
  704.     handles.imSize = [r,c,z];
  705.     
  706.     if z >1
  707.         turnDisplayButtons(handles,'on');
  708.         set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  709.             round(z/2),'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  710.         set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  711.         turnDisplayButtons(handles,'on');
  712.         cimg = handles.image.CData(:,:,round(z/2));
  713.     else
  714.         turnDisplayButtons(handles,'off');
  715.         cimg = handles.image.CData;
  716.     end
  717.     fields = {'Filename','FileModDate','FileSize','ImageType','Width','Height','BitDepth',...
  718.         'NumberOfFrames','Rows','Columns','BitsAllocated','SmallestImagePixelValue',...
  719.         'LargestImagePixelValue','PixelDataGroupLength','StudyDescription','SeriesDescription',...
  720.         'StudyID','ImageID','PatientID','SliceThickness','StudyDate','AcquisitionDate','AcquisitionTime','PixelSpacing'};
  721.     myinfo = keepfield(info,fields);
  722.     handles.imageInfo = myinfo;
  723.    
  724.     % Set the properties of the axes and image object
  725.     set(handles.ImgObject,'XData',[1 c],'YData',[1 r],'CData',cimg);
  726.     set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1],'DataAspectRatio',...
  727.         [1 info.PixelSpacing(2)/info.PixelSpacing(1)  1]);
  728.     handles.oimage = handles.image;
  729.     guidata(hObject, handles);
  730.     clear nimg;
  731.     drawnow  
  732. end
  733. % --------------------------------------------------------------------
  734. % --- Executes on selection change in popup_flip.
  735. function popup_flip_Callback(hObject, eventdata, handles)
  736. v = get(hObject,'value');
  737. switch v
  738.     case 1
  739.        handles.image.CData = flipdim(handles.image.CData,2);
  740.     case 2
  741.         handles.image.CData = flipdim(handles.image.CData,1);
  742.     case 3
  743.         handles.image.CData = flipdim(handles.image.CData,3);
  744.     case 4
  745.     handles.image.CData = handles.oimage.CData;
  746.     otherwise
  747. end
  748. guidata(hObject,handles);
  749. % --- Executes during object creation, after setting all properties.
  750. function popup_flip_CreateFcn(hObject, eventdata, handles)
  751. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
  752.     set(hObject,'BackgroundColor','white');
  753. end
  754. function turnDisplayButtons(handles,bmode)
  755. set(handles.SliceNumSlider,'visible',bmode);
  756. set(handles.SliceNumEdit,'visible',bmode);
  757. set(handles.popup_view,'visible',bmode);
  758. set(handles.popup_flip,'visible',bmode);
  759. set(handles.text1,'visible',bmode);
  760. set(handles.text2,'visible',bmode);
  761. set(handles.text3,'visible',bmode);
  762. set(handles.popup_flip,'visible',bmode);     
  763. return
  764. % --------------------------------------------------------------------
  765. function helpCallback_Callback(hObject, eventdata, handles)
  766. % --------------------------------------------------------------------
  767. % --------------------------------------------------------------------
  768. function helpMenu_Callback(hObject, eventdata, handles)
  769. % --------------------------------------------------------------------
  770. function helpAboutImlook3d_Callback(hObject, eventdata, handles)
  771. s = sprintf(['IMLOOK3D: 3D Image Display Tooln',...
  772.     'Version 1.2, Copyright (2006 - Inf and Beyond)n',...
  773.     'Omer Demirkaya, KFSH&RC']);
  774. msgbox(s,'About IMLOOK3D Tool','modal');
  775. % --------------------------------------------------------------------
  776. function helpDisclaimer_Callback(hObject, eventdata, handles)
  777. s = {'This SOFTWARE DOES NOT (A) MAKE ANY WARRANTY, EXPRESS OR IMPLIED',
  778.     'WITH RESPECT TO THE USE OF THE INFORMATION PROVIDED HEREBY; NOR (B)', 
  779.     'GUARANTEE THE ACCURACY,COMPLETENESS,USEFULNESS,OR ADEQUACY OF ANY',
  780.     'RESOURCES, INFORMATION,SYSTEM,PRODUCT,OR PROCESS AVAILABLE - AT OR', 
  781.     'THROUGH THIS SOFTWARE.'};
  782. msgbox(s,'Disclaimer','modal');
  783. % --------------------------------------------------------------------
  784. function imageInformation_Callback(hObject, eventdata, handles)
  785. if ~isempty(handles.imageInfo)
  786.     imageinfo(handles.imageInfo);
  787. else
  788.     msgbox('There is no image or no information about it','Image Info..','modal');
  789. end
  790. % --------------------------------------------------------------------
  791. function readSingleOrdinaryImage_Callback(hObject, eventdata, handles)
  792. [filename, pathname] = uigetfile({'*.*'},'Image');
  793. if isequal(filename,0)|isequal(pathname,0)
  794.     setstatus('File not found');
  795. else
  796.     cd(pathname)
  797.     info = imfinfo(filename);  
  798.     [img, map]=imread(filename);
  799.     [r,c,z] = size(img);
  800.     handles.image.CData = img;
  801.     handles.image.Xdata = [1 c];
  802.     handles.image.Ydata = [1 r];
  803.     handles.imSize = [r,c,z];
  804.     
  805.     if z > 1   % single slice
  806.     set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  807.         round(z/2),'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  808.     set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  809.     turnDisplayButtons(handles,'on');
  810.     cimg = handles.image.CData(:,:,round(z/2));
  811.     else
  812.         turnDisplayButtons(handles,'off');
  813.         cimg = handles.image.CData;
  814.     end
  815.     handles.imageInfo = info;
  816.    % Set the properties of the axes and image object
  817.     set(handles.ImgObject,'XData',[1 c],'YData',[1 r],'CData',cimg);
  818.     set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1],'DataAspectRatio',[1 1 1]);
  819.     handles.oimage = handles.image;
  820.     guidata(hObject, handles);
  821.     clear nimg;
  822.     drawnow  
  823. end
  824. % --------------------------------------------------------------------
  825. % SMOOTH IMAGE
  826. % --------------------------------------------------------------------
  827. function smoothVolume_Callback(hObject, eventdata, handles)
  828. if size(handles.image.CData,3) > 1
  829. h = waitbar(0,'Smoothing, please wait...');
  830. handles.image.CData= smooth3(handles.image.CData,'gaussian');
  831. close(h);
  832. set(handles.ImgObject,'Cdata',handles.image.CData(:,:,handles.currentSliceNumber));
  833. guidata(hObject,handles);
  834. end
  835. % --------------------------------------------------------------------
  836. % Voxel dimensions
  837. % --------------------------------------------------------------------
  838. function voxelSize_Callback(hObject, eventdata, handles)
  839. prompt = {'X Size:','Y Size:', 'Z Size'};
  840. dlg_title = 'Enter Voxel Sizes'; num_lines = 1; def = {'1','1','1'};
  841. answer = inputdlg(prompt,dlg_title,num_lines,def);
  842. if ~isempty(answer)
  843.     voxdim(1) = str2num(cell2mat(answer(1,1)));
  844.     voxdim(2) = str2num(cell2mat(answer(2,1)));
  845.     voxdim(3) = str2num(cell2mat(answer(3,1)));
  846.     bw = voxdim > 0; % checking for zero or negative
  847.     if prod(double(bw))
  848.         handles.imageInfo.PixelSpacing(1) = voxdim(1);
  849.         handles.imageInfo.PixelSpacing(2) = voxdim(2);
  850.         handles.imageInfo.SliceThickness  = voxdim(3);
  851.         if handles.viewtype == 2
  852.             set(handles.axes1,'DataAspectRatio',[1 voxdim(1)/voxdim(3)  1]);
  853.         elseif handles.viewtype == 3
  854.             set(handles.axes1,'DataAspectRatio',[1 voxdim(2)/voxdim(3)  1]);
  855.         else
  856.             set(handles.axes1,'DataAspectRatio',[1 voxdim(2)/voxdim(1)  1]);
  857.         end
  858.     end
  859. end
  860. guidata(hObject,handles);
  861. % --------------------------------------------------------------------
  862. % Horizontal Profile
  863. % --------------------------------------------------------------------
  864. function horizontalProfile_Callback(hObject, eventdata, handles)
  865. h = warndlg('Double-click on the row','Pixel Selection');
  866. uiwait;
  867. [c,r,P] = impixel;
  868. f = get(findobj(gcf,'Type','image'));
  869. txt = ['Profile for row: ' num2str(r)];
  870. figure;
  871. plot(f.CData(r,:));title(txt);xlabel('Pixel location');ylabel('Intensity');
  872. % --------------------------------------------------------------------
  873. % Vertical Profile
  874. % --------------------------------------------------------------------
  875. function verticalProfile_Callback(hObject, eventdata, handles)
  876. h = warndlg('Double-click on the column','Pixel Selection');
  877. uiwait;
  878. [c,r,P] = impixel;
  879. f = get(findobj(gcf,'Type','image'));
  880. txt = ['Profile for column: ' num2str(c)];
  881. figure;
  882. plot(f.CData(:,c));title(txt);xlabel('Pixel location');ylabel('Intensity');
  883. % --------------------------------------------------------------------
  884. % --- Executes during object creation, after setting all properties.
  885. % --------------------------------------------------------------------
  886. function popupmenu_imageModality_CreateFcn(hObject, eventdata, handles)
  887. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
  888.     set(hObject,'BackgroundColor','white');
  889. end
  890. % --------------------------------------------------------------------
  891. % --- Image modality selection
  892. % --------------------------------------------------------------------
  893. function popupmenu_imageModality_Callback(hObject, eventdata, handles)
  894. imMod = get(hObject,'value');
  895. handles.imageModality = imMod;
  896. % --------------------------------------------------------------------
  897. %  Executes MATLAB IMTOOL 
  898. % --------------------------------------------------------------------
  899. function imtoolMATLAB_Callback(hObject, eventdata, handles)
  900. f = get(findobj(gcf,'Type','image'));
  901. imtool(f.CData,[min(f.CData(:)) max(f.CData(:))]);
  902. % --------------------------------------------------------------------
  903. %  helpMenu on Imlook3D
  904. % --------------------------------------------------------------------
  905. function helpIMLOOK3D_Callback(hObject, eventdata, handles)
  906. warndlg('Under Construction and needs help :)');
  907. % --------------------------------------------------------------------
  908. %  Reading MRI images
  909. % --------------------------------------------------------------------
  910. function readDICOMMRISeries_Callback(hObject, eventdata, handles)
  911. [filename, pathname] = uigetfile({'*.dcm';'*.*'},'Image');
  912. if isequal(filename,0)|isequal(pathname,0)
  913.     setstatus('File not found');
  914. else
  915.     cd(pathname)
  916.     k = findstr(filename,'.');
  917.     fnames = dir(['*' filename(k+1:end)]);
  918.     info = dicominfo(filename);
  919.     r = info.Width;
  920.     c = info.Height;
  921.     numSlices = length(fnames);
  922.     nimg = zeros([r,c,numSlices]);
  923.     hwb = waitbar(0,'Reading Images, please wait...');
  924.     for i=1:numSlices
  925.         waitbar(i/numSlices, hwb);
  926.         info = dicominfo(fnames(i).name);
  927.         nimg(:,:,i) = dicomread(info);
  928.     end
  929.     close(hwb);
  930.     
  931.     fields = {'Filename','FileModDate','FileSize','ImageType','Width','Height','BitDepth',...
  932.         'NumberOfFrames','Rows','Columns','BitsAllocated','SmallestImagePixelValue',...
  933.         'LargestImagePixelValue','PixelDataGroupLength','StudyDescription','SeriesDescription',...
  934.         'StudyID','ImageID','PatientID','SliceThickness','StudyDate','AcquisitionDate','AcquisitionTime','PixelSpacing'};
  935.     
  936.     myinfo = keepfield(info,fields);
  937.     handles.imageInfo = myinfo;
  938.     
  939.     [r,c,z]=size(nimg);
  940.     handles.image.CData = nimg;
  941.     handles.image.Xdata = [1 c];
  942.     handles.image.Ydata = [1 r];
  943.     handles.imSize = [r,c,z];
  944.     set(handles.SliceNumSlider,'Min',1,'Max',z,'Value',...
  945.         round(z/2),'SliderStep',[1.0/double(z-1) 1.0/double(z-1)]);
  946.     set(handles.ImgObject,'Xdata',[1 c],'Ydata',[1 r]);
  947.     % Set the properties of the axes
  948.     set(handles.axes1,'XLim',[1 c],'YLim',[1 r],'PlotBoxAspectRatio',[c r 1]);
  949.     set(handles.SliceNumEdit,'String',num2str(round(z/2)));
  950.     cimg = handles.image.CData(:,:,round(z/2));
  951.     set(handles.ImgObject,'Cdata',cimg);
  952.     handles.oimage = handles.image;
  953.     guidata(hObject, handles);
  954.     clear nimg;
  955.     if z>1
  956.         turnDisplayButtons(handles,'on')
  957.     end
  958.     handles.imageModality = 4;
  959.     set(handles.popupmenu_imageModality,'visible','on');
  960.     set(handles.popupmenu_imageModality,'value',4);
  961.     drawnow  
  962. end
  963. % --------------------------------------------------------------------
  964. function cropVolume_Callback(hObject, eventdata, handles)
  965. % hObject    handle to cropVolume (see GCBO)
  966. % eventdata  reserved - to be defined in a future version of MATLAB
  967. % handles    structure with handles and user data (see GUIDATA)
  968. [I,rect] = imcrop; 
  969. s = handles.image.CData;
  970. switch handles.viewtype
  971.     case 1
  972.         [r,c,z]  = size(s); 
  973.         oimg = crop3d(s,rect,[1 z]);
  974.     case 2
  975. %         s = permute(img,[3 2 1]);
  976. %         s = flipdim(s,1);
  977.         [r,c,z]  = size(s); 
  978.         oimg = crop3d(s,rect,[1 z]);
  979.     case 3
  980. %         s = permute(img,[3 1 2]);
  981. %         s = flipdim(s,1);
  982.         [r,c,z]  = size(s); 
  983.         oimg = crop3d(s,rect,[1 z]);
  984.     otherwise;
  985. end
  986. imlook3d(oimg);