🔎大家好,我是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))
对训练图像和测试图像重复上一节中的步骤 1到5,以创建图像的 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 附近,主拱的主要图案以及次要图案的图案变得更加清晰。在非常高的半径处,次要图案变得不那么明显:
从前面的图像中也可以清楚地看到以下内容:
- 选择R和P对于模式识别很重要。
- 初始值可以通过P = (8R +16)/3选择,但对于给定的R,P值大于此值并不意味着性能不佳,如上例中R=5, P=25所示.
- 选择的模式明显优于R=4 , P=16示例,并且与R=5.5 , P=20非常相似。
另请注意,此处的示例仅提供适用于该图像的指南。对于不同尺寸的图像,应用本示例中的学习,首先选择P的初始值,然后调整R和P以获得所需的图案。
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 模式的步骤 1到5应用部分,然后将每个测试图像的 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 模式部分的步骤 1到5,然后将每个面部彩色图像 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 表示,必须将图像转换为灰度。