1

我想从使用以下代码获得的 2D 二进制图像中提取标签:

image2DThresh = sitk.Threshold(image2D, lower=stats.GetMinimum(), upper=127.500)
cca = sitk.ConnectedComponentImageFilter()
cca_image = cca.Execute(2D_Slice)
# Get the shape statistics of the labels using
labelStats = sitk.LabelShapeStatisticsImageFilter()

基本思想是在主图像中找到标签的平均强度、ROI面积和最小/最大索引。我想要做的是使用阈值过滤器对图像进行二值化,然后在其上运行 CCA 以获取所有标签。然后我使用LabelShapeStatisticsImageFilter()获取每个标签的物理属性(当然标签0除外)并检查标签是否满足条件。问题是我无法在标签所在的主图像中获得平均强度。这就是为什么我建议使用LabelIntensityStatisticsFilter,但是对于 python 2.7,SimpleITK 0.10 不可用。

4

2 回答 2

5

您可能感兴趣的两个过滤器是“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 将此更改应用于标签图像。

阈值、统计和标签部分的组合是一种功率分割方法,可用于许多任务并对其进行定制。它还可以作为更多复杂方法的起点。

于 2016-11-21T19:49:21.217 回答
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()
于 2016-11-22T13:14:47.213 回答