图像分割评价标准 代码 (Image segmentation evaluation metrics code)
分享图像分割中用到的多种评价标准的代码,方便使用。若有问题还望各位提醒指正。
强烈建议参考如下两篇文章
Performance measure characterization for evaluating neuroimage segmentation algorithms
Metrics for evaluating 3D medical imagesegmentation: analysis, selection, and tool
main function (输入图像SEG 和 GT 分别为算法分割结果图像、分割金标准图像。对于多类分割的图像,需要先取出SEG和GT中对应的各类,然后使用下述函数单独计算该类。):
-
%
test all segmentation metric
functions
-
SEG = imread(
'0.png');
-
GT = imread(
'1.png');
-
-
% binarize
-
SEG = im2bw(SEG, 0.1);
-
GT = im2bw(GT, 0.1);
-
-
dr = Dice_Ratio(SEG, GT)
-
hd = Hausdorff_Dist(SEG, GT)
-
jaccard = Jaccard_Index(SEG, GT)
-
apd = Avg_PerpenDist(SEG, GT)
-
confm_index = ConformityCoefficient(SEG, GT)
-
precision = Precision(SEG, GT)
-
recall = Recall(SEG, GT)
-
function dr = Dice_Ratio(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
dice
ratio
-
dr
= 2*
double
(sum(uint8(SEG(:)
&
GT
(:)
))) /
double
(sum(uint8(SEG(:)
)) +
sum
(uint8(GT(:)
)));
-
end
Hausdorff_Dist (得到hd 之后,还需要乘以像素的物理距离,才是真正的 Hausdorff 距离)(update: 对于三维体数据中该距离的计算,ITK方面给出的计算流程是:先将体数据匹配到同一物理空间,然后进行计算,这就要求两个体数据必须具备相同的物理参数。所以本代码不适用于三维体数据的计算。):
-
function hd = Hausdorff_Dist(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
erode
element
-
s
=
cat
(3, [0 0 0 ; 0 1 0 ; 0 0 0], [0 1 0 ; 1 1 1 ; 0 1 0], [0 0 0 ; 0 1 0 ; 0 0 0])
;
-
% generate boundary
-
Boundary_SEG = logical(SEG) & ~imerode(logical(SEG), s);
-
Boundary_GT = logical(GT) & ~imerode(logical(GT), s);
-
% distance
to nearest boundary point
-
Dist_SEG = bwdist(Boundary_SEG,
'euclidean');
-
Dist_GT = bwdist(Boundary_GT,
'euclidean');
-
% distance
to another boundary
-
min_S2G = sort(Dist_GT( Boundary_SEG(:) ),
'ascend');
-
min_G2S = sort(Dist_SEG( Boundary_GT(:) ),
'ascend');
-
% hausdorff distance
-
hd = max(min_S2G(
end), min_G2S(
end));
-
end
-
function jaccard = Jaccard_Index(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
jaccard
index
-
jaccard
=
double
(sum(uint8(SEG(:)
&
GT
(:)
))) /
double
(sum(uint8(SEG(:)
|
GT
(:)
)));
-
end
-
function apd = Avg_PerpenDist(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
erode
element
-
s
=
cat
(3, [0 0 0 ; 0 1 0 ; 0 0 0], [0 1 0 ; 1 1 1 ; 0 1 0], [0 0 0 ; 0 1 0 ; 0 0 0])
;
-
% generate boundary
-
Boundary_SEG = logical(SEG) & ~imerode(logical(SEG), s);
-
Boundary_GT = logical(GT) & ~imerode(logical(GT), s);
-
% distance
to nearest boundary point
-
Dist_GT = bwdist(Boundary_GT,
'euclidean');
-
% distance
to another boundary
-
min_S2G = Dist_GT( Boundary_SEG(:) );
-
% average perpendicular distance from SEG
to GT
-
apd = sum(min_S2G(:)) / length(min_S2G(:));
-
end
-
function confm_index = ConformityCoefficient(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
dice
ratio
-
dr
= 2*
double
(sum(uint8(SEG(:)
&
GT
(:)
))) /
double
(sum(uint8(SEG(:)
)) +
sum
(uint8(GT(:)
)));
-
% conformity coefficient
-
confm_index = (
3*dr -
2) / dr;
-
end
-
function precision = Precision(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
precision
-
precision
=
double
(sum(uint8(SEG(:)
&
GT
(:)
))) /
double
(sum(uint8(SEG(:)
)));
-
end
-
function recall = Recall(SEG, GT)
-
%
SEG
,
GT
are
the
binary
segmentation
and
ground
truth
areas
,
respectively
.
-
%
recall
-
recall
=
double
(sum(uint8(SEG(:)
&
GT
(:)
))) /
double
(sum(uint8(GT(:)
)));
-
end
关于precision 和 recall 的wikipedia补图: