41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
|
import scipy.sparse as sparse
|
||
|
import numpy as np
|
||
|
|
||
|
__all__ = ['contingency_table']
|
||
|
|
||
|
|
||
|
def contingency_table(im_true, im_test, *, ignore_labels=(), normalize=False):
|
||
|
"""
|
||
|
Return the contingency table for all regions in matched segmentations.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
im_true : ndarray of int
|
||
|
Ground-truth label image, same shape as im_test.
|
||
|
im_test : ndarray of int
|
||
|
Test image.
|
||
|
ignore_labels : sequence of int, optional
|
||
|
Labels to ignore. Any part of the true image labeled with any of these
|
||
|
values will not be counted in the score.
|
||
|
normalize : bool
|
||
|
Determines if the contingency table is normalized by pixel count.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
cont : scipy.sparse.csr_matrix
|
||
|
A contingency table. `cont[i, j]` will equal the number of voxels
|
||
|
labeled `i` in `im_true` and `j` in `im_test`.
|
||
|
"""
|
||
|
|
||
|
im_test_r = im_test.ravel()
|
||
|
im_true_r = im_true.ravel()
|
||
|
ignored = np.zeros(im_true_r.shape, np.bool)
|
||
|
for label in ignore_labels:
|
||
|
ignored[im_true_r == label] = True
|
||
|
data = np.ones(im_true_r.shape)
|
||
|
data[ignored] = 0
|
||
|
if normalize:
|
||
|
data = data / im_true.size
|
||
|
cont = sparse.coo_matrix((data, (im_true_r, im_test_r))).tocsr()
|
||
|
return cont
|