图像数据在计算机中是以 像素矩阵 的形式存储的。为了输入到机器学习模型中,图像数据需要被 扁平化 为一维特征向量。
图像数据的存储
图像的数据表示
(1) 图像的像素矩阵
图像是由像素(Pixel)组成的,每个像素代表图像中的一个点。对于灰度图像,每个像素的值通常是一个 0 到 255 的整数,表示该点的亮度(0 表示黑色,255 表示白色)。
例如,一个 8x8 的灰度图像可以表示为一个 8 行 8 列的矩阵,每个元素是一个像素值:
[
[ 0, 10, 20, 30, 40, 50, 60, 70],
[ 80, 90, 100, 110, 120, 130, 140, 150],
[160, 170, 180, 190, 200, 210, 220, 230],
[240, 250, 255, 245, 235, 225, 215, 205],
[195, 185, 175, 165, 155, 145, 135, 125],
[115, 105, 95, 85, 75, 65, 55, 45],
[ 35, 25, 15, 5, 0, 10, 20, 30],
[ 40, 50, 60, 70, 80, 90, 100, 110]
]
(2) 图像的扁平化
为了将图像数据输入到机器学习模型中,通常需要将 二维的像素矩阵 转换为 一维的特征向量。这个过程称为 扁平化(Flattening)。
例如,上面的 8x8 图像扁平化后,会变成一个长度为 64 的一维向量:
[ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150,
160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 255, 245, 235, 225, 215, 205,
195, 185, 175, 165, 155, 145, 135, 125, 115, 105, 95, 85, 75, 65, 55, 45,
35, 25, 15, 5, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
这样,每个图像就变成了一个特征向量,可以像表格数据一样输入到机器学习模型中。
手写数字数据集中的图像表示
(1) 手写数字数据集的结构
在手写数字数据集中,每个图像是一个 8x8 的灰度图像,共有 1797 个样本。数据集的结构如下:
-
digits.images:形状为 (1797, 8, 8),表示 1797 个 8x8 的图像。
-
digits.data:形状为 (1797, 64),表示 1797 个样本,每个样本是 64 维的特征向量(8x8 图像扁平化后的结果)。
-
digits.target:形状为 (1797,),表示每个样本的真实标签(0 到 9)。
(2) 图像数据的扁平化
手写数字数据集已经将图像扁平化为特征向量,存储在 digits.data 中。例如:
第一个图像的像素矩阵:
第一个图像扁平化后的特征向量:
图像数据的可视化
(1) 显示原始图像
我们可以使用 matplotlib 显示原始图像:
输入:
import matplotlib.pyplot as plt
plt.imshow(digits.images[0], cmap='gray')
plt.title(f"Label: {digits.target[0]}")
plt.axis('off')
plt.show()
-
digits.images[0] 是第一个图像的像素矩阵。
-
cmap=‘gray’ 表示使用灰度图。
-
plt.axis(‘off’) 关闭坐标轴显示。
(2) 显示扁平化后的特征向量
扁平化后的特征向量可以通过 digits.data[0] 查看,但它是一个一维向量,无法直接显示为图像。如果需要重新显示为图像,可以将其重新调整为 8x8 的矩阵:
# 将扁平化后的特征向量重新调整为 8x8 矩阵
image = digits.data[0].reshape(8, 8)
# 显示图像
plt.imshow(image, cmap='gray')
plt.title(f"Label: {digits.target[0]}")
plt.axis('off')
plt.show()