2016-11-21 6 views
0

다음 코드를 사용하여 얻은 2D 이진 이미지에서 레이블을 추출하고 싶습니다. image2DThresh = sitk.Threshold (image2D, lower = stats.GetMinimum() , 위 = 127.500) CCA = sitk.ConnectedComponentImageFilter() cca_image = cca.Execute (2D_Slice) 나는 이 labelStats = sitk.LabelShapeStatisticsImageFilter()Python에서 SimpleITK의 이진 이미지에서 레이블을 추출하는 방법

기본 개념은 사용하는 라벨의 모양 통계를 얻을 수 있습니다 # 메인 이미지에서 평균 강도, ROI 영역 및 라벨의 최소/최대 인덱스를 찾습니다. 내가 뭘 하려는지 임계 값 필터로 이미지를 binarizing 다음 모든 레이블을 얻기 위해 CCA를 실행합니다. 그런 다음 LabelShapeStatisticsImageFilter()를 사용하여 모든 레이블 (0 레이블을 제외하고)의 물리적 특성을 가져 와서 레이블이 조건을 충족하는지 확인합니다. 문제는 레이블이있는 주 이미지에서 평균 강도를 얻을 수 없다는 것입니다. 그래서 LabelIntensityStatisticsFilter를 사용하는 것이 좋습니다. Python 2.7에서는 SimpleITK 0.10을 사용할 수 없습니다.

+0

약간의 빛을 비추는 @blowekamp을 요청하십시오. –

+0

이 질문에서 무엇을 요구하는지 확신 할 수 없습니다. 명확히하십시오. 나는 그것이 단지 SimpleITK Python wrapping을 가리키고 있다고 가정하고있다. LabelIntensityStatisticsImageFilter는 최근 SimpleITK 0.10.0 릴리스 (및 그 이전 버전)에서 사용할 수 있어야합니다. 둘째, 문제 또는 알고리즘이 무엇인지 명확하게 설명하지 않고 문제를 해결하는 방법에 대한 가정이 있습니다. – blowekamp

+0

질문은 원래 이미지에서 CCA에서 얻은 특정 레이블의 평균 밝기를 얻는 방법입니다. 그리고 Python 2.7에서 내 Windows 컴퓨터의 SimpleITK 0.10.0에는 LabelIntensityStatisticsImageFilter가 없습니다. –

답변

2

"LabelStatisticsImageFilter"및 "LabelIntensityStatisticsImageFilter"에 관심이있는 두 개의 필터가 있습니다. 이것들은 SimpleITK 0.10에서 사용 가능합니다. 분배 문제가 없다면. 두 필터 모두 평균을 계산하지만 나중에 경계 상자 및 더 많은 고급 통계를 계산합니다.

사용법은 다음과 같이 뭔가를 갈 것 :

In [1]: import SimpleITK as sitk 

In [2]: print sitk.Version() 
SimpleITK Version: 0.10.0 (ITK 4.10) 
Compiled: Aug 16 2016 17:21:32 


In [3]: img = sitk.ReadImage("cthead1.png") 

In [4]: cc = sitk.ConnectedComponent(img>100) 

In [5]: stats = sitk.LabelIntensityStatisticsImageFilter() 

In [6]: stats.Execute(cc,img) 
Out[6]: <SimpleITK.SimpleITK.Image; proxy of <Swig Object of type 'std::vector<itk::simple::Image>::value_type *' at 0x2a6b540> > 

In [7]: for l in stats.GetLabels(): 
    ...:  print("Label: {0} -> Mean: {1} Size: {2}".format(l, stats.GetMean(l), stats.GetPhysicalSize(l))) 
    ...:  
Label: 1 -> Mean: 157.494210868 Size: 3643.8348071 
Label: 2 -> Mean: 151.347826087 Size: 2.86239969136 
Label: 3 -> Mean: 123.75 Size: 0.497808641975 
Label: 4 -> Mean: 106.0 Size: 0.248904320988 
Label: 5 -> Mean: 104.0 Size: 0.124452160494 
Label: 6 -> Mean: 106.0 Size: 0.124452160494 
Label: 7 -> Mean: 103.0 Size: 0.124452160494 
Label: 8 -> Mean: 121.5 Size: 1.49342592593 
Label: 9 -> Mean: 106.0 Size: 0.124452160494 

당신이 보존 또는 0 (삭제)에 레이블을 다시 지정 라벨의 목록을 만들 수있는 인쇄 대신에. 그런 다음 ChangeLabelImageFilter를 사용하여이 변경 사항을 레이블 이미지에 적용 할 수 있습니다.

임계 값, 통계 및 레이블 섹션의 결합은 많은 작업에서 사용 및 사용자 정의 할 수있는 전력 분할 방법입니다. 그것은 또한 더 복잡한 방법의 출발점 역할을합니다.

+0

답장을 보내 주셔서 감사합니다. LabelIntensityStatisticsImageFilter()는 Python 3.4에서 작동하지만 2.7에서는 작동하지 않습니다. 이 필터에서 코드를 실행할 때 CCA에서 얻는 것보다 훨씬 많은 레이블을 얻습니다. 그래서 나는 numpy를 사용하여 원하는 것을 구현했습니다. 나는 대답을 게시하고있다. –

+0

LabelIntensityStatistics에서 더 많은 라벨을 얻었고 CC 입력에 있으면 강도와 레이블 이미지 매개 변수가 거꾸로 있습니다. – blowekamp

+0

알았어요! 나는 그것을 알아 냈다! 그러나 나는 numpy 구현이 나를 위해 일하는 것 같아요. 이제 LabelShapeStatisticsFilter가 필요합니다. 당신의 도움을 주셔서 감사합니다! –

0

그래서 numpy를 사용하여 문제를 해결했습니다. 코드를 게시하고 있습니다. 앞으로 다른 사람에게 도움이 될지도 모릅니다.

def get_label(ccaimage, label, image2D): 
# labelImage is the mask for a particular label 
labelImage = sitk.Threshold(ccaimage, lower=label, upper=label) 
#sitk_show(labelImage) 
# get image as array 
labelImageArray = sitk.GetArrayFromImage(labelImage) 
image2Darray = sitk.GetArrayFromImage(image2D) 
# ROI_1 is the minimum in the original image where the mask is equal to label 
ROI_1 = image2Darray == np.min(image2Darray[labelImageArray == label]) 
plt.imshow(ROI_1) 
plt.show() 
# ROI_2 is the mask image 
ROI_2 = labelImageArray == label 
plt.imshow(ROI_2) 
plt.show() 
# AND gives me only those pixels which satisfy both conditions. 
ROI = np.logical_and(image2Darray == np.min(image2Darray[labelImageArray == label]), labelImageArray == label) 
avg = np.mean(image2Darray[labelImageArray == label]) 
print np.min(image2Darray[labelImageArray == label]) 
print np.where(ROI) 
plt.imshow(ROI) 
plt.show()