warped segmentation
1st moving image
2nd fixed image
3rd predicted image
def dice_coef(segmentation1, segmentation2):
unique_labels1 = np.unique(segmentation1)
unique_labels2 = np.unique(segmentation2)
# Exclude background label (usually 0) from calculations
unique_labels1 = unique_labels1[unique_labels1 != 0]
unique_labels2 = unique_labels2[unique_labels2 != 0]
dice_scores = []
for label1 in unique_labels1:
# Create binary masks for each pair of labels
mask1 = (segmentation1 == label1).astype(int)
mask2 = (segmentation2 == label1).astype(int)
# Calculate Dice coefficient for the pair
intersection = np.sum(mask1 * mask2)
total_voxels = np.sum(mask1) + np.sum(mask2)
dice_coefficient = 2.0 * intersection / total_voxels if total_voxels > 0 else 0.0
dice_scores.append(dice_coefficient)
# Calculate average Dice score
average_dice_score = np.mean(dice_scores) if len(dice_scores) > 0 else 0.0
return average_dice_score
from scipy.spatial.distance import directed_hausdorff
def hausdorff_distance_fast(segmentation1, segmentation2):
unique_labels1 = np.unique(segmentation1)
# Exclude background label (usually 0) from calculations
unique_labels1 = unique_labels1[unique_labels1 != 0]
all_distances = []
for label1 in unique_labels1:
# Create binary masks for each pair of labels
mask1 = (segmentation1 == label1).astype(int)
mask2 = (segmentation2 == label1).astype(int)
# Find the directed Hausdorff distance for each pair
distance1 = directed_hausdorff(mask1, mask2)[0]
distance2 = directed_hausdorff(mask2, mask1)[0]
# Take the maximum distance for the pair
max_distance = max(distance1, distance2)
all_distances.append(max_distance)
# Calculate the overall Hausdorff distance
hausdorff_distance = np.mean(all_distances) if len(all_distances) > 0 else 0.0
return hausdorff_distance
link