Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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中使用PIL或其他方法将图像合并在一起,每个图像都有多个通道?_Python_Image_Image Processing_Python Imaging Library_Image Segmentation - Fatal编程技术网

如何在Python中使用PIL或其他方法将图像合并在一起,每个图像都有多个通道?

如何在Python中使用PIL或其他方法将图像合并在一起,每个图像都有多个通道?,python,image,image-processing,python-imaging-library,image-segmentation,Python,Image,Image Processing,Python Imaging Library,Image Segmentation,我真的被困在这里了。我正在从事一个工作项目,该项目要求我将多个图像合并为一个。我看过几篇文章描述了如何使用PIL,但是没有一篇文章回答了如果你有任意数量的频道该怎么办的问题 该项目是一个专门用于图像分割的算法。提供给它的数据将是从各种生物样品的x射线显微镜收集的数据。最终的产品是许多灰度图像的集合,每个图像代表一个不同的元素通道。也就是说,样品中存在Fe、K、P、Si等元素位置的灰度图像。这与将RGB图像拆分为3个单独的一维图像(阵列)没有什么不同 将这些RGB通道合并在一起很简单,以便 R:(

我真的被困在这里了。我正在从事一个工作项目,该项目要求我将多个图像合并为一个。我看过几篇文章描述了如何使用PIL,但是没有一篇文章回答了如果你有任意数量的频道该怎么办的问题

该项目是一个专门用于图像分割的算法。提供给它的数据将是从各种生物样品的x射线显微镜收集的数据。最终的产品是许多灰度图像的集合,每个图像代表一个不同的元素通道。也就是说,样品中存在Fe、K、P、Si等元素位置的灰度图像。这与将RGB图像拆分为3个单独的一维图像(阵列)没有什么不同

将这些RGB通道合并在一起很简单,以便

R:(2,3,6…3)
G:(5,5,7…4)
B:(1,3,2…2)

变成

RGB:[(2,5,1),(3,5,3),(6,7,2),…(3,4,2)]

但我需要知道当频道多于(或少于)三个时如何做到这一点。一些显微镜的使用者收集了几十个元素通道,而一些人收集了2到3个。我可以相当简单地构建上面示例中所示的最终数据数组,但我不知道如何将其实际写入图像。以下是我所拥有内容的简化版本:

def mergeImages(imageList):

    allData = []
    allSizes = []
    mergedData = numpy.zeros((max(allSizes), len(imageList)))

    for image in imageList:
        data = ImageFileData(image)
        allData.append(data.GetImageData())

    for data in allData:
        allSizes.append(data1.GetImageSize())

    try:
        for i in range(len(allData)):
            for j in range(len(allData[i])):
                mergedData[j][i] = allData[i][j]
        return True

    except:
        qt.QMessageBox('Image merge failed.')
        return False
其中,
data
是一个图像对象,“data.GetImageData()`只返回一个整数强度值列表(因为给出的每个图像都应该是灰度的)

我已经对此进行了测试,
mergedData
最终被正确构建为一个二维数组,每个像素的组件数量与图像数量相同

但是为了使我的算法的实际分割部分工作,我需要向它传递一个图像文件,而不是原始数据。我确信我可以让它接受原始数据,并且工作正常,但我现在还不想这样做(因为我还希望合并后的图像可以查看)

因此,我希望能够将
mergedData
写入图像文件,以执行各种操作

但是,PIL表示它不支持用户定义的图像模式,要调用
image.write()
,必须将图像模式作为参数提供(所有模式都不能超过4个通道)

所以我不知道,如果这里有人有图像处理的经验,那就太棒了。我甚至不确定是否可以查看具有任意数量像素值的图像。也许我必须为每个组件映射一种颜色。我不知道。不过,在我开始查看之前,我希望它能够将
mergedData
写入图像文件


谢谢

您是否可以使用
numpy
?您可以使用
numpy.dstack
将所有图像堆叠在一起,然后您可以转换回PIL图像。@rayryeng是的,我可以使用我想要的任何图像,我让Anaconda运行,并且在上面的示例中使用numpy数组。谢谢你的建议,我会尝试一下,然后报告backCool。只需在
numpy.dstack
中提供2D图像列表,即可创建3D图像堆栈。让我知道进展如何!顺便说一下,如果你想支持超过3的多个图像堆栈,考虑使用TIF标准。它特别用于医学图像和显微镜数据。我还没有试过,但是如果你试着在多堆栈TIF中读取,你应该能够在3D堆栈中得到这个。储蓄也是如此。试一试,看看效果如何。如果有效的话,我想写一个答案!是否允许您使用
numpy
?您可以使用
numpy.dstack
将所有图像堆叠在一起,然后您可以转换回PIL图像。@rayryeng是的,我可以使用我想要的任何图像,我让Anaconda运行,并且在上面的示例中使用numpy数组。谢谢你的建议,我会尝试一下,然后报告backCool。只需在
numpy.dstack
中提供2D图像列表,即可创建3D图像堆栈。让我知道进展如何!顺便说一下,如果你想支持超过3的多个图像堆栈,考虑使用TIF标准。它特别用于医学图像和显微镜数据。我还没有试过,但是如果你试着在多堆栈TIF中读取,你应该能够在3D堆栈中得到这个。储蓄也是如此。试一试,看看效果如何。如果有效的话,我想写一个答案!