--- a +++ b/LV_evaluation_code/eval1.m @@ -0,0 +1,147 @@ +%eval.m +% Demonstration of how to use compare_contours.m and write_results.m and +% evaluate a batch of contours. +% +% Copyright: Imaging Research, Sunnybrook Health Sciences Centre, Toronto, ON, Canada +% Author: Perry Radau and Yingli Lu +% Email: perry.radau@gmail.com +% Version: 1.0 +% Date: 2009/06/29 +clc +clear all +warning off all +addpath 'functions' +%all studies with SC* prefix under the root_folder directory will be processed. +folder_prefix = 'SC*'; %This prefix is used for all studies. +process_all = true; %Set this to false if you want to only calc results for first two studies. +%DICOM folder name +para.dicom_foldername = 'DICOM'; +%manual contour folder name +para.manual_contour_foldername = 'contours-manual'; +para.manual_contour_subfoldername = 'IRCCI-expert'; +%auto contour folder name +para.auto_contour_foldername = 'contours-auto'; +para.auto_contour_subfoldername = 'auto2'; +%para.auto_contour_subfoldername = 'BIL_HS'; + +%If set to 1,normal is calculated based on auto contours, manual constour is the reference +%contour. If set to 0, normal is calculated based on manual contours, auto contour is the reference contour +para.auto_based_noraml = 1; + +%distance figure folder name +para.distance_figure_foldername = 'distance_figure'; +%DIDOM file name prefix +para.name_prefix = 'IM-0001-'; %according to the IM-0001-XXXX naming standard +para.digit_length=4; %IM-0001-XXXX, XXXX is 4 digits +%contour mode +para.inside_contour_mode = 'icontour'; +para.outside_contour_mode = 'ocontour'; +%save distance figure if set to 1 +para.save_figure = 1; +%segmentation mode +para.auto_seg_mode='auto'; +para.manual_seg_mode ='manual'; +%for average distance +para.init_value = -999; +para.dist_limit = 5; %mm. If a contour's average distance larger than this number, it will be considered as bad contour + +%Keep checking directory until valid +count = 0; +while (true) + %root_folder = input('Enter root folder: ', 's'); + root_folder=uigetdir; + results_folder = fullfile(root_folder,'results'); + dirs = dir([root_folder filesep folder_prefix]); + if ~isempty(dirs) + break; + end + %check path for input files + disp('Invalid root folder, retry.'); + count = count + 1; + if (count >= 3) + return; + end +end + +%initialize +all_compare_result = cell(length(dirs),1); + +if (process_all) + num_studies = length(dirs); +else + num_studies =3;%use this for testing. +end + +for i = 1:num_studies + display(['Processing: ' dirs(i).name]); + %full dicom folder. The DICOM images must be in this folder. + dicom_folder = [root_folder filesep dirs(i).name filesep para.dicom_foldername]; + % + %full manual contour folder.The last subfolder indicates which expert + %drew the manual contours. + manual_contour_folder = [root_folder filesep dirs(i).name filesep para.manual_contour_foldername filesep para.manual_contour_subfoldername]; + + if ~exist(manual_contour_folder,'dir') + display(['Missing manual contour folder:', manual_contour_folder]); + return; + end + + %full auto contour folder.The last subfolder indicates which algorithm + %was used. + auto_contour_folder = [root_folder filesep dirs(i).name filesep para.auto_contour_foldername filesep para.auto_contour_subfoldername]; + if ~exist(auto_contour_folder,'dir') + display(['Missing auto contour folder:', auto_contour_folder]); + continue; + end + %compare + compare_result = compare_contours(dicom_folder, manual_contour_folder, auto_contour_folder,para); + %record results. + %The '_i' indicates inner contour, + %The '_o' indicates outer contour. + %The '_pic' means Papillary Included in the LV Cavity, + %The '_pim' means Papillary Included in the Myocardium + + if ~isempty(compare_result) + all_compare_result{i}.patient_id = dirs(i).name; + all_compare_result{i}.auto_number_i = compare_result.auto_number_i; + all_compare_result{i}.auto_number_o= compare_result.auto_number_o; + all_compare_result{i}.manual_number_i = compare_result.manual_number_i; + all_compare_result{i}.manual_number_o = compare_result.manual_number_o; + all_compare_result{i}.detect_percent_i = compare_result.detect_percent_i; + all_compare_result{i}.detect_percent_o = compare_result.detect_percent_o; + all_compare_result{i}.good_percent_i = compare_result.good_percent_i; + all_compare_result{i}.good_percent_o = compare_result.good_percent_o; + + all_compare_result{i}.auto_ef_pic = compare_result.auto_ef_pic; + all_compare_result{i}.auto_ef_pim = compare_result.auto_ef_pim; + all_compare_result{i}.auto_lvm_pic= compare_result.auto_lvm_pic; + all_compare_result{i}.auto_lvm_pim= compare_result.auto_lvm_pim; + + all_compare_result{i}.manual_lvm_pic = compare_result.manual_lvm_pic; + all_compare_result{i}.manual_lvm_pim = compare_result.manual_lvm_pim; + all_compare_result{i}.manual_ef_pic = compare_result.manual_ef_pic; + all_compare_result{i}.manual_ef_pim = compare_result.manual_ef_pim; + + all_compare_result{i}.avg_dist_i = compare_result.avg_dist_i; + all_compare_result{i}.avg_dist_o = compare_result.avg_dist_o; + all_compare_result{i}.avg_dm_i = compare_result.avg_dm_i; + all_compare_result{i}.avg_dm_o = compare_result.avg_dm_o; + + % manual and auto volumes + all_compare_result{i}.auto_edv_pic= compare_result.auto_edv_pic; + all_compare_result{i}.auto_edv_pim= compare_result.auto_edv_pim; + all_compare_result{i}.manual_edv_pic = compare_result.manual_edv_pic; + all_compare_result{i}.manual_edv_pim = compare_result.manual_edv_pim; + + all_compare_result{i}.auto_esv_pic= compare_result.auto_esv_pic; + all_compare_result{i}.auto_esv_pim= compare_result.auto_esv_pim; + all_compare_result{i}.manual_esv_pic = compare_result.manual_esv_pic; + all_compare_result{i}.manual_esv_pim = compare_result.manual_esv_pim; + + end +end + +%write result to xls(excel) file +write_results(results_folder, all_compare_result); + +disp('Done!');