#导入必要的包
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
#读入图片
imagePath = 'image/testfan.jpg'
img = Image.open(imagePath)
#将img转化为列表
np.array(img)
在将img转化为列表后,发现是这么个三维列表
这是为什么?
是因为通过jpg格式保存的图片,记录了图片的大小和每个像素点的信息(RBG的信息)。每个像素构成一个一维列表,图片的每一行组成一个二维列表,所有的行就组成了一个三维列表,也就是一张jpg格式的图片。譬如是5*5*3的图片,5*5代表图片有5行5列的像素点,*3表示色深是3,即有红绿蓝
对了是因为通过png格式保存的图片,不仅记录了图片的大小和每个像素点的信息(RBG的信息),每个像素点中还记录了一个叫“alpha通道”的东西来描述透明度,也就导致了一维数组中有4个元素
上面的例子可能还不直观,下面将三维数组转成图片
from PIL import Image
# 生成一个100x100x3的随机三维列表
import random
data = [[[random.randint(0, 255) for _ in range(3)] for _ in range(100)] for _ in range(100)]
# 将三维列表转换为图像
img = Image.new('RGB', (100, 100))
for x in range(100):
for y in range(100):
r, g, b = data[x][y]
img.putpixel((x, y), (r, g, b))
# 显示图像
img.show()
运行这段代码会得到下面这张图片:
没错就是这么一张图,每个小色块代表了一个像素