8.2 处理图像
当我们第一次介绍自然语言处理时,你理解了需要执行某种变换,才能以数字的方式表示文字。我们通过创建词条-文档的矩阵做到了这点。如今我们正在处理图片,需要执行另一种变换,然后用数字形式呈现图像。
让我们来看看图8-2中的几个手写数字。
图8-2
这些特定数字取自MNIST的手写数字数据库(是的,这些都是真实的手写)。这个数据库包含数万个像这样的数字,采集自美国人口普查局员工和高中生的手写样本。
假设现在我们想使用机器学习来识别这些数字。我们如何使用数字来表示这些手写体?
一种方法可能是将图像中的每个像素映射到相同大小的数字矩阵中。然后,我们可以通过矩阵中的值来表示该像素的一些属性。实际上,这正是人们处理的方法。
每个数字图像都被缩放并且居中定位到给定大小的画布上(28像素×28像素或64像素×64像素),然后每个像素的颜色强度在矩阵中被表示为0到1之间的值,其中1是纯黑色,0是纯白色。此过程称为灰度缩放。
有了这个简单的方法,我们将一个真实世界中的“事物”变成一个数字化的表示,该表示可以用于我们的机器学习算法中。
下面来看个例子。我们将MNIST数据库加载到scikit-learn。
from sklearn import datasets import matplotlib.pyplot as plt import numpy as np %matplotlib inline digits = datasets.load_digits() def display_img(img_no): fig, ax = plt.subplots() ax.set_xticklabels([]) ax.set_yticklabels([]) ax.matshow(digits.images[img_no], cmap = plt.cm.binary); display_img(0)
上述代码生成图8-3的输出。
图8-3
在上面的代码中,我们加载了必要的包,然后是数字数据集,最后,我们使用matplotlib展示了第一个数字。这是一个粗略的表示,因为它被缩小到了8×8,或总共64个像素。运行以下命令,可以看到实际的矩阵表示。
digits.images[0]
上述代码生成图8-4的输出。
图8-4
这些特定的数字在0和16之间缩放,但可以看到,它们和图像中每个像素的颜色强度是相互关联的。如果在算法中应用这些,我们需要将8×8的矩阵展开为长度64的单个向量。如下所示。
digits.data[0].shape
上述代码生成图8-5的输出。
图8-5
然后这将成为我们训练集中的一行——也就是特征向量。使用以下命令,我们也可以看到和数据相关联的标签。
digits.target[0]
上述代码生成图8-6的输出。
图8-6
现在我们准备就绪,可以将这个图像数据输入算法了。
到目前为止,我们只讨论了如何使用黑白图像,不过令人惊讶的是,处理彩色图片也是一样的简单。每个像素可以使用三个特征来表示,每个RGB值对应一个特征。或者,如果倾向于保留单个特征,那么可以取三个RGB值的平均值。
现在我们已经将图像转换成机器可以处理的表示,接下来看看我们可以使用哪些算法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论