Update 13/5/2019
This commit is contained in:
		@@ -1,8 +1,13 @@
 | 
				
			|||||||
classdef CardiacPhase < Phase
 | 
					classdef CardiacPhase < Phase
 | 
				
			||||||
        properties
 | 
					        properties
 | 
				
			||||||
        FullPhase = Phase;
 | 
					        FullPhase = Phase;
 | 
				
			||||||
 | 
					        IMF = uint32(0);
 | 
				
			||||||
        SystolePositions = [];
 | 
					        SystolePositions = [];
 | 
				
			||||||
        DiastolePositions = [];
 | 
					        DiastolePositions = [];
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        properties % (GetAccess = private) should become private
 | 
				
			||||||
        SystoleTreshold = double(0);
 | 
					        SystoleTreshold = double(0);
 | 
				
			||||||
        DiastoleTreshold = double(0);
 | 
					        DiastoleTreshold = double(0);
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
@@ -12,32 +17,30 @@ classdef CardiacPhase < Phase
 | 
				
			|||||||
            if nargin==0;return;end
 | 
					            if nargin==0;return;end
 | 
				
			||||||
            % gets properties of superclass
 | 
					            % gets properties of superclass
 | 
				
			||||||
            obj.FullPhase = Phase.ModePhases;
 | 
					            obj.FullPhase = Phase.ModePhases;
 | 
				
			||||||
            obj.WorkLoad = Phase.WorkLoad;
 | 
					 | 
				
			||||||
            obj.Video = Phase.Video;
 | 
					            obj.Video = Phase.Video;
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
%     
 | 
					
 | 
				
			||||||
%     methods %set methods
 | 
					 | 
				
			||||||
% %         function set.ToBeSetByUser(obj,val)
 | 
					 | 
				
			||||||
% %             if ~isboolean(val);error('provide a boolean value please');end
 | 
					 | 
				
			||||||
% %             obj.ToBeSetByUser=val;
 | 
					 | 
				
			||||||
% %         end
 | 
					 | 
				
			||||||
%     end
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
        % Choose the correct IMF depending on the work load
 | 
					        % Choose the correct IMF depending on the work load
 | 
				
			||||||
        function SelectPhase(obj)
 | 
					        function SelectPhase(obj)
 | 
				
			||||||
            if strcmp(obj.WorkLoad,'Rest')
 | 
					            prompt = {'Choose the IMF representing cardiac phase:','Combine with additional IMF:'};
 | 
				
			||||||
                imf_number = 3;
 | 
					            dlgtitle = 'Cardiac Phase';
 | 
				
			||||||
            else if strcmp(obj.WorkLoad,'Exercise')
 | 
					            dims = [1 60];
 | 
				
			||||||
                    imf_number = 2;
 | 
					            definput = {'3',''};
 | 
				
			||||||
                else if strcmp(obj.WorkLoad,'Continuous Acquisition')
 | 
					            opts.Interpreter = 'tex';
 | 
				
			||||||
                        imf_number = 3;
 | 
					            answer = inputdlg(prompt,dlgtitle,dims,definput,opts);
 | 
				
			||||||
                    end
 | 
					            obj.IMF = str2num(answer{1});
 | 
				
			||||||
                end
 | 
					            
 | 
				
			||||||
 | 
					            if  length(answer{2}) > 0.
 | 
				
			||||||
 | 
					                 new_imf = obj.FullPhase(obj.IMF,:) + obj.FullPhase(str2num(answer{2}),:); % if the IMFs are unorthogonal combine them into one IMF
 | 
				
			||||||
 | 
					                 obj.FullPhase(obj.IMF,:) = new_imf;
 | 
				
			||||||
 | 
					                 obj.FullPhase(str2num(answer{2}),:) = [];
 | 
				
			||||||
 | 
					                 
 | 
				
			||||||
 | 
					                 Complot(obj.FullPhase);
 | 
				
			||||||
            end
 | 
					            end
 | 
				
			||||||
            % SHOULD TRY TO USE GETPHASE FUNCTION
 | 
					            % SHOULD TRY TO USE GETPHASE FUNCTION
 | 
				
			||||||
%             obj.IMF = imf_number;
 | 
					%             obj.IMF = imf_number;
 | 
				
			||||||
%             GetPhase@Phase(obj.FullPhase,obj.IMF);
 | 
					%             GetPhase@Phase(obj.FullPhase,obj.IMF);
 | 
				
			||||||
            obj.Values = obj.FullPhase(imf_number,:); % Phase corresponding to the cardiac phase
 | 
					            obj.Values = obj.FullPhase(obj.IMF,:); %Phase corresponding to respiratory phase
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        % Detects the frame's positions of diastolic events
 | 
					        % Detects the frame's positions of diastolic events
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								Code/Complot.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								Code/Complot.m
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					function [] = Complot(varargin)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error(nargchk(1,2,nargin));
 | 
				
			||||||
 | 
					[msg,x,S] = Cplotchk(varargin);
 | 
				
			||||||
 | 
					error(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% Get some spacing between the various signals
 | 
				
			||||||
 | 
					alpha = mean(max(S')-min(S'));
 | 
				
			||||||
 | 
					% save alpha alpha
 | 
				
			||||||
 | 
					% load alpha alpha
 | 
				
			||||||
 | 
					for i = 1:size(S,1)
 | 
				
			||||||
 | 
					  SS(i,:) = S(i,:) - alpha*(i-1)*ones(size(S(1,:)));
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% Plotting per se
 | 
				
			||||||
 | 
					if nargin == 1
 | 
				
			||||||
 | 
					   plot(SS')
 | 
				
			||||||
 | 
					   else
 | 
				
			||||||
 | 
					   plot(x,SS')
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					axis([x(1) x(length(SS)) min(min(SS)) max(max(SS)) ])
 | 
				
			||||||
 | 
					% axis([0 x(length(SS)) min(min(SS)) max(max(SS)) ])
 | 
				
			||||||
 | 
					set(gca,'YTick',-size(S,1)*alpha:alpha:0);
 | 
				
			||||||
 | 
					set(gca,'YTicklabel',size(S,1)+1:-1:1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% Reading routine
 | 
				
			||||||
 | 
					function [msg,x,S] = Cplotchk(P);
 | 
				
			||||||
 | 
					msg = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if length(P) > 2
 | 
				
			||||||
 | 
					   msg = 'Too many inputs.';
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					   if length(P) == 1
 | 
				
			||||||
 | 
					      S = P{1};
 | 
				
			||||||
 | 
					      x = 1:length(S);
 | 
				
			||||||
 | 
					   end
 | 
				
			||||||
 | 
					   if length(P) == 2
 | 
				
			||||||
 | 
					      x = P{1};
 | 
				
			||||||
 | 
					      S = P{2};
 | 
				
			||||||
 | 
					   end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										57
									
								
								Code/Phase.m
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								Code/Phase.m
									
									
									
									
									
								
							@@ -3,10 +3,11 @@ classdef Phase < handle
 | 
				
			|||||||
    properties 
 | 
					    properties 
 | 
				
			||||||
        MeanIntensity = [];
 | 
					        MeanIntensity = [];
 | 
				
			||||||
        Video = [];
 | 
					        Video = [];
 | 
				
			||||||
        WorkLoad = '';
 | 
					 | 
				
			||||||
        IMFs = [];
 | 
					        IMFs = [];
 | 
				
			||||||
        ModePhases = [];
 | 
					        ModePhases = [];
 | 
				
			||||||
        Values = [];
 | 
					        Values = [];
 | 
				
			||||||
 | 
					        NumberOfSlices = uint32(0);
 | 
				
			||||||
 | 
					        CurrentSlice = uint32(0);
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    properties % (GetAccess = private) should become private
 | 
					    properties % (GetAccess = private) should become private
 | 
				
			||||||
@@ -25,28 +26,26 @@ classdef Phase < handle
 | 
				
			|||||||
        end
 | 
					        end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    methods %set methods
 | 
					 | 
				
			||||||
        function set.WorkLoad(obj,str)
 | 
					 | 
				
			||||||
            obj.WorkLoad = str;
 | 
					 | 
				
			||||||
%             if indx == 1
 | 
					 | 
				
			||||||
%                 obj.WorkLoad = 'Rest';
 | 
					 | 
				
			||||||
%             else if indx == 2
 | 
					 | 
				
			||||||
%                     obj.WorkLoad = 'Exercise';
 | 
					 | 
				
			||||||
%                 else
 | 
					 | 
				
			||||||
%                     obj.WorkLoad = 'Continuous Acquisition';
 | 
					 | 
				
			||||||
%             end
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    methods
 | 
					    methods
 | 
				
			||||||
        % Extracts the image sequence from the folder
 | 
					        % Extracts the image sequence from the folder
 | 
				
			||||||
        function GetData(obj)
 | 
					        function GetData(obj)
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
            directory = uigetdir(obj.InitialDirectory); % Choose the cineMRI folder 
 | 
					            directory = uigetdir(obj.InitialDirectory); % Choose the cineMRI folder 
 | 
				
			||||||
            dicomFiles = dir(fullfile(directory, '*.dcm' ));
 | 
					            dicomFiles = dir(fullfile(directory, '*.dcm' ));
 | 
				
			||||||
            obj.nFrames = length(dicomFiles); % Number of frames of the cineMRI
 | 
					            obj.nFrames = length(dicomFiles); % Number of frames of the cineMRI
 | 
				
			||||||
            info = dicominfo(fullfile(directory,dicomFiles(1).name));
 | 
					            info = dicominfo(fullfile(directory,dicomFiles(1).name));
 | 
				
			||||||
            obj.xImageSize = info.Width; % Image width
 | 
					            obj.xImageSize = info.Width; % Image width
 | 
				
			||||||
            obj.yImageSize = info.Height; % Image height
 | 
					            obj.yImageSize = info.Height; % Image height
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            prompt = {'Number of slices:'};
 | 
				
			||||||
 | 
					            dlgtitle = 'Slice';
 | 
				
			||||||
 | 
					            dims = [1 60];
 | 
				
			||||||
 | 
					            definput = {'1'};
 | 
				
			||||||
 | 
					            opts.Interpreter = 'tex';
 | 
				
			||||||
 | 
					            answer = inputdlg(prompt,dlgtitle,dims,definput,opts);
 | 
				
			||||||
 | 
					            obj.NumberOfSlices = str2num(answer{1});
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if obj.NumberOfSlices == 1
 | 
				
			||||||
                obj.Video = zeros(obj.xImageSize, obj.yImageSize, 1, obj.nFrames, 'uint8');
 | 
					                obj.Video = zeros(obj.xImageSize, obj.yImageSize, 1, obj.nFrames, 'uint8');
 | 
				
			||||||
                for p=1:obj.nFrames
 | 
					                for p=1:obj.nFrames
 | 
				
			||||||
                   filename = fullfile(directory, dicomFiles(p).name );
 | 
					                   filename = fullfile(directory, dicomFiles(p).name );
 | 
				
			||||||
@@ -56,6 +55,25 @@ classdef Phase < handle
 | 
				
			|||||||
                   end
 | 
					                   end
 | 
				
			||||||
                   obj.Video(:,:,1,p) = dicomread(filename); % Read the DICOM files in the folder
 | 
					                   obj.Video(:,:,1,p) = dicomread(filename); % Read the DICOM files in the folder
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                list_array = 2:1:obj.NumberOfSlices;
 | 
				
			||||||
 | 
					                list = {'2','3','4','5','6'};
 | 
				
			||||||
 | 
					                [indx,tf] = listdlg('ListString',list);
 | 
				
			||||||
 | 
					                obj.CurrentSlice = indx;
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                obj.nFrames = obj.nFrames/obj.NumberOfSlices;
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                obj.Video = zeros(obj.xImageSize, obj.yImageSize, 1, obj.nFrames, 'uint8');
 | 
				
			||||||
 | 
					                for p=1:obj.nFrames
 | 
				
			||||||
 | 
					                   shift = (obj.CurrentSlice-1)*obj.nFrames;
 | 
				
			||||||
 | 
					                   filename = fullfile(directory, dicomFiles(shift+p).name );
 | 
				
			||||||
 | 
					                   Info=dicominfo(filename);
 | 
				
			||||||
 | 
					                   if Info.Width~=obj.xImageSize || Info.Height~=obj.yImageSize
 | 
				
			||||||
 | 
					                       error('invalid image dimensions')
 | 
				
			||||||
 | 
					                   end
 | 
				
			||||||
 | 
					                   obj.Video(:,:,1,p) = dicomread(filename); % Read the DICOM files in the folder
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        % Gets the mean intensity value of the image sequence usin the
 | 
					        % Gets the mean intensity value of the image sequence usin the
 | 
				
			||||||
@@ -63,12 +81,21 @@ classdef Phase < handle
 | 
				
			|||||||
        function GetSignal(obj)
 | 
					        function GetSignal(obj)
 | 
				
			||||||
             d2IFT = ifft2(obj.Video); % performs Inverse Fourier Transform
 | 
					             d2IFT = ifft2(obj.Video); % performs Inverse Fourier Transform
 | 
				
			||||||
             d2IFT_shifted = fftshift(d2IFT);
 | 
					             d2IFT_shifted = fftshift(d2IFT);
 | 
				
			||||||
 | 
					             
 | 
				
			||||||
 | 
					%              video = implay(abs(d2IFT_shifted));
 | 
				
			||||||
 | 
					%              set(video.Parent, 'Name', '2D IFT of the Images Sequence along time');
 | 
				
			||||||
 | 
					             
 | 
				
			||||||
             for i=1:obj.nFrames
 | 
					             for i=1:obj.nFrames
 | 
				
			||||||
                obj.MeanIntensity(:,i) = d2IFT_shifted(floor(obj.yImageSize/2),floor(obj.xImageSize/2),i); % extracts intensity of the central point in k-space for every frame
 | 
					                obj.MeanIntensity(:,i) = d2IFT_shifted(floor(obj.yImageSize/2),floor(obj.xImageSize/2),i); % extracts intensity of the central point in k-space for every frame
 | 
				
			||||||
             end
 | 
					             end
 | 
				
			||||||
             obj.MeanIntensity = abs(obj.MeanIntensity);
 | 
					             obj.MeanIntensity = abs(obj.MeanIntensity);
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        function DisplayIntensity(obj)
 | 
				
			||||||
 | 
					            plot(obj.MeanIntensity,'-s','LineWidth',0.8,'MarkerSize',4);
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        % Perfomrs Empirical Mode Decomposition
 | 
					        % Perfomrs Empirical Mode Decomposition
 | 
				
			||||||
        function GetEMD(obj)
 | 
					        function GetEMD(obj)
 | 
				
			||||||
            obj.IMFs = rParabEmd__L(obj.MeanIntensity,40,40,1);
 | 
					            obj.IMFs = rParabEmd__L(obj.MeanIntensity,40,40,1);
 | 
				
			||||||
@@ -99,7 +126,7 @@ classdef Phase < handle
 | 
				
			|||||||
                set(video.Parent, 'Name', title);
 | 
					                set(video.Parent, 'Name', title);
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        function Display(obj)
 | 
					        function DisplayValues(obj)
 | 
				
			||||||
            plot(obj.Values,'-s','LineWidth',0.8,'MarkerSize',4);
 | 
					            plot(obj.Values,'-s','LineWidth',0.8,'MarkerSize',4);
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,12 @@
 | 
				
			|||||||
classdef RespiratoryPhase < Phase
 | 
					classdef RespiratoryPhase < Phase
 | 
				
			||||||
    properties
 | 
					    properties
 | 
				
			||||||
        FullPhase = Phase;
 | 
					        FullPhase = Phase;
 | 
				
			||||||
 | 
					        IMF = uint32(0);
 | 
				
			||||||
        InspirationPositions = [];
 | 
					        InspirationPositions = [];
 | 
				
			||||||
        ExpirationPositions = [];
 | 
					        ExpirationPositions = [];
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    properties % (GetAccess = private) should become private
 | 
					    properties % (GetAccess = private) should become private
 | 
				
			||||||
        IMF = uint32(0);
 | 
					 | 
				
			||||||
        InspirationTreshold = double(0);
 | 
					        InspirationTreshold = double(0);
 | 
				
			||||||
        ExpirationTreshold = double(0);
 | 
					        ExpirationTreshold = double(0);
 | 
				
			||||||
        MaxRespPhase = double(0);
 | 
					        MaxRespPhase = double(0);
 | 
				
			||||||
@@ -18,25 +18,23 @@ classdef RespiratoryPhase < Phase
 | 
				
			|||||||
            if nargin==0;return;end
 | 
					            if nargin==0;return;end
 | 
				
			||||||
            % gets properties of superclass
 | 
					            % gets properties of superclass
 | 
				
			||||||
            obj.FullPhase = Phase.ModePhases;
 | 
					            obj.FullPhase = Phase.ModePhases;
 | 
				
			||||||
            obj.WorkLoad = Phase.WorkLoad;
 | 
					%             obj.WorkLoad = Phase.WorkLoad;
 | 
				
			||||||
            obj.Video = Phase.Video;
 | 
					            obj.Video = Phase.Video;
 | 
				
			||||||
       end
 | 
					       end
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
    % Choose the correct IMF depending on the work load
 | 
					    % Choose the correct IMF depending on the work load
 | 
				
			||||||
    function SelectPhase(obj)
 | 
					    function SelectPhase(obj)
 | 
				
			||||||
            if strcmp(obj.WorkLoad,'Rest')
 | 
					            prompt = {'Choose the IMF representing respiratory phase:'};
 | 
				
			||||||
                imf_number = 5;
 | 
					            dlgtitle = 'Respiratory Phase';
 | 
				
			||||||
            else if strcmp(obj.WorkLoad,'Exercise')
 | 
					            dims = [1 60];
 | 
				
			||||||
                    imf_number = 4;
 | 
					            definput = {'5'};
 | 
				
			||||||
                else if strcmp(obj.WorkLoad,'Continuous Acquisition')
 | 
					            opts.Interpreter = 'tex';
 | 
				
			||||||
                        imf_number = 5;
 | 
					            answer = inputdlg(prompt,dlgtitle,dims,definput,opts);
 | 
				
			||||||
                    end
 | 
					            obj.IMF = str2num(answer{1})
 | 
				
			||||||
                end
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
            % SHOULD TRY TO USE GETPHASE FUNCTION
 | 
					            % SHOULD TRY TO USE GETPHASE FUNCTION
 | 
				
			||||||
%             obj.IMF = imf_number;
 | 
					%             obj.IMF = imf_number;
 | 
				
			||||||
%             GetPhase@Phase(obj.FullPhase,obj.IMF);
 | 
					%             GetPhase@Phase(obj.FullPhase,obj.IMF);
 | 
				
			||||||
            obj.Values = obj.FullPhase(imf_number,:); %Phase corresponding to respiratory phase
 | 
					            obj.Values = obj.FullPhase(obj.IMF,:); %Phase corresponding to respiratory phase
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        % Detects the frame's positions of inspiration moments
 | 
					        % Detects the frame's positions of inspiration moments
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					% This function was extracted from https://nl.mathworks.com/matlabcentral/fileexchange/21409-empirical-mode-decomposition
 | 
				
			||||||
 | 
					%  Authors: Raul Rato (rtr@uninova.DOT.pt) and Manuel Ortigueira (mdortigueira@uninova.pt or mdo@fct.unl.pt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function rParabEmd = rParabEmd__L (x, qResol, qResid, qAlfa)
 | 
					function rParabEmd = rParabEmd__L (x, qResol, qResid, qAlfa)
 | 
				
			||||||
dbstop if warning
 | 
					dbstop if warning
 | 
				
			||||||
if(nargin~=4), error('rParabEmd__L: Use with 4 inputs.'), end
 | 
					if(nargin~=4), error('rParabEmd__L: Use with 4 inputs.'), end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,6 @@
 | 
				
			|||||||
% Test Script
 | 
					% Test Script
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% TO DO LIST:
 | 
					% TO DO LIST:
 | 
				
			||||||
% - Heart beat reconstruction with steady respiratory phase
 | 
					 | 
				
			||||||
% - Multislice analysis
 | 
					 | 
				
			||||||
% - Choose IMF based on Instantaneous Frequency
 | 
					 | 
				
			||||||
% - Error messages and robustness of the methods
 | 
					% - Error messages and robustness of the methods
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clear classes
 | 
					clear classes
 | 
				
			||||||
@@ -12,33 +9,53 @@ clear classes
 | 
				
			|||||||
phase = Phase; % creates a Phase object
 | 
					phase = Phase; % creates a Phase object
 | 
				
			||||||
phase.GetData; % extracts data
 | 
					phase.GetData; % extracts data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% Visualize data
 | 
				
			||||||
 | 
					phase.ShowFrames(:,'cine Images');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%% Time Information
 | 
					%% Time Information
 | 
				
			||||||
time = 0:1:phase.nFrames-1;
 | 
					time = 0:1:phase.nFrames-1;
 | 
				
			||||||
repetitionTime = (1/15); % time between samples
 | 
					repetitionTime = (1/13); % time between samples
 | 
				
			||||||
time = repetitionTime*time; % sampling moments in time
 | 
					time = repetitionTime*time; % sampling moments in time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%% Workload information
 | 
					%% Instantaneous Phase Extraction (cardiac and respiratory)
 | 
				
			||||||
% Should become a set method
 | 
					 | 
				
			||||||
% User sets the workload, important to choose the correct IMF
 | 
					 | 
				
			||||||
list = {'Rest','Exercise','Continuous Acquisition'};
 | 
					 | 
				
			||||||
[indx,tf] = listdlg('ListString',list);
 | 
					 | 
				
			||||||
str = list{indx};
 | 
					 | 
				
			||||||
phase.WorkLoad = str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% Instantaneous Phase Extraction (cardiac ad respiratory)
 | 
					 | 
				
			||||||
phase.GetSignal; % gets mean intensity level of the images
 | 
					phase.GetSignal; % gets mean intensity level of the images
 | 
				
			||||||
 | 
					% phase.DisplayIntensity;
 | 
				
			||||||
 | 
					% title('Mean Intensity Value');
 | 
				
			||||||
 | 
					% te=repetitionTime;
 | 
				
			||||||
 | 
					% xt=get(gca,'xtick');
 | 
				
			||||||
 | 
					% set(gca,'xticklabel',arrayfun(@num2str,xt*te,'un',0)); % adjust x axis to time values
 | 
				
			||||||
 | 
					% xlabel('Time (sec)');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phase.GetEMD; % decompose the siganl using EMD
 | 
					phase.GetEMD; % decompose the siganl using EMD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% Complot(phase.IMFs);
 | 
				
			||||||
 | 
					% te=repetitionTime;
 | 
				
			||||||
 | 
					% xt=get(gca,'xtick');
 | 
				
			||||||
 | 
					% set(gca,'xticklabel',arrayfun(@num2str,xt*te,'un',0)); % adjust x axis to time values
 | 
				
			||||||
 | 
					% title('Empirical Mode Decomposition');
 | 
				
			||||||
 | 
					% xlabel('Time (sec)');
 | 
				
			||||||
 | 
					% legend('IMF1','IMF2','IMF3','IMF4','IMF5','IMF6','IMF7');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phase.GetModes; % turn the modes into phase information
 | 
					phase.GetModes; % turn the modes into phase information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					figure
 | 
				
			||||||
 | 
					Complot(phase.ModePhases)
 | 
				
			||||||
 | 
					title('IMF Phases');
 | 
				
			||||||
 | 
					te=repetitionTime;
 | 
				
			||||||
 | 
					xt=get(gca,'xtick');
 | 
				
			||||||
 | 
					set(gca,'xticklabel',arrayfun(@num2str,xt*te,'un',0)); % adjust x axis to time values
 | 
				
			||||||
 | 
					xlabel('Time (sec)');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cardiac_phase = CardiacPhase(phase); % creates a CradiacPhase object
 | 
					cardiac_phase = CardiacPhase(phase); % creates a CradiacPhase object
 | 
				
			||||||
cardiac_phase.SelectPhase; % choose the right imf besed on the work load IMPROVE
 | 
					cardiac_phase.SelectPhase; % choose the cardiac imf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
respiratory_phase = RespiratoryPhase(phase); % creates a RespiratoryPhase object
 | 
					respiratory_phase = RespiratoryPhase(phase); % creates a RespiratoryPhase object
 | 
				
			||||||
respiratory_phase.SelectPhase; % choose the right imf based on the work load IMPROVE
 | 
					respiratory_phase.SelectPhase; % choose the respiratory imf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cardiac_phase.Display
 | 
					figure
 | 
				
			||||||
 | 
					cardiac_phase.DisplayValues
 | 
				
			||||||
hold on
 | 
					hold on
 | 
				
			||||||
respiratory_phase.Display
 | 
					respiratory_phase.DisplayValues
 | 
				
			||||||
% hold on
 | 
					% hold on
 | 
				
			||||||
% hline = refline([0 cardiac_phase.SystoleTreshold]); % Reference line for systole treshold phase
 | 
					% hline = refline([0 cardiac_phase.SystoleTreshold]); % Reference line for systole treshold phase
 | 
				
			||||||
% hline.Color = 'b';
 | 
					% hline.Color = 'b';
 | 
				
			||||||
@@ -63,6 +80,10 @@ set(gca,'xticklabel',arrayfun(@num2str,xt*te,'un',0)); % adjust x axis to time v
 | 
				
			|||||||
xlabel('Time (sec)');
 | 
					xlabel('Time (sec)');
 | 
				
			||||||
ylabel('Phase(rad)');
 | 
					ylabel('Phase(rad)');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% File with Cardiac and Respiratory Phase
 | 
				
			||||||
 | 
					file_matrix = [cardiac_phase.Values; respiratory_phase.Values];
 | 
				
			||||||
 | 
					csvwrite('phase_file.csv',file_matrix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%% Cardiac and Respiratory events
 | 
					%% Cardiac and Respiratory events
 | 
				
			||||||
cardiac_phase.Diastole % detects diastolic events
 | 
					cardiac_phase.Diastole % detects diastolic events
 | 
				
			||||||
cardiac_phase.Systole % detects systolic events
 | 
					cardiac_phase.Systole % detects systolic events
 | 
				
			||||||
@@ -76,9 +97,40 @@ DE = intersect(cardiac_phase.DiastolePositions,respiratory_phase.ExpirationPosit
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
% Show frames of the different cardiac/respiratory events
 | 
					% Show frames of the different cardiac/respiratory events
 | 
				
			||||||
phase.ShowFrames(SI,'End-systolic frames in inpiration');
 | 
					phase.ShowFrames(SI,'End-systolic frames in inpiration');
 | 
				
			||||||
 | 
					directory = 'Systole in Inspiration'
 | 
				
			||||||
 | 
					mkdir(directory);
 | 
				
			||||||
 | 
					for i=1:length(SI)
 | 
				
			||||||
 | 
					   baseFileName = sprintf('SI%d.dcm', i);
 | 
				
			||||||
 | 
					   fullFileName = fullfile(directory, baseFileName); 
 | 
				
			||||||
 | 
					   dicomwrite(phase.Video(:,:,1,SI(i)), fullFileName);
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phase.ShowFrames(SE,'End-systolic frames in expiration');
 | 
					phase.ShowFrames(SE,'End-systolic frames in expiration');
 | 
				
			||||||
 | 
					directory = 'Systole in Expiration'
 | 
				
			||||||
 | 
					mkdir(directory);
 | 
				
			||||||
 | 
					for i=1:length(SE)
 | 
				
			||||||
 | 
					   baseFileName = sprintf('SE%d.dcm', i);
 | 
				
			||||||
 | 
					   fullFileName = fullfile(directory, baseFileName); 
 | 
				
			||||||
 | 
					   dicomwrite(phase.Video(:,:,1,SE(i)), fullFileName);
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phase.ShowFrames(DI,'End-diastolic frames in inpiration');
 | 
					phase.ShowFrames(DI,'End-diastolic frames in inpiration');
 | 
				
			||||||
 | 
					directory = 'Diastole in Inspiration'
 | 
				
			||||||
 | 
					mkdir(directory);
 | 
				
			||||||
 | 
					for i=1:length(DI)
 | 
				
			||||||
 | 
					   baseFileName = sprintf('DI%d.dcm', i);
 | 
				
			||||||
 | 
					   fullFileName = fullfile(directory, baseFileName); 
 | 
				
			||||||
 | 
					   dicomwrite(phase.Video(:,:,1,DI(i)), fullFileName);
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phase.ShowFrames(DE,'End-diastolic frames in expiration');
 | 
					phase.ShowFrames(DE,'End-diastolic frames in expiration');
 | 
				
			||||||
 | 
					directory = 'Diastole in Expiration'
 | 
				
			||||||
 | 
					mkdir(directory);
 | 
				
			||||||
 | 
					for i=1:length(DE)
 | 
				
			||||||
 | 
					   baseFileName = sprintf('DE%d.dcm', i);
 | 
				
			||||||
 | 
					   fullFileName = fullfile(directory, baseFileName); 
 | 
				
			||||||
 | 
					   dicomwrite(phase.Video(:,:,1,DE(i)), fullFileName);
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%% Heart Beat Reconstruction
 | 
					%% Heart Beat Reconstruction
 | 
				
			||||||
n_ranges = 30; % number of phase ranges
 | 
					n_ranges = 30; % number of phase ranges
 | 
				
			||||||
@@ -98,9 +150,5 @@ for i=1:1:n_ranges
 | 
				
			|||||||
    j = oredered_index{i};
 | 
					    j = oredered_index{i};
 | 
				
			||||||
    new_index{i} = k(j); % ordered indexes
 | 
					    new_index{i} = k(j); % ordered indexes
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
selected_range = n_ranges-2;
 | 
					selected_range = n_ranges-2; % optional range
 | 
				
			||||||
phase.ShowFrames(new_index{selected_range},'Heart Beat Reconstruction');
 | 
					phase.ShowFrames(new_index{selected_range},'Heart Beat Reconstruction');
 | 
				
			||||||
 | 
					 | 
				
			||||||
% c = ImageSequence
 | 
					 | 
				
			||||||
% c.ToBeSetByUser=15
 | 
					 | 
				
			||||||
% c.ToBeSetByUser=true
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user