【CV】第 2 章:使用本地二进制模式的内容识别

news2024/9/21 16:17:28

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

使用 LBP 处理图像

生成 LBP 模式

了解 LBP 直方图

直方图比较方法

LBP的计算成本

将 LBP 应用于纹理识别

将面部颜色与基础颜色匹配——LBP及其局限性

脸色与底色的搭配——配色技巧

概括


局部二进制模式LBP ) 由Timo Ojala、Matti Pietik äinen 和 David Harwood 在 1994 年的国际模式识别会议上首次在基于 Kullback 分布判别的分类的纹理测量性能评估 ( h ttps:// ieeexplore.ieee.org/document/576366 )。

在本章中,您将学习如何创建 LBP 图像类型的二进制特征描述符和 LBP 直方图,用于纹理和非纹理图像的分类。您将了解可用于计算直方图之间差异的不同方法,以便找到各种图像之间的匹配,以及如何调整 LBP 参数以优化其性能。

本章将涵盖以下主题:

  • 使用 LBP 处理图像
  • 将 LBP 应用于纹理识别
  • 将面部颜色与基础颜色匹配——LBP及其局限性
  • 脸色搭配粉底色——配色技巧

使用 LBP 处理图像

LBP 是一种灰度图像阈值操作,用于根据不同的模式对图像进行分类。二进制模式是通过将邻域像素值与中心像素值进行比较来开发的,并用于构建直方图 bin。在下一节中,我们将详细描述 LBP 操作。

生成 LBP 模式

LBP模式生成的主要步骤如下:

1.将 RGB 图像 A 转换为灰度图像 G。

2.对于图像 G 中强度为 I c (x,y) 的每个像素,选择P个具有相应强度 (I 0 , I 1 .. I P-1 ) 的相邻点 (p 0 , p 1 .. p P-1 )半径R。半径以像素为单位定义为两个像素之间的差。像素和相邻点表示图像 G 的滑动窗口 W。对于半径 R = 1,P 变为 8,如下所示。

滑动窗口 W 0表示为带有 的数组。这里,点 0 到 P-1 表示围绕中心像素 c 的 P 个点的强度:

 确定半径 R 和相邻点 P 之间的关系,以便邻域中的每个像元恰好具有一个像素。如上图中的前三个圆圈所示,周界中的每个单元格恰好有一个像素,而最后一个单元格的周界中包含多个像素。从前三个圆圈中,我们可以表示,为了使每个单元有一个像素,点数 P 可以表示为(8R +16)/3。下图显示了线性关系和左起第四个圆圈所示的异常值,它在相邻单元格中有重叠点:

3.计算相邻像素和中心像素的强度差,去掉第一个值,0。数组可以表示如下:

W 1 ~ [I 0 -I c , I 1 -I c , ..I P-1 -I c ]

4.现在,对图像进行阈值处理。为此,如果强度差小于 0,则分配值 0;如果强度差大于 0,则分配值 1,如以下等式所示:

 应用阈值函数f后的差分数组如下:

              W 2 = [f(I 0 -I c ), f(I 1 -I c ), ..f(I P-1 -I c )

例如,假设第一个差值小于 0 且第二个和最后一个差值大于 0 时,数组可以表示如下:

W 2 = [0, 1, …1]

5.差值数组 W 2乘以二项式权重 2 p以 将二进制数组 W 2转换为表示十进制数组 W 3的LBP 代码:

 请注意,本节中描述的五个步骤将在接下来的几节中引用。

下图显示了在灰度图像的滑动窗口上的 LBP 操作的图形表示:

 在上图中,我们可以看到以下内容:

  • 起始的 3 x 3 内核只是图像的一部分。
  • 接下来的 3 x 3 是二进制表示。
  • 左上角的值为 1,因为我们将 120 与 82 进行比较。
  • 顺时针方向,最后一个值为 0,因为我们比较了 51 和 82。
  • 下一个 3 x 3 内核只是一个 2 n操作。
  • 第一个值为 1 (2 0 ),顺时针方向的最后一个值为 128 (2 7 )。

了解 LBP 直方图

LBP数组W 3以直方图形式表示如下:

W 4 = 直方图(W 3 , bins=P, range=W 3 (min) to W 3 (max))

对训练图像和测试图像重复上一节中的步骤 15,以创建图像的 LBP 直方图(W train,W test),每个图像包含 P 个 bin,然后使用直方图比较方法进行比较。

直方图比较方法

可以使用不同的直方图比较方法来计算直方图之间的距离。这些如下:

  • 相交法:

 在 Python 中,这表示如下:

minima = np.minimum(test_hist,train_hist)
intersection = np.true_divide(np.sum(minima),np.sum(train_hist))
  • 卡方法:

  • 欧几里得方法:

  • 城市街区方法:

  • 巴塔查亚方法:

  • 瓦瑟斯坦方法:

  • 在这里,是分布的均值(一阶矩),(二阶矩)是分布的标准差 O, ρQQ是两个分布的分位数的相关性,和,彼此之间。 

 

 上述距离度量具有以下特征:

  • 对于每种方法,距离的绝对值是不同的。
  • 除 Wasserstein 方法外,所有方法的测试和训练直方图值之间的最小距离都相似。Wasserstein 方法根据位置(均值差)、大小(标准差差)和形状(相关系数)计算距离。

下面显示了给定半径R=5的原始灰度图像和对应的 LBP 图像:

接下来,我们将评估半径变化对图像清晰度的影响。为此,需要通过将半径值从 1 更改为 10 来执行 Python 代码。对 LBP 图像清晰度的最终影响如下图所示。

从相关性P = (8R+16)/3中获得了许多点的半径。请注意,随着半径的增加,图像中的图案变得更加清晰。在半径 5 和点 20-25 附近,主拱的主要图案以及次要图案的图案变得更加清晰。在非常高的半径处,次要图案变得不那么明显:

从前面的图像中也可以清楚地看到以下内容:

  • 选择RP对于模式识别很重要。
  • 初始值可以通过P = (8R +16)/3选择,但对于给定的RP值大于此值并不意味着性能不佳,如上例中R=5, P=25所示.
  • 选择的模式明显优于R=4  P=16示例,并且与R=5.5  P=20非常相似。

另请注意,此处的示例仅提供适用于该图像的指南。对于不同尺寸的图像,应用本示例中的学习,首先选择P的初始值,然后调整RP以获得所需的图案。

LBP的计算成本

与传统的神经网络方法相比,LBP 的计算成本更低。LBP 的计算成本由 Li Liu、Paul Fieguth、Xiaogang Wang、Matti Pietik äinen 和 Dewen Hu 在他们的论文Evaluation of LBP and Deep Texture Descriptors with A New Robustness Benchmark中提出。论文的详细信息可以在这里找到:https ://www.ee.cuhk.edu.hk/~xgwang/papers/liuFWPHeccv16.pdf

作者根据在具有 16 GB RAM 的 2.9 GHz Intel 四核 CPU 上对 480 个 128 x 128 大小的图像进行特征提取所花费的平均时间来确定计算成本。时间不包括训练时间。研究发现,与被认为中等的 AlexNet 和 VGG 相比,LBP 特征提取非常快。

将 LBP 应用于纹理识别

现在我们了解了 LBP 的基础知识,我们将把它应用到纹理识别示例中。对于此示例,已将 11 个训练图像和 7 个测试图像(大小为 50 x 50)开发为以下类别:

  • 训练图像
  •                 图案图像 (7)
  •                 普通图片 (4)
  • 测试图像
  •                 图案图像 (4)
  •                 普通图片 (3)

生成 LBP 模式步骤 15应用部分,然后将每个测试图像的 LBP 直方图与所有训练图像进行比较,以找到最佳匹配。尽管使用了不同的直方图比较方法,但对于此分析,卡方检验将用作确定匹配的主要方法。正确匹配的最终摘要输出用绿线显示,而不正确的匹配将用红线显示。实线是距离最小的第一个匹配,而虚线是下一个最佳匹配。如果下一个最佳匹配的直方图之间的距离比最小距离远得多,则只显示一个值(最小距离),表明系统对该输出具有相当高的置信度。

下图显示了使用 LBP 对测试和训练灰度图像之间的匹配过程。实线表示最接近的匹配,而虚线表示第二接近的匹配。第三张测试图像(左起)只有一个匹配,这意味着当图像转换为灰度时,模型对其预测非常有信心。第二、第三和第六个训练图像(右起)没有对应的测试图像匹配:

在这里,我们可以看到,一般来说,基于有限的训练数据(11 个样本),LBP 的结果非常好,在考虑的 7 个测试样本中只有一个错误。要了解上图中的相关性是如何完成的,我们需要绘制 LBP 直方图并比较训练图像和测试图像之间的直方图。下图分析了每个测试图像,并将它们的直方图与最接近匹配的相应测试图像的直方图进行比较。

n_points = 25意味着 LBP 中有 25 个点。使用 LBP 直方图的关键优势在于平移的归一化,从而使它们具有旋转不变性。我们将逐个分析每个直方图。直方图的x轴是 25,表示点数 (25),而y轴是 LBP 直方图箱。

下图中显示的两个图像都有图案并且看起来很相似:

前面图像的直方图分析显示了类似的模式,显示了使用 LBP 的正确匹配。下图中显示的两个图像都有图案并且看起来很相似。实际上,它们是从不同方向和不同光线阴影拍摄的地毯的相同图像:

 前面图像的直方图分析显示了类似的模式,显示了使用 LBP 的正确匹配。下图中显示的两个图像有图案,但它们来自不同的地毯:

 前面图像的直方图分析显示了类似的模式。它们的图案看起来很相似,但图像实际上是不同的。所以,这是一个糟糕的匹配的例子。

下图中的第一张图像有一个图案(与我们已经看到的相比,这是一个弱图案),训练后的图像根本没有图案,但似乎在地毯上有污点:

 前面图像的直方图分析显示了类似的模式。它们的图案看起来很相似,但图像实际上是不同的。这是匹配不佳的另一个例子。由于红地毯上的污渍,LBP 似乎认为这些图像相似。

下图显示了 LBP 将灰色地毯与前面的红色地毯匹配:

LBP 直方图显示出类似的趋势——这是有道理的,因为 LBP 是一种灰度图像识别技术。

下图显示了 LBP 将硬木地板与地毯相匹配:

请注意,火车图像没有硬木地板,因此 LBP 发现叶子形状的地毯是与纹理木地板最接近的匹配。

最后一张 LBP 图像显示了类似的图像,几乎没有图案:

在这里,LBP 预测似乎是正确的。

将顶部直方图与底部直方图进行比较,以可视化直方图在测试图像和训练图像之间的比较情况。详细的 Python 代码可以在https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter02/Chapter2_LBPmatching_texture.ipynb找到。

将面部颜色与基础颜色匹配——LBP及其局限性

由于我们在纹理识别方面使用 LBP 取得了相对较好的成功,让我们尝试另一个示例来了解 LBP 的局限性。在此示例中,从浅到深(测试)的 7 种面部颜色将与 10 种基础颜色(训练)相匹配,这些颜色是 50 x 50 大小的图像。

与纹理识别示例类似,将应用生成 LBP 模式部分的步骤 15,然后将每个面部彩色图像 LBP 直方图与所有基础彩色图像 LBP 直方图进行比较,以找到最佳匹配。尽管已经使用了不同的直方图比较方法,但对于此分析,卡方检验将用作确定匹配的主要方法。最终的汇总输出如下图所示:

正如我们所看到的,LBP 提供的结果很差,所有面部颜色都导致基础颜色 4 或 8。要理解为什么会出现这种情况,请使用 RGB、灰度和两个级别的 LBP 图像(一个使用 R2.5, P12 和另一个 R5.5, P20) 已被绘制。这是由两个因素造成的:

  • 人脸颜色的 RGB 到灰度转换会导致图像中出现不必要的亮度,这在比较过程中会产生误导。
  • LBP 转换采用这些模式并生成无法正确解释的任意灰色阴影。

下图显示了两幅图像——面部颜色 1 和 7——分别代表白皙和深色的肤色,以及 LBP 不同步骤的结果。每张图像都被转换为灰度,这表明两幅图像的中间都有一个从原始彩色图像中看不到的亮点。然后,对图像应用两个 LBP 操作:一个半径为 2.5,另一个半径为 5.5。在这里,我们可以看到应用 LBP 后有相当多的相似之处,这在原始彩色图像中是没有预料到的。让我们看一下下面的图片:

第一个问题的可能解决方法是应用我们在第 1 章“计算机视觉和 TensorFlow 基础”中研究过的高斯滤波来抑制模式。应用高斯滤波器和 LBP 的结果如下图所示:

即使应用了滤镜,也无法清楚地区分明暗两种灰色。由此我们可以得出结论,LBP 并不是一种好的人脸颜色识别方法。

脸色与底色的搭配——配色技巧

对于这种方法,RGB图像没有转换成灰度;相反,七种面部颜色和 10 种基础颜色中的每一种的颜色强度值是使用以下 Python 代码确定的(针对每种情况重复):

facecol1img = Image.open('/…/faceimage/facecol1.JPG') 
facecol1arr = np.asarray(facecol1img) 
(mfc1, sfc1) = cv2.meanStdDev(facecol1arr) 
statfc1 = np.concatenate([mfc1, sfc1])。 flatten()
打印 ("%s statfc1" %(statfc1))

输出有六个元素。前三个是平均 RGB 值,而接下来的三个是 RGB 值的标准差。

面部和基础颜色之间的强度差异计算如下:

让我们看一下下面的图像,它代表了脸部和粉底颜色:

矩阵中差异最小的值是最佳匹配。我们可以看到,对于每种面部颜色,匹配(如对角线上的最小值点所示)得到了一个合理的值,表明颜色匹配技术应该是面部颜色与基础颜色匹配的首选方法.

概括

在本章中,我们学习了如何获取图像像素并将其与给定半径内的相邻像素阈值,然后执行二进制和积分运算来创建 LBP 模式。LBP 模式是无监督机器学习的一个很好的例子,因为我们没有用输出训练分类器;相反,我们学习了如何调整 LBP 的参数(半径和点数)以得到正确的输出。LBP 被发现是一种非常强大且简单的纹理分类工具。然而,当图像没有纹理时,LBP 并没有返回好的结果,我们学习了如何开发一个 RGB 颜色匹配模型来匹配彩色的无纹理图像,例如面部和基础颜色。要创建 LBP 表示,必须将图像转换为灰度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MPLS隧道——PE与CE之间运行不同路由协议的情况分析

目录 PE和CE之间运行OSPF路由协议 Ospf的Dmian ID(还原属性) Ospf的Sham Link属性 OSPF的DN置位与VPN Router Tag PE和CE之间运行BGP路由协议 AS号替换功能 BGP的SoO属性 PE和CE之间可以不同部署不同的路由协议,部署不同的路由协议会存…

量子笔记:多比特量子门

目录 0. 前言 2. 量子多重H门 3. 量子SWAP门 4. 量子CNOT门(CX门):受控非门 5. 量子CY和CZ门 6. 量子C*门 6.1 受控S门 6.2 受控H门 6.3 受控Z旋转门 6.4 受控X旋转门 6.4 受控Y旋转门 7. 量子托佛利门(CCNOT门) 8. 量子弗雷德…

【Linux】Linux中的gcc/g++编译器的使用

💬推荐一款模拟面试、刷题神器 、从基础到大厂面试题:👉点击跳转刷题网站进行注册学习 目录 一、编译的过程 1、预处理阶段 1.1预处理的工作——头文件展开、去注释、宏替换、条件编译 1.2外部定义宏(-D选项) 1.…

记一次网络安全应急响应流程

0x01 事件分析 网站源码被篡改,攻击者一定获取到了权限,那么接下来的思路就是推测攻击者入侵手段,找到业务脆弱点,对服务器进行全方位排查,找到攻击者留下来的痕迹并进行分析处理。 2.1 信息收集 与客户简单沟通后&…

【C++】动态联编、delete/free【有无析构】的使用,虚析构

文章目录动态联编的条件:联编的概念:1. 动态联编:2. 静态联编:静态联编时确认了那些属性:结论:基类指针和派生类指针访问虚函数结论:delete和free的使用条件:1. 没有析构函数时&…

由一个按键程序引发的思考(上)

说起按键程序,只要会单片机的肯定都很熟悉。一般开始学习单片机的时候,入门程序基本都是LED灯和按键。那么这个按键程序有什么特别的吗,还需要专门去思考吗?如果我刚开始学单片机的时候也会这么想,但是随着项目的积累&…

微信早安消息推送(大升级版-企业微信)

微信早安消息推送(企业微信) 在微信公众号推送的基础上的一个升级 新增图文、疫情状况等 可以修改头像 、 昵称 效果展示 更多资讯 源代码获取 → 薇信公粽号“Cloud技术栈”,回复“企业微信推送” ———————————————————…

【贪心算法-LeetCode3:无重复字符的最长子串(Java实现)】

无重复字符的最长子串一、题目描述1.题目内容2.样例二、解决方案1.算法流程1)分析2)算法流程2.Java代码1)核心代码2)完整测试代码个人社区:https://bbs.csdn.net/forums/smile 个人主页:https://blog.csdn.…

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁📍相关篇《【硬件开源电路】STM32G070RBT6开发板》🌺配置内容演示: 📚功能介绍 📑通过STM32CubeMX配置定时器1和定时器3分别作为两个led的定时闹钟。这里作为…

单片机原理及应用实验一交通信号系统(基于Proteus仿真)

1.实验内容与要求 交通信号系统是保障交通安全高效的重要设施。51单片机价格低廉、体积小、低功耗、抗干扰性好等优点,适用于交通信号系统中,本实验利用51单片机IO口的开关量的输入输出功能及内部CPU运算功能,设计一个简易的交通信号灯系统&…

生成.keystore 安卓签名

需要有openssl.exe和keytool.exe支持 signapk.jar手动签名命令 java -jar signapk.jar pl.x509.pem pl.pk8 smartrecord_3.5.8.apk smartrecord_3.5.8-signed.apk除了直接使用signapk.jar签名外,还可以将签名文件生成keystore文件,然后配置编译器给apk进…

数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(5)

文章目录前期准备1. 将create Time列设置为索引2. 生成一个和df长度相同的随机数DataFrame3. 将上一题生成的DataFrame与df合并4. 生成的新的一列new值为salary列减去之前生成的随机数列5. 检查数据中是否含有空值6. 将salary类型转换成浮点数7. 计算salary 大于10000的次数8. …

多线程之线程池

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、什么是线程池二.为什么要有线程池引入:为什么从池子里取,比创建线程速度要快什么是用户态,什么是内核态最终结论&#xf…

aws 负载均衡clb/nlb/alb

目录 概述 传统负载均衡器(Classic Load Balancer) DNS解析 健康检查(Health Check) 监听器(Listeners) 连接耗尽(Connection Draining) 粘性会话/会话关联(Sticky Sessions/…

(四)手写简单版MyBatis框架

文章目录环境搭建第一步:资源⼯具类第二步:定义SqlSessionFactoryBuilder类第三步:定义SqlSessionFactory类第四步:定义JDBC事务管理器第五步:定义数据源类第六步:定义MyMappedStatement类第七步&#xff1…

基于遗传算法卡车无人机旅行推销员问题(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Leetcode刷题111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2 示例 2: 输入…

Python_机器学习_算法_第7章_7.拓展知识

Python_机器学习_算法_第7章_7.拓展知识 文章目录Python_机器学习_算法_第7章_7.拓展知识7.拓展知识7.1. 其他距离公式1 标准化欧氏距离2 余弦距离3 汉明距离【了解】4 杰卡德距离【了解】5 马氏距离【了解】7.2.再议数据分割1 留出法2 交叉验证法2.1 交叉验证法基本介绍2.2 KF…

ARM发布Cortex-X3和Cortex-A715

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 ARM公司发布了第二代 AR…

x86 smbus 下挂eeprom不能写问题

目录 背景 分析 驱动影响 SPD register 接口 只读 修改验证 总结 背景 x86 smbus上下挂一个eeprom,只能读取,不能写入。 写入命令采用: i2cset -y -f 0 0x50 0 0x33 即向总线0 下的0x50 地址的eeprom偏移量0 写入数据0x33, 命令…