返回介绍

8.2 处理图像

发布于 2024-01-26 22:17:32 字数 2372 浏览 0 评论 0 收藏 0

当我们第一次介绍自然语言处理时,你理解了需要执行某种变换,才能以数字的方式表示文字。我们通过创建词条-文档的矩阵做到了这点。如今我们正在处理图片,需要执行另一种变换,然后用数字形式呈现图像。

让我们来看看图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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文