2016-11-02 5 views
0

SimpleITK의 VectorConfidenceConnectedImageFilter을 사용하고 있습니다. 여러 개의 씨앗이 제공 될 때 그 행동에 대해 혼란 스럽습니다.ConfidenceConnected 이미지 필터의 여러 시드의 동작에 대한 혼란. 더 많은 씨앗, 더 큰 지역?

나는 담관의 3D 세분화를하고 있습니다. 먼저 SVM (Pairwise Coupling)을 사용하여 확률 맵을 얻었습니다. 그렇다면 확률이 0.999999 이상인 228 점을 얻었습니다. 이 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 개의 씨앗을 사용할 때 나는 아무 것도 나눌 수 없습니다.

어떻게 될 수 있습니까?

성장한 지역이 더 많은 씨앗이 아니어야합니다.

그런데 numberOfIterationsmultiplier의 설정은 항상 같습니다.

numberOfIterations=4, multiplier=3.5 

나는 문서 ( https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1VectorConfidenceConnectedImageFilter.html#details)를 읽고 이것을 설명하기 위해 아무것도 찾을 수 없습니다.

PS : 내가 세그먼트에 원하는 것은 담관이

입니다. 출력이 정상일 때 세그먼트 영역은 값 1로 표시됩니다. "출력은 무효"로, 모든 보셀, 심지어 시드로 사용하는 보셀이 0으로 표시되어 아무 것도 세그먼트 화되지 않습니다.

필터에 대한 공식적인 설명은 단일 시드 지점에서 일어나는 일입니다. 여러 시드 포인트를 입력하면 어떻게됩니까? 나는 2 개의 씨앗을 입력하고 그들의 순서를 바꾼다. 입력 씨앗의 순서가 중요하다는 것을 알았습니다. 출력 세그먼트 영역은 첫 번째 시드와 연결되지만 두 번째 시드와 연결되지 않을 수 있습니다.

나는 씨앗의 수를 제한하고 영역이 가장 신뢰할만한 지점에서 자라길 원합니다. 따라서 임계점 시드 포인트에 0.999999를 사용합니다. 사실, 처음 5 개 종자를 사용하는 생산은 실제로 유망한 것입니다. 그러나 왜 씨앗이 더 많고, 출력 영역이 더 작 으면서도 (하위 집합은 아님) 모르겠다.

나는 확인을 할 것이다 처음 25 개 씨앗을 사용

numberOfIterations=2, multiplier=2.5 

에 매개 변수를 변경 한 후. 그러나 분할 된 결과는 내가 원하는 것보다 훨씬 큽니다. 출력 볼륨의 거의 1/2에는 1로 표시되어 있습니다.(@blowekamp에 의해 제안 추가)

PS2 : 매개 변수의 설정 :

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에 관해서는, 나는 수동으로 설정하지 않았다. 문서의 단어

에 따르면 "이웃 걸쳐 평균과 분산 ( 등 (26)에 연결된 8은 접속)은 시드 포인트에 대해 계산된다."

. 기본적으로 26 연결 동네가 아닌가요?

또한 공식 문서에는 '시드 포인트에서 초기 세그먼트 화'라는 것이 있습니다. 알고리즘에서 여러 씨앗을 관리하는 방법은 무엇입니까? 그것은 여러 종자를 사용하여 초기화 된 선입 선출 대기열과 같은 것입니까? 신뢰 된 이미지 필터를 위해, 초기 성장 기준이 시드 포인트의 이웃들의 평균 및 표준 편차를 사용하여 정의 된 것으로 볼 수 있습니다. 내가 여러개의 씨앗을 사용하고있을 때이 최초의 기준은 단지 첫 번째 씨앗에서 발생 했는가 아니면 모든 씨앗에서 생성 된 것입니까?

+0

필터를 반복 집합 [0,1 ... 4]에 걸쳐 실행 해보십시오. 그런 다음 필터에서 공분산 및 평균을 가져 와서 LabelStatisticsImageFilter를 실행하여 출력 통계를 확인합니다. 확률 이미지가 너무 작기 때문에 이러한 작은 차이로 인해 숫자 안정성 문제가 발생할 가능성이 큽니다. 당신의 씨앗의 분산은 무엇입니까? 또한 InitialNeighborhoodRadius 매개 변수를 살펴 보았습니까? – blowekamp

+0

@ bloekamp, ​​감사합니다.나는 내 질문의 PS2 부분에 이러한 것들을 게시합니다. 저것 좀 봐주세요. –

+0

레이블 통계 필터를 추가 할 수 있습니까? – blowekamp

답변

2

몇 가지 문제가있을 수 있습니다.

1) 출력이 아무 것도 아니라고합니다. 예상되는 출력은 0과 1의 이미지입니다. 이미지가 직접 표시되는 경우 많은 뷰는 검은 색 이미지 만 표시합니다. 간단한 시각화는 255 배수가 될 수도 있고 LabelToRGBImageFilter를 사용할 수도 있습니다. 또한 LabelStatisticsImageFilter를 실행할 수 있습니다.

2) 입력 및 사용에 올바른 필터로 보이지 않습니다. 이 필터에 대한 설명서를 말한다

이 필터는 화소 강도 시드 포인트의 화소 통계와 일치 픽셀의 연결 세트를 추출한다. 평균 및 이웃 (8 연결, 26 연결 등)의 차이는 시드 포인트에 대해 계산됩니다. 그러면이 시드에 연결된 픽셀 값이 시드 포인트의 신뢰 구간 내에있는 값으로 그룹화됩니다.

즉, 0.999보다 큰 픽셀 만 지정하면 예상 평균 및 분산이 매우 약해지고 영역이 크게 늘어나지 않습니다. 다시 LabelStatisticsImageFilter를 사용하여 레이블 이미지 아래의 강도에 대한 통계를 계산할 수 있습니다.

낮은 임계 값 경계를 수동으로 설정하여 ConnectedThresholdImageFilter를 사용하는 것이 더 적절할 수 있습니다. DoubleThresholdImageFilter를 살펴보면 하나의 필터에서 두 단계 (임계 값을 기준으로 시드를 선택한 다음 임계 값으로 영역 확대)를 수행합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 너에게 대답하기 위해 내 질문에 "추신 :"을 추가했다. 읽어주세요. numberOfIterations = 4, multiplier = 3.5로 설정하면 단일 시드가 주어질 때 영역이 효율적으로 커집니다. 그러나 씨앗을 더 많이 사용하면 그 지역은 점점 작아집니다. –