【发布时间】:2015-07-22 06:28:51
【问题描述】:
我正在使用 Python 进行一个项目,该项目要求我能够获取整个图像的像素值,以便权衡它们的相似性(这是一个图像分割项目)。我正在使用 PIL Image 模块(以及 Anaconda 中的所有其他软件包)。
我们的大部分算法都相当发达,尽管我要回到这个问题上,因为到目前为止它只能处理灰度图像。目前是这样完成的:
self.dataImage = Image.open(self.file, mode = 'r')
self.data = self.dataImage.getdata()
我稍后会检查它
print("data: {}".format(list(data.GetImageData())))
这将返回与图像每个像素的强度相对应的整数序列。我想进行一个简单的修改以允许 if 也接受 RGB 图像,通过使序列中的每个项目成为一个数组而不是单个整数,因此它将能够支持具有任意数量的像素分量的图像(例如 3 ,对于 RGB)。
有没有一种简单的方法可以通过 PIL Image 模块做到这一点?我在 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()))
这应该以 (255,255,255) 的形式返回每个像素的数据(例如)。查看灰度图像时,它的输出应该是什么?因为我描述的第一种方法和第二种方法的输出完全不同。
第一个(使用 getData())给出
data: [0, 0, 4, 4, 3, 3, 2, 0, 3, 0, 0, 2, 5, 1, 0, 0, 5, 6, 6, 2, 0, 0, 2, 7, 8 ....
第二个(使用 load() 和上面的循环)给出
data: [0, 4, 1, 0, 12, 9, 0, 4, 0, 12, 0, 19, 123, 167, 149, 156, 159, 158, 170, 113 ....
它是否给了我 RGB 分量的平均值?怎么判断是不是没有RGB分量,这是一张灰度图?
除此之外,还有更好的方法吗?理想情况下,我想要的东西与灰度图像的 getData() 输出相同,但可以支持任意数量的像素组件。我知道我可以通过循环遍历每个像素并将它们作为单独的数组输入来简单地做到这一点,但是对于大图像,这将变得非常耗时和内存消耗,不是吗?
非常感谢任何建议。如果有人想知道,我需要支持大量像素组件的原因是因为这是为应用从我们实验室的 X 射线显微镜收集的数据而编写的。虽然 RGB 具有三个通道,但我们在一张图像中可能有 20 多个通道,每个通道对应于元素组成而不是颜色(铁、钾、锌、钙等)。
【问题讨论】:
-
如果您从显微镜(x-y-光谱通道)获取 3D 图像,您可能需要与(简单)RGB 图像不同的存储格式。
-
它不会是 RGB,我只是以它为例。每个光谱通道都以灰度图像的形式出现,它们稍后被编译在一起(我假设按颜色,或者至少是一个“元素”识别值,它相当于单独的颜色通道值。)。除非这就是你的意思。无论哪种方式,我们都处于非常早期的阶段,下一步是让它首先用于 RGB 图像。我只是想实现一些以后可以扩展的东西,并且不会让我们只使用三个颜色通道。
标签: python image python-imaging-library pixel anaconda