2016-11-02 31 views
0

Я использую 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

Попробуйте запустить фильтр по набору итераций [0,1 ... 4]. После этого вы получите Ковариантность и Среднее значение из фильтра и запустите LabelStatisticsImageFilter, чтобы посмотреть статистику выхода. Поскольку вероятность вероятности слишком мала, вы, вероятно, сталкиваетесь с проблемами с числовой стабильностью с такой небольшой дисперсией. В чем разница ваших семян? Также вы заглянули в параметр InitialNeighborhoodRadius? – blowekamp

+0

@blowekamp, ​​спасибо.Я публикую эти вещи в части PS2 моего вопроса. Пожалуйста, взгляните на это. –

+0

Можете ли вы также добавить статистический фильтр метки? – blowekamp

ответ

2

Может быть пара проблем.

1) Вы говорите, что выход ничего. Ожидаемый результат - изображение 0 и 1. Если это изображение отображается напрямую, многие представления будут показывать только черное изображение. Простая визуализация может быть несколько на 255, или вы можете использовать LabelToRGBImageFilter. Кроме того, вы можете запустить LabelStatisticsImageFilter.

2) Это не похоже на правильный фильтр для ввода и использования. Документации для этого фильтра говорят:

Этот фильтр извлекает связное множество пикселей, чьи пиксели интенсивность согласуются со статистикой пикселей точки семян. Среднее значение и дисперсия по соседству (8-связный, 26-подключенный и т. Д.) рассчитываются для начальной точки. Затем сгруппированы пиксели, связанные с этим семенем , точка, значения которых находятся в пределах доверительного интервала для посевного объекта .

Это означает, что если вы дадите ему только пиксель с> 0.999, то оценочное среднее и дисперсия будут очень плотными, и регион не будет сильно расти. Снова вы можете использовать LabelStatisticsImageFilter для вычисления статистики интенсивностей под изображением метки.

Использование ConnectedThresholdImageFilter с ручной установкой нижних границ порога может быть более подходящим. Вы также можете изучить DoubleThresholdImageFilter, который выполняет эти два действия (выбор семян по порогу, а затем увеличение области до порога) в одном фильтре.

+0

Благодарим вас за ответ. Я добавил «PS:» на мой вопрос, чтобы ответить вам. Пожалуйста, прочтите это. Параметр numberOfIterations = 4, множитель = 3.5, сделает регион эффективным, когда будет задано одно семя. Но когда я использую больше семян, регион становится все меньше и меньше. –