Я использую SimpleITK's VectorConfidenceConnectedImageFilter
. Я чувствую смущение его поведением при наличии нескольких семян.Путаница о поведении нескольких семян фильтра изображений ConfidenceConnected. Больше семян, большая площадь?
Я занимаюсь 3D-сегментацией желчного протока. Во-первых, я получил карту вероятности с использованием SVM (Pairwise Coupling). Затем я получил 228 очков, вероятность которых больше 0,999999. Используя эти 228 баллов в качестве семян, я не получил НИЧЕГО от VectorConfidenceConnectedImageFilter
. Кстати, семена 228 могут находиться очень близко друг к другу. Вот некоторые семена, например.
Seed information:
Seed_index Seed_x_y_z prob CT_value_a CT_value_b
0, (161, 241, 163), 0.9999991059303284, 24, 19
1, (161, 242, 163), 0.9999989867210388, 33, 23
2, (203, 215, 164), 0.999999463558197, 3, 7
3, (161, 241, 164), 0.9999989867210388, 28, 22
4, (162, 242, 164), 0.9999989867210388, 35, 24
5, (161, 241, 165), 0.9999991059303284, 27, 22
6, (162, 241, 165), 0.9999992847442627, 30, 25
7, (162, 242, 165), 0.9999992251396179, 31, 22
8, (162, 242, 166), 0.9999991059303284, 33, 27
9, (165, 241, 169), 0.9999992251396179, 24, 26
10, (166, 241, 170), 0.9999994039535522, 12, 25
11, (166, 242, 170), 0.9999996423721313, 15, 19
12, (167, 242, 170), 0.9999997019767761, 14, 22
13, (165, 243, 170), 0.9999990463256836, 15, 20
14, (166, 243, 170), 0.9999996423721313, 13, 20
15, (167, 243, 170), 0.9999991655349731, 21, 16
16, (166, 241, 171), 0.9999995827674866, 11, 19
17, (167, 241, 171), 0.9999996423721313, 7, 23
18, (166, 242, 171), 0.9999992251396179, 7, 14
19, (167, 242, 171), 0.9999998211860657, 11, 13
20, (168, 242, 171), 0.9999997615814209, 12, 19
21, (168, 243, 171), 0.9999991059303284, 16, 11
22, (150, 297, 171), 0.9999990463256836, 61, 56
23, (149, 208, 172), 0.9999992847442627, 45, 38
24, (149, 209, 172), 0.999999463558197, 45, 35
25, (167, 240, 172), 0.9999989867210388, 13, 28
26, (166, 241, 172), 0.9999993443489075, 10, 19
27, (167, 241, 172), 0.9999992251396179, 9, 13
...
ковариационная матрица при использовании первых 25 семян:
Covariance matrix:
[[ nan nan nan]
[ nan nan nan]
[ nan nan nan]]
Как я мог получить nan
в ковариационной матрице?
Затем я попытался использовать меньшее количество семян. Используя первые 5 семян, я могу получить результат сегментации. Используя первые 20 семян, я также могу получить результат сегментации. Сегментированная область кажется меньшей, но не является подмножеством ранее сегментированной области. Когда я использую первые 25 семян, у меня нет НИЧЕГО сегментации.
Как это могло случиться?
Разве не должно быть больше семян, все больше и больше растут?
Кстати, настройки numberOfIterations
и multiplier
всегда одинаковы.
numberOfIterations=4, multiplier=3.5
Я прочитал документ (https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1VectorConfidenceConnectedImageFilter.html#details) и не нашел ничего, чтобы объяснить это.
PS:
То, что я хочу, чтобы сегмент является желчный проток. Когда выход нормальный, сегментированная область будет отмечена значением 1. По умолчанию «вывод ничего», я имею в виду, что все вокселы, даже те, которые я использую в качестве семян, отмечены 0, и поэтому ничего не сегментируется.
Официальное объяснение фильтра - это то, что происходит для одной точки семян. Что происходит, когда я ввожу несколько точек посева? Я ввожу 2 семена и изменяю их порядок. Я нашел порядок ввода семян. Выходная сегментированная область связана с первым семенем, но не может быть связана со вторым семенем.
Я хочу ограничить количество семян и хочу, чтобы регион вырос из самых заслуживающих доверия точек. Поэтому я использую 0.999999 для пороговых значений. Фактически, выход с использованием первых 5 семян является перспективным. Но я не знаю, почему становится больше семян, меньших (но не подмножеств).
После того как я изменил параметры
numberOfIterations=2, multiplier=2.5
Используя первые 25 семян будет ОК. Однако сегментированный результат намного больше, чем я хочу. Почти 1/2 выходного объема отмечен 1.
PS2 (добавлено как предложено @blowekamp): Настройки параметров:
seed_vol = sitk.Image(seg.GetSize(), sitk.sitkUInt8)
seed_vol.CopyInformation(seg)
for seed in seeds_xyz[0:25]:
seed_vol[seed] = 1
filter = sitk.VectorConfidenceConnectedImageFilter()
filter.SetSeedList(seeds_xyz[0:25])
filter.SetMultiplier(2.5)
stat_filter = sitk.LabelStatisticsImageFilter()
for iteration in range(0,5):
filter.SetNumberOfIterations(iteration)
seg = filter.Execute(img_multi)
print("Number of iteration: {0}".format(iteration))
print("Mean from VectorConfidenceConnectedImageFilter: {0}".format(filter.GetMean()))
print("Covariance matrix from VectorConfidenceConnectedImageFilter:")
print((nine_ele_list_to_matrix(filter.GetCovariance())))
stat_filter.Execute(predicted_prob_vol, seg)
print("Mean from LabelStatisticsImageFilter for grown output: {0}".format(stat_filter.GetMean(1)))
print("Covariance from LabelStatisticsImageFilter for grown output: {0}".format(stat_filter.GetVariance(1)))
print("The labels: {0}. Label count of statistics filter: {1}".format(stat_filter.GetLabels(), stat_filter.GetNumberOfLabels()))
stat_filter.Execute(predicted_prob_vol, seed_vol)
print("Mean from LabelStatisticsImageFilter for seeds: {0}".format(stat_filter.GetMean(1)))
print("Covariance from LabelStatisticsImageFilter for seeds: {0}".format(stat_filter.GetVariance(1)))
print()
Выход:
Number of iteration: 0
Mean from VectorConfidenceConnectedImageFilter: (0.9623870230024614, 31.73925925925926, 25.998518518518512)
Covariance matrix from VectorConfidenceConnectedImageFilter:
[[ 1.82135131e-02 -7.92697795e-01 -3.38983449e-01]
[ -7.92697795e-01 1.18911385e+02 5.24617833e+01]
[ -3.38983449e-01 5.24617833e+01 4.07701509e+01]]
Mean from LabelStatisticsImageFilter for grown output: 0.8556543207298526
Covariance from LabelStatisticsImageFilter for grown output: 0.029425739235467253
The labels: (0, 1). Label count of statistics filter: 2
Mean from LabelStatisticsImageFilter for seeds: 0.9999993205070495
Covariance from LabelStatisticsImageFilter for seeds: 7.25345709421769e-14
Number of iteration: 1
Mean from VectorConfidenceConnectedImageFilter: (0.8556543207298526, 28.868118168903834, 20.2249441915751)
Covariance matrix from VectorConfidenceConnectedImageFilter:
[[ 2.94248861e-02 -9.82479976e-01 -5.38478238e-01]
[ -9.82479976e-01 3.63929118e+02 2.06866705e+02]
[ -5.38478238e-01 2.06866705e+02 1.56397694e+02]]
Mean from LabelStatisticsImageFilter for grown output: 0.03871633721462062
Covariance from LabelStatisticsImageFilter for grown output: 0.02691964569621114
The labels: (0, 1). Label count of statistics filter: 2
Mean from LabelStatisticsImageFilter for seeds: 0.9999993205070495
Covariance from LabelStatisticsImageFilter for seeds: 7.25345709421769e-14
Number of iteration: 2
Mean from VectorConfidenceConnectedImageFilter: (0.038716337214620644, 55.72496796726461, 36.093515782149844)
Covariance matrix from VectorConfidenceConnectedImageFilter:
[[ 2.69196225e-02 -8.70168501e-01 -5.37384540e-01]
[ -8.70168501e-01 2.78522779e+02 1.66893233e+02]
[ -5.37384540e-01 1.66893233e+02 1.27068694e+02]]
Mean from LabelStatisticsImageFilter for grown output: 0.0
Covariance from LabelStatisticsImageFilter for grown output: 0.0
The labels: (0,). Label count of statistics filter: 1
Mean from LabelStatisticsImageFilter for seeds: 0.9999993205070495
Covariance from LabelStatisticsImageFilter for seeds: 7.25345709421769e-14
Number of iteration: 3
Mean from VectorConfidenceConnectedImageFilter: (nan, nan, nan)
Covariance matrix from VectorConfidenceConnectedImageFilter:
[[ nan nan nan]
[ nan nan nan]
[ nan nan nan]]
Mean from LabelStatisticsImageFilter for grown output: 0.0
Covariance from LabelStatisticsImageFilter for grown output: 0.0
The labels: (0,). Label count of statistics filter: 1
Mean from LabelStatisticsImageFilter for seeds: 0.9999993205070495
Covariance from LabelStatisticsImageFilter for seeds: 7.25345709421769e-14
Number of iteration: 4
Mean from VectorConfidenceConnectedImageFilter: (nan, nan, nan)
Covariance matrix from VectorConfidenceConnectedImageFilter:
[[ nan nan nan]
[ nan nan nan]
[ nan nan nan]]
Mean from LabelStatisticsImageFilter for grown output: 0.0
Covariance from LabelStatisticsImageFilter for grown output: 0.0
The labels: (0,). Label count of statistics filter: 1
Mean from LabelStatisticsImageFilter for seeds: 0.9999993205070495
Covariance from LabelStatisticsImageFilter for seeds: 7.25345709421769e-14
Что касается initialNeighborhoodRadius, я не ставил его вручную. По словам из документа,
"среднее значение и дисперсии по всем окрестностям (8-подключенному, 26 соединенных и т.д.) рассчитывается для точки семян."
. По умолчанию это не 26-связанный район?
Кроме того, в официальном документе есть что-то, называемое «начальная сегментация из начальной точки». Как управлять несколькими семенами в алгоритме? Является ли это чем-то вроде инициализации первого в первом порядке, используя несколько семян? Для фильтра с уверенным соединением можно увидеть что-то вроде начального возрастающего критерия, определяемого с помощью среднего и стандартного отклонения соседних точек посева. Когда я использую несколько семян, является ли этот первоначальный критерий, порожденный только первым семенем или всеми семенами непредвзято?
Попробуйте запустить фильтр по набору итераций [0,1 ... 4]. После этого вы получите Ковариантность и Среднее значение из фильтра и запустите LabelStatisticsImageFilter, чтобы посмотреть статистику выхода. Поскольку вероятность вероятности слишком мала, вы, вероятно, сталкиваетесь с проблемами с числовой стабильностью с такой небольшой дисперсией. В чем разница ваших семян? Также вы заглянули в параметр InitialNeighborhoodRadius? – blowekamp
@blowekamp, спасибо.Я публикую эти вещи в части PS2 моего вопроса. Пожалуйста, взгляните на это. –
Можете ли вы также добавить статистический фильтр метки? – blowekamp