使用Pillow

时间:2018-01-19 19:20:46

标签: python arrays image numpy

我正在浏览O' Reilly的一本名为“#34;使用Python编程计算机视觉”的媒体书籍,其中一个练习是在一组图像上使用pca ,旨在展示“平均值”。图像和前七种模式;变化最大的方向。运行代码应该在一个图窗口中提供八个图像。我直接复制了他们的代码,并且使用了我自己的一组55张图片(手写字母' a'),每张图片尺寸为900 x 1200。问题在于平坦化图像所产生的图像矩阵的尺寸是(1×3240000)。

#create a matrix to store all flattened images

immatrix = array([array(Image.open(im)).flatten() for im in imlist], 'f')

我摸了一下头,直到我意识到三个颜色通道只有900 x 1200 x 3。也就是说,书中的代码示例没有说明这一点,只是尝试将(1 x 3240000)数组调整为900 x 1200的图像,这个numpy当然是在抱怨。

# show some images (mean and 7 first modes)

figure()
gray()
subplot(2,4,1)
imshow(immean.reshape(m,n))  # Issue, array is 3240000, because of the 
                             # 3 color channels. m = 900 and n = 1200
for i in range(7):
    subplot(2, 4, i+2)
    imshow(V[i].reshape(m,n))

show()

如果有人有这方面的经验或可以提供帮助,那就太棒了。作为一个注释,我大约2小时前开始使用Pillow,因此修复的特定示例比一般概念性答案更有帮助。非常感谢你!我已经在下面提供了完整的代码。

from PIL import Image
from numpy import *
from pylab import *
import pca
import os


imlist = [os.path.join("imlist", f) for f in os.listdir("imlist") if 
f.endswith('.png')]



im = array(Image.open(imlist[0])) #open one image to get size
m,n = im.shape[0:2] #get the size of the images, which is 900 x 1200


imnbr = len(imlist) #get the number of images
print (imnbr)


#create a matrix to store all flattened images

immatrix = array([array(Image.open(im)).flatten() for im in imlist], 'f')
V,S,immean = pca.pca(immatrix)
(V, S,immean)

# show some images (mean and 7 first modes)

figure()
gray()
subplot(2,4,1)
imshow(immean.reshape(m,n))  # Issue, array is 3240000, because of the 3 color channels. m = 900 and n = 1200
for i in range(7):
    subplot(2, 4, i+2)
    imshow(V[i].reshape(m,n))

show()

1 个答案:

答案 0 :(得分:0)

您正在使用的代码假设图像是灰度图像。 因此,修复代码的简便方法是将Image.open(im)更改为

Image.open(im).convert('L')

convert RGB图像(三个8位通道)转换为灰度图像(具有一个8位通道)。

另一种选择是将reshape调用更改为

plt.imshow(immean.reshape(m,n,3))

和(在for循环中)

plt.imshow(V[i].reshape(m,n,3))