在追踪结束以后,常需要计算追踪结果的SD和SSD,通过这三个文件可以实现SD、SSD的计算,通过与批量插件运行相结合可以直接得到结果,然后该结果可以在matlab中进行下一步的处理,如写入到excel文件中等。
同理,在CalculateMetric.m文件中可以再加入其他的测量指标,如DIADEM metric等。
CalculateMetric.m 函数
function [MetricOut] = CalculateMetric(groudTruthName,inputswc)
%CalculateMetric 计算SD、SSD
MetricOut=zeros(2,1);
%对应修改
V3DIOPATH='D:\v3d_2013\v3d_external\matlab_io_basicdatatype';
addpath(V3DIOPATH)
if ~exist(groudTruthName,'file')
disp([groudTruthName ' input file not exist'])
return
end
if ~exist(inputswc,'file')
disp([inputswc ' input file not exist'])
return
end
MetricOut(1,1)=calculat_neuron_SD(groudTruthName,inputswc);
MetricOut(2,1)=calculat_neuron_SSD(groudTruthName,inputswc);
end
calculat_neuron_SD.m 函数
function [ result ] = calculat_neuron_SD(true_ground_truth_name,true_experiment_name)
% V3DPATH='C:\Users\204\Desktop\data analyse\DiademMetric\matlab_io_basicdatatype';
% addpath(V3DPATH)
swc_file_experiment_name=[true_experiment_name '.swc'];
swc_file_groundtruth_name=[true_ground_truth_name '.swc'];
run_resample_swc(true_ground_truth_name,1,swc_file_groundtruth_name);
run_resample_swc(true_experiment_name,1,swc_file_experiment_name);
swc_gt_read=load_v3d_swc_file(swc_file_groundtruth_name);
swc_exp_read=load_v3d_swc_file(swc_file_experiment_name);
swc_gt=swc_gt_read(:,3:5);
swc_exp=swc_exp_read(:,3:5);
sum_distance=0;
for i=1:length(swc_exp)
min_distance=10000;
for j=1:length(swc_gt)
distance=sqrt(((swc_gt(j,1)-swc_exp(i,1))^2+(swc_gt(j,2)-(swc_exp(i,2)))^2+(swc_gt(j,3)-swc_exp(i,3))^2));
if distance<min_distance
min_distance=distance;
end
end
sum_distance=min_distance+sum_distance;
end
mean_distance=sum_distance/length(swc_exp);
reverse_sum_distance=0;
for i=1:length(swc_gt)
min_distance=10000;
for j=1:length(swc_exp)
distance=sqrt(((swc_exp(j,1)-swc_gt(i,1))^2+(swc_exp(j,2)-(swc_gt(i,2)))^2+(swc_exp(j,3)-swc_gt(i,3))^2));
if distance<min_distance
min_distance=distance;
end
end
reverse_sum_distance=min_distance+reverse_sum_distance;
end
reverse_mean_distance=reverse_sum_distance/length(swc_gt);
result=(mean_distance+reverse_mean_distance)/2;
if exist(swc_file_experiment_name,'file')
delete(swc_file_experiment_name)
end
if exist(swc_file_groundtruth_name,'file')
delete(swc_file_groundtruth_name)
end
end
calculat_neuron_SSD.m 函数
function [ result ] = calculat_neuron_SSD(true_ground_truth_name,true_experiment_name)
% V3DPATH='C:\Users\204\Desktop\data analyse\DiademMetric\matlab_io_basicdatatype';
% addpath(V3DPATH)
swc_file_experiment_name=[true_experiment_name '.swc'];
swc_file_groundtruth_name=[true_ground_truth_name '.swc'];
run_resample_swc(true_ground_truth_name,1,swc_file_groundtruth_name);
run_resample_swc(true_experiment_name,1,swc_file_experiment_name);
swc_gt_read=load_v3d_swc_file(swc_file_groundtruth_name);
swc_exp_read=load_v3d_swc_file(swc_file_experiment_name);
swc_gt=swc_gt_read(:,3:5);
swc_exp=swc_exp_read(:,3:5);
false_num=0;
sum_min_distance=0;
for i=1:length(swc_gt)
min_distance=200;
for j=1:length(swc_exp)
distance=sqrt(((swc_exp(j,1)-swc_gt(i,1))^2+(swc_exp(j,2)-(swc_gt(i,2)))^2+(swc_exp(j,3)-swc_gt(i,3))^2));
if distance<min_distance
min_distance=distance;
end
end
if min_distance>2
sum_min_distance=sum_min_distance+min_distance;
false_num=false_num+1;
end
end
SSD=sum_min_distance/false_num;
reverse_false_num=0;
reverse_sum_min_distance=0;
for i=1:length(swc_exp)
reverse_min_distance=200;
for j=1:length(swc_gt)
distance=sqrt(((swc_exp(i,1)-swc_gt(j,1))^2+(swc_exp(i,2)-(swc_gt(j,2)))^2+(swc_exp(i,3)-swc_gt(j,3))^2));
if distance<reverse_min_distance
reverse_min_distance=distance;
end
end
if reverse_min_distance>2
reverse_sum_min_distance=reverse_sum_min_distance+reverse_min_distance;
reverse_false_num=reverse_false_num+1;
end
end
reverse_SSD=reverse_sum_min_distance/reverse_false_num;
result=(reverse_SSD+SSD)/2;
if exist(swc_file_experiment_name,'file')
delete(swc_file_experiment_name)
end
if exist(swc_file_groundtruth_name,'file')
delete(swc_file_groundtruth_name)
end
end