我正在浏览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()