圖像分割(四)圖像分割評價標準及代碼

強烈建議參考如下兩篇文章

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)

Dice_Ratio:

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

Jaccard_Index:

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

Avg_PerpenDist (得到 apd 之後,還需要乘以像素的物理距離,纔是真正的 apd 值):

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

ConformityCoefficient:

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

Precision:

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

Recall:

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補圖:




轉載於博客:https://blog.csdn.net/yangyangyang20092010/article/details/51637073
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章