Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将从子集计算的kmeans应用于完整数据_Python_Image Processing_K Means_Image Segmentation - Fatal编程技术网

Python 将从子集计算的kmeans应用于完整数据

Python 将从子集计算的kmeans应用于完整数据,python,image-processing,k-means,image-segmentation,Python,Image Processing,K Means,Image Segmentation,我有层析数据集,我想通过k-means聚类分割成不同的部分。 由于数据集相当大,我计算了数据子集的k均值。 现在,我想将计算出的k-均值应用到数据集的更大部分,但我似乎无法使其正常工作,分割没有正确应用 我加载图像的一个子集,如下所示: import glob import imageio import numpy filenames = glob.glob(os.path.join(FolderToRead, '*rec0*.tif')) vol_subset = numpy.stack([i

我有层析数据集,我想通过k-means聚类分割成不同的部分。 由于数据集相当大,我计算了数据子集的k均值。 现在,我想将计算出的k-均值应用到数据集的更大部分,但我似乎无法使其正常工作,分割没有正确应用

我加载图像的一个子集,如下所示:

import glob
import imageio
import numpy
filenames = glob.glob(os.path.join(FolderToRead, '*rec0*.tif'))
vol_subset = numpy.stack([imageio.imread(rec) for rec in filenames[::50]], 0)
然后按如下方式计算k-均值聚类:

import sklearn.cluster
kmeans_volume = sklearn.cluster.MiniBatchKMeans(n_clusters=6, batch_size=2**11)
subset_clustered = kmeans_volume.fit_predict(numpy.array(vol_subset).reshape(-1,1))
subset_clustered.shape = numpy.shape(vol_subset)
标签看起来很棒,标签1是骨骼,标签3是植入物,标签5是骨骼中的血管

for c, img in enumerate(subset_clustered):
    for d, cluster in enumerate(range(number_of_clusters)):
        plt.subplot(1, number_of_clusters, d+1)
        # Show original image
        plt.imshow(img)
        # Overlay label image
        plt.imshow(numpy.ma.masked_where(img != d, img), cmap='jet_r')
        plt.title('Image %s/%s, Label %s' % (c + 1, len(vol_clustered), d))
        plt.show()

现在我已经计算了数据子集的k均值,我想将它们应用到完整的数据集。 我试着这样做,但标签似乎不一致

# Apply segmentation calculated above
for c, r in enumerate(reconstructions):
    # Read in all files subsequently
    reconstruction = imageio.imread(r)
    # Label the images with the kmeans calculated from a subset of the images
    clustered_rec = kmeans_volume.fit_predict(reconstruction.reshape(-1, 1))
    clustered_rec.shape = numpy.shape(reconstruction)
    # Write out the images
    imageio.imwrite('filename' + c + '.png, numpy.uint8(clustered_rec == 3) * 255 )  # 3 being the screw label
下图显示了上面脚本的裁剪输出。 左面板上一张图像(中间的五个斑点)上的血管正确标记为5,右面板下一张图像上的血管标记为1,这是错误的

如果有人指出我做错了什么,我将不胜感激。 我希望我不必在整个数据集上计算k均值,因为有2700个TIFF图像,每个图像的大小为1944x1944像素…

来自,
fit_predict(X[,y])
两个“计算聚类中心预测每个样本的聚类索引”

而方法
predict(X)
,仅“预测X中每个样本所属的最近聚类。”

因此,只需在完整数据集上使用此方法。

是否必须在完整数据集上使用方法
predict
,而不是
fit\u predict
?@xdze2正是这种情况。非常感谢你发现了这一点!你能不能把这个作为一个答案,我会接受这个答案。CT通常有校准值,你可以定义固定的阈值来区分骨与血管和植入物。你不应该用k-means来做这个。@CrisLuengo:我很清楚这一点。机器没有校准,我们在不同的能量和放大设置下扫描了几个不同的样品。k-means分割对我们设置中的所有样本都相当稳健。