Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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_Python Imaging Library_Pixel_Anaconda - Fatal编程技术网

从具有任意数量像素组件的图像中读取数据的有效方法是什么?(Python,PIL)

从具有任意数量像素组件的图像中读取数据的有效方法是什么?(Python,PIL),python,image,python-imaging-library,pixel,anaconda,Python,Image,Python Imaging Library,Pixel,Anaconda,我正在从事一个Python项目,该项目要求我能够获得整个图像的像素值,以便衡量它们的相似性(这是一个图像分割项目)。我正在使用PIL图像模块(以及Anaconda中的其他所有软件包) 我们的大部分算法都相当成熟,不过我现在要回到这个问题上来,因为目前它只能处理灰度图像。目前是这样做的: self.dataImage = Image.open(self.file, mode = 'r') self.data = self.dataImage.getdata() 我稍后会用 print("data

我正在从事一个Python项目,该项目要求我能够获得整个图像的像素值,以便衡量它们的相似性(这是一个图像分割项目)。我正在使用PIL图像模块(以及Anaconda中的其他所有软件包)

我们的大部分算法都相当成熟,不过我现在要回到这个问题上来,因为目前它只能处理灰度图像。目前是这样做的:

self.dataImage = Image.open(self.file, mode = 'r')
self.data = self.dataImage.getdata()
我稍后会用

print("data: {}".format(list(data.GetImageData())))
这将返回与图像每个像素的强度相对应的整数序列。我想做一个简单的修改,允许if也接受RGB图像,通过使序列中的每个项目都成为一个数组而不是一个整数,这样它就能够支持具有任意数量像素组件的图像(例如,对于RGB为3)

有没有一种简单的方法可以通过PIL图像模块实现这一点?我查阅了文档,这里是StackOverflow,这是我能找到的最好的:

self.allPixels = self.dataImage.load()
    self.data = []
    for i in range(self.width):
        for j in range(self.height):
            currentPixel = self.allPixels[i,j]
            self.data.append(currentPixel)

print("data: {}".format(data.GetImageData()))
这是为了以(255255)(例如)的形式返回每个像素的数据。当查看灰度图像时,它的输出应该是什么?因为我描述的第一种方法和第二种方法的输出完全不同

第一个(使用getData())给出

第二个(使用load()和上面的循环)给出

它给我的是RGB组件的平均值吗?它如何确定没有RGB组件并且这是灰度图像

除此之外,有没有更好的办法?理想情况下,我希望对灰度图像使用与getData()相同的输出,但可以支持任意数量的像素组件。我知道我可以简单地通过循环每个像素并将它们作为单独的阵列输入,但是对于一个大图像来说,这将非常耗时和内存消耗,不是吗

非常感谢您的建议。如果有人想知道的话,我需要支持大量像素组件的原因是,这是为了应用我们实验室从x射线显微镜收集的数据而编写的。虽然RGB有三个通道,但我们在一张图像中可能有20多个通道,每个通道对应的是元素组成,而不是颜色(铁、钾、锌、钙等)

numpy(anaconda的一部分)可以使用
asarray从PIL图像加载像素数据

In [1]: from PIL import Image
In [2]: import numpy as np
In [3]: x = Image.open("/tmp/kitten.jpg")
In [4]: np.asarray(x)
Out[4]:
array([[[  1,   2,  23],
    ..., dtype=uint8)

您将得到一个三维数组,前两个维度是图像中像素的位置,第三个维度是图像中像素的值,无论图片采用何种颜色格式。这还有一个优点,就是比
getdata

快得多。如果你要从显微镜(x-y光谱通道)获取3D图像,你可能需要一种不同于(简单的)RGB图像的存储格式。它不会是RGB,我只是以它为例。每个光谱通道都是一个灰度图像,它们随后会一起编译(我假设是通过颜色,或者至少是一个“元素”标识值,该值相当于单独的颜色通道值)。除非你是这个意思。不管怎样,我们都处于非常早期的阶段,下一步就是让它首先用于RGB图像。我只想实现一些东西,以后可以扩展,不会限制我们使用三种颜色通道。
data: [0, 4, 1, 0, 12, 9, 0, 4, 0, 12, 0, 19, 123, 167, 149, 156, 159, 158, 170, 113 ....
In [1]: from PIL import Image
In [2]: import numpy as np
In [3]: x = Image.open("/tmp/kitten.jpg")
In [4]: np.asarray(x)
Out[4]:
array([[[  1,   2,  23],
    ..., dtype=uint8)