opencv python3 找图片不同_Python3 OpenCV3图像处理-图像内容分类

图像内容分类

本章介绍图像分类和图像内容分类算法。首先,我们介绍一些简单而有效的方法和 目前一些性能最好的分类器,并运用它们解决两类和多类分类问题,

1 K 邻近分类法(KNN)

在分类方法中,最简单且用得最多的一种方法之一就是 KNN(K-Nearest Neighbor ,K 邻近分类法),这种算法把要分类的对象(例如一个特征向量)与训练集中已知类标 记的所有对象进行对比,并由 k 近邻对指派到哪个类进行投票。这种方法通常分类效 果较好,但是也有很多弊端:与 K-means 聚类算法一样,需要预先设定 k 值,k 值的 选择会影响分类的性能;此外,这种方法要求将整个训练集存储起来,如果训练集 非常大,搜索起来就非常慢。对于大训练集,采取某些装箱形式通常会减少对比的次 数 1 从积极的一面来看,这种方法在采用何种距离度量方面是没有限制的;实际上, 对于你所能想到的东西它都可以奏效,但这并不意味着对任何东西它的分类性能都很 好。另外,这种算法的可并行性也很一般。

1.2 用稠密 SIFT 作为图像特征

我们来看如何对图像进行分类。要对图像进行分类,我们需要一个特征向量来表示 一幅图像。在聚类一章我们用平均 RGB 像素值和 PCA 系数作为图像的特征向量; 这里我们会介绍另外一种表示形式,即稠密 SIFT 特征向量。

在整幅图像上用一个规则的网格应用 SIFT 描述子可以得到稠密 SIFT 的表示形

1.3 图像分类:手势识别

将图 像分辨率调成了常见的固定大小。这是非常重要的,否则这些图像会有不同数量的描述子,从而每幅图像的特征向量长度也不一样,这将导致在后面比较它们时出错。

2 贝叶斯分类器

另一个简单却有效的分类器是贝叶斯分类器 1(或称朴素贝叶斯分类器)。贝叶斯分 类器是一种基于贝叶斯条件概率定理的概率分类器,它假设特征是彼此独立不相关的 (这就是它“朴素”的部分)。贝叶斯分类器可以非常有效地被训练出来,原因在于 每一个特征模型都是独立选取的。尽管它们的假设非常简单,但是贝叶斯分类器已经 在实际应用中获得显著成效,尤其是对垃圾邮件的过滤。贝叶斯分类器的另一个好处 是,一旦学习了这个模型,就没有必要存储训练数据了,只需存储模型的参数。

该分类器是通过将各个特征的条件概率相乘得到一个类的总概率,然后选取概率最 高的那个类构造出来的。

3 支持向量机

SVM(Support Vector Machine,支持向量机)是一类强大的分类器,可以在很多分 类问题中给出现有水准很高的分类结果。最简单的 SVM 通过在高维空间中寻找一 个最优线性分类面,尽可能地将两类数据分开。对于一特征向量 x 的决策函数为:

f(x)=w·x-b 其中 w 是常规的超平面,b 是偏移量常数。该函数月阈值为 0,它能够很好地将两 类数据分开,使其一类为正数,另一类为负数。通过在训练集上求解那些带有标记 {, }y 11i ! - 的特征向量 xi 的最优化问题,使超平面在两类间具有最大分开间隔,从 而找到上面决策函数中的参数 w 和 b。该决策函数的常规解是训练集上某些特征向 量的线性组合:

ywx iii i a= /

所以决策函数可以写为:

()fy b xx xii i i $ -a= /

这里的 i 是从训练集中选出的部分样本,这里选择的样本称为支持向量,因为它们 可以帮助定义分类的边界。

SVM 的一个优势是可以使用核函数(kernel function);核函数能够将特征向量映射到 另外一个不同维度的空间中,比如高维度空间。通过核函数映射,依然可以保持对决 策函数的控制,从而可以有效地解决非线性或者很难的分类问题。用核函数 K(xi , x) 替代上面决策函数中的内积 xi · x。

下面是一些最常见的核函数:

线性• 是最简单的情况,即在特征空间中的超平面是线性的,K(xi , x)=xi · x; 多项式• 用次数为 d 的多项式对特征进行映射,K(xi , x)=(γxi · x+r)d,γ>0; 径向基函数• ,通常指数函数是一种极其有效的选择,K(xi , x)=e(-γ||xi - x||2),γ>0; Sigmoid 函数,一个更光滑的超平面替代方案,• K(xi , x)=tanh(γxi · x+r)。

每个核函数的参数都是在训练阶段确定的。

对于多分类问题,通常训练多个 SVM,使每一个 SVM 可以将其中一类与其余类分 开,这样的分类器也称为“one-versus-all”分类器

4 光学字符识别

作为一个多类问题实例,让我们来理解数独图像。OCR(Optical Character Recognition,

光学字符识别)是一个理解手写或机写文本图像的处理过程。一个常见的例子是通 过扫描文件来提取文本,例如书信中的邮政编码或者谷歌图书(http://books.google. com/)里图书馆卷的页数。这里我们看一个简单的在打印的数独图形中识别数字的 OCR 问题。数独是一种数字逻辑游戏,规则是用数字 1~9 填满 9×9 的网格,使每 一行每一列和每个 3×3 的子网格包含数字 1…91。

4.1 训练分类器

对于这种分类问题,我们有 10 个类:数字 1…9,以及一些什么也没有的单元格。 我们给定什么也没有的单元格的类标号是 0,这样所有类标记就是 0…9。我们会用 已经剪切好的数独单元格数据集来训练一个 10 类的分类器 2 文件 sudoku_images.zip 中有两个文件夹“ocr data”和“sudokus”,后者包含了不同条件下的数独图像集, 我们稍后讲解。现在我们主要来看文件夹“ocr_data”,这个文件夹包含了两个子文 件夹,一个装有训练图像,另一个装有测试图像。这些图像文件名的第一个字母是 数字(0…9),用以标明它们属于哪类。图 8-6 展示了训练集中的一些样本。图像是 灰度图,大概是 80×80 像素(有一幅波动)

你可能感兴趣的:(opencv,python3,找图片不同)