如何使用PIL或其他方式在Python中合并图像,每个图像有多个频道?

2024-09-30 04:41:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的被困在这里了。我正在工作的一个项目,需要我把几个图像合并成一个。我看过几篇文章,描述了如何使用PIL来实现它,但是没有一篇文章回答了这样一个问题:如果你有任意数量的频道,该怎么做。在

本课题是一种图像分割算法。提供给它的数据将是从各种生物样品的x射线显微镜上收集的数据。最终产品是许多灰度图像的集合,每个图像代表一个不同的元素通道。也就是说,样品中存在铁、钾、磷、硅等元素位置的灰度图像。这与将一个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是图像对象,并且'数据.GetImageData()`只返回一个整数强度值的列表(因为每个给定的图像都应该是灰度级的)。在

我已经测试过了,并且mergedData最终被正确地构建为一个二维数组,每个像素的组件与图像的数量一样多。在

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

所以我希望能够将mergedData写入一个图像文件,来完成各种各样的事情。在

但是,PIL说它不支持用户定义的图像模式,要调用Image.write(),您必须提供图像模式作为参数(没有一个超过4个通道)。在

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

谢谢你


Tags: 数据in图像元素fordata数量len

热门问题