将图像(png格式)转换为矩阵,然后再转换为一维数组

17


我有5张图片,想将每张图片转换为一维数组,并将其作为向量放入矩阵中。
我希望能够再次将每个向量转换为图片。

img = Image.open('orig.png').convert('RGBA')
a = np.array(img)

我对numpy的所有功能都不熟悉,想知道是否有其他工具可供使用。
谢谢。

3个回答

33
import numpy as np
from PIL import Image

img = Image.open('orig.png').convert('RGBA')
arr = np.array(img)

# record the original shape
shape = arr.shape

# make a 1-dimensional view of arr
flat_arr = arr.ravel()

# convert it to a matrix
vector = np.matrix(flat_arr)

# do something to the vector
vector[:,::10] = 128

# reform a numpy array of the original shape
arr2 = np.asarray(vector).reshape(shape)

# make a PIL image
img2 = Image.fromarray(arr2, 'RGBA')
img2.show()

在 # 做向量处理的部分,我想将图像(作为向量)进行归一化,我需要进行线性归一化还是直方图均衡化?还有一个问题,如果我有一个图像数组,我可以将它们全部放入一个大矩阵中,并且每个图像都是一个向量,我可以使用您的代码片段作为函数吗? - Ofir Attia
请展示你正在使用的归一化代码。我不明白为什么你想要将5张图片放入一个矩阵中以及你打算如何对它们进行归一化处理。 - unutbu
1
因为我想制作人脸空间,每个向量都是一张图片,我想使用直方图均衡化,因为我想学习人脸识别的工作原理! - Ofir Attia
1
@jameshwartlopez:感谢您的错误报告。现在,导入Image的正确方式是from PIL import Image。如果您没有安装PIL,请考虑安装Pillow,这是PIL的一个积极开发的分支 - unutbu
似乎*NumPy.matrix()*将被弃用。以下是一个StackOverflow文章的链接,提供了替代方案 https://dev59.com/SFQJ5IYBdhLWcg3wtoSJ - David M. Helmuth

7
import matplotlib.pyplot as plt

img = plt.imread('orig.png')
rows,cols,colors = img.shape # gives dimensions for RGB array
img_size = rows*cols*colors
img_1D_vector = img.reshape(img_size)
# you can recover the orginal image with:
img2 = img_1D_vector.reshape(rows,cols,colors)

请注意,img.shape 返回一个元组,通过上述的多重赋值给 rows,cols,colors ,我们可以计算转换为和从一维向量中所需的元素数量。
您可以使用以下代码显示 img 和 img2,以查看它们是否相同:
plt.imshow(img) # followed by 
plt.show() # to show the first image, then 
plt.imshow(img2) # followed by
plt.show() # to show you the second image.

请记住,在Python终端中,您必须关闭plt.show()窗口才能返回到终端以显示下一张图片。

对我来说,这很有意义,只依赖于matplotlib.pyplot。它还适用于jpg和tif图像等等。我尝试的png具有float32 dtype,而我尝试的jpg和tif具有uint8 dtype(dtype =数据类型);每个似乎都可以正常工作。

希望这有所帮助。


2

我曾经使用以下代码将二维图像数组转换为一维:

import numpy as np
from scipy import misc
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

face = misc.imread('face1.jpg');
f=misc.face(gray=True)
[width1,height1]=[f.shape[0],f.shape[1]]
f2=f.reshape(width1*height1);

但我还不知道如何在代码中将其改回2D,另外请注意,并非所有导入的库都是必需的,希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接