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