具有Python&OpenCV的本地二进制模式

  • 1. 效果图
  • 2. 原理
    • 2.1 项目结构
    • 2.2 数据集构建
    • 2.3 什么是本地二进制模式?
  • 3. 源码
  • 参考

这篇博客将介绍如何使用本地二进制模式图像描述符(以及一点机器学习)来自动分类和识别图像中的纹理和模式(例如包装纸,蛋糕糖霜或蜡烛的纹理/模式)。

1. 效果图

效果图如下:能准确的识别出笔记本封面、桌布、地毯、键盘 四种纹理不同的物品;


四种不同类型纹理的LBP图与识别图如下:
可以看到纹理还是有极大的不同的~

2. 原理

2.1 项目结构

2.2 数据集构建

随手拿起了相机,拍了触手可及的桌布、键盘、笔记本封面、地毯4种纹理不同的照片各5张;

2.3 什么是本地二进制模式?

本地二进制模式LBPS,是由Ojala等人的工作流行的纹理描述符。

与Haralick纹理功能不同,Haralick纹理功能:基于灰度级共发生矩阵计算纹理的全局表示。而LBPS只计算纹理的局部表示,通过将每个像素与其周围的像素邻域进行比较来构造该本地表示。

构建LBP纹理描述符的第一步是将图像转换为灰度。对于灰度图像中的每个像素,我们选择围绕中心像素的R个附近像素。然后计算该中心像素的LBP值,并存储在输出2D阵列中,其宽度和高度与输入图像相同。


将中心像素(以红色突出显示)并抵靠其邻近8像素的邻居。如果中心像素的强度大于或等于其邻居,则将值设置为1;否则,将其设置为0。周围像素8个,总共有2 ^ 8 = 256个可能的LBP代码组合。

从右上角开始,顺时针0~7,将二进制值转换为十进制值,并填在中心像素值上。

然后对输入图像中的每个像素重复该阈值,累积二进制字符串和存储LBP阵列中的输出十进制值的过程。

最后一步是在输出LBP数组上计算直方图。由于3×3邻域有2 ^ 8 = 256可能的模式,因此LBP 2D阵列具有0的最小值为0和最大值为255,允许将其作为最终特征向量构建LBP代码的256箱直方图:

这个原始LBP实施的主要好处是可以在图像中捕获极其细粒度的细节。但是,能够以这样的小规模捕获细节也是算法的最大缺点——无法以不同的尺度捕获细节,只有固定的3 x 3刻度!

为了处理这一点,Ojala等人提出了对原始LBP实施的扩展。处理变量邻域大小。要考虑可变邻域大小,介绍了两个参数:

  • 循环对称邻域中的点P的数量(从而消除依赖于方形邻域)。
  • 圆圈R的半径,这使我们能够考虑不同的尺度。

可变邻域大小示例:

那么为什么统一的LBP模式如此有趣?简单地说:它们增加了额外的旋转级别和灰度不变性,因此在从图像中提取LBP功能向量时通常使用它们。

本地二进制模式LBPS实现可以在Scikit-Image和Mahotas封装中找到。 OpenCV还实现了LBP,但未公布源码。通常建议使用Lbps的Scikit-Image实现,因为其提供了更多控制要生成的LBP直方图类型。此外,Scikit-Image实现还包括LBP的变体,可提高旋转和灰度不变性。

3. 源码

# USAGE
# python recognize.py --training images/training --testing images/testingimport argparse
import osimport cv2
import imutils
from imutils import paths
# 导入必要的包
from pyimagesearch.localbinarypatterns import LocalBinaryPatterns
from sklearn.svm import LinearSVC# 构建命令行参数及解析
# --training 用于训练模型的图像 4*4 =16
# --testing 用于测试模型的图像 4*1 =4
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--training", required=True,help="path to the training images")
ap.add_argument("-e", "--testing", required=True,help="path to the tesitng images")
args = vars(ap.parse_args())# 初始化本地二进制描述符类,data和类标签list
desc = LocalBinaryPatterns(24, 8)
data = []
labels = []# 遍历训练集图片
for imagePath in paths.list_images(args["training"]):# 加载图像,转换灰度图,提取本地二进制模式image = cv2.imread(imagePath)image = imutils.resize(image, width=400)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)hist = desc.describe(gray)# 从图像路径中提取类标签,更新data和图像类标签labels.append(imagePath.split(os.path.sep)[-2])data.append(hist)# 在数据上训练线性SVM分类器
model = LinearSVC(C=100.0, random_state=42)
model.fit(data, labels)# 测试分类器的性能和准确性
# 遍历测试数据集
for imagePath in paths.list_images(args["testing"]):# 加载图像,转换灰度图,提取分类本地二进制描述符即纹理image = cv2.imread(imagePath)image = imutils.resize(image, width=400)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)hist = desc.describe(gray, imagePath)prediction = model.predict(hist.reshape(1, -1))# 展示图像和预测结果cv2.putText(image, prediction[0], (10, 30), cv2.FONT_HERSHEY_SIMPLEX,1.0, (0, 0, 255), 3)cv2.imshow("Image " + str(imagePath), image)cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2015/12/07/local-binary-patterns-with-python-opencv/

具有Python&OpenCV的本地二进制模式相关推荐

  1. 使用Python,OpenCV,本地二进制模式(LBP)进行人脸识别

    使用Python,OpenCV与本地二进制模式(LBP)进行人脸识别 1. 效果图 2. 原理及步骤 2.1 原理 2.2 步骤 3. 源码 参考 在深度学习和暹罗网络之前,面部识别算法依赖于特征提取 ...

  2. Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features)

    Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features) 理论 We know SIFT us ...

  3. python2打开文件_关于python:何时以二进制模式打开文件(b)?

    我注意到在文档中他们总是用'wb'打开一个CSV文件. 为什么'b'? 我知道b代表二进制模式,但是你什么时候使用二进制模式(我猜想CSV文件不是二进制模式). 如果相关我是从arcpy.da.Sea ...

  4. Python OpenCV cv2和二进制图片互转

    文章目录 问题描述 代码 参考文献 问题描述 1.png https://img-blog.csdnimg.cn/20200819095325567.png 代码 import cv2 import ...

  5. 二进制算法_本地二进制模式算法:其背后的数学❗️

    二进制算法

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

  7. python播放本地视频_python opencv 读取本地视频文件 修改ffmpeg的方法

    Python + opencv 读取视频的三种情况: 情况一:通过摄像头采集视频 情况二:通过本地视频文件获取视频 情况三:通过摄像头录制视频,再读取录制的视频 摄像头采集.本地视频文件的读取.写视频 ...

  8. 用matlab的lbp算子,Matlab学习: LBP(局部二进制模式)用于人脸识别

    1. 算法简介 LBP是一种用于纹理分类的简单有效的特征提取算法. LBP运算符由Ojala等人在1996年提出. 主要论文是"具有局部二进制模式的多分辨率灰度和旋转不变纹理分类" ...

  9. python能不能用c打开文件_C/C++/Python等 使用二进制模式打开文件与不使用二进制模式的区别...

    C语言中文本文件与二进制文件的区别 一.文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的.这两者只是在编码层次上有差异. ...

最新文章

  1. 如何在算法交易中使用AI?摩根大通发布新版指南
  2. 交换机配置软件_交换机常见故障分类与排除方法
  3. Linux bash学习
  4. 安装memcached:error while loading shared libraries: libevent-1.4.so.2
  5. SpringSecurity AuthenticationManagerProviderManager
  6. linux firewalld
  7. Collectiont和Collections的区别
  8. CUDA程序kernel函数的运行时间限制
  9. Android 常用语句
  10. 计算机电子表格证怎么样,初学者在电脑上如何制作电子表格
  11. echarts渐变色
  12. python学生姓名添加删除_python-函数-实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统。...
  13. Unity_AR_Vuforia_实现涂涂乐
  14. `Caché/IRIS` 代码优化效率提升十一条 - 持续更新
  15. 基本算法-回溯法(迷宫问题)
  16. samba -smb开启v2协议
  17. vscode-tab按键失效变为切换控件解决
  18. Red Hat 认证工程师(RHCE)
  19. linux中白屏变黑屏咋变,解决 APP启动白屏黑屏问题
  20. 食品安全大数据可视化关联分析

热门文章

  1. 2021年大数据ELK(二十一):Logstash简介和安装
  2. 2021年大数据Kafka(十二):❤️Kafka配额限速机制❤️
  3. 2021年大数据Spark(五十三):Structured Streaming Deduplication
  4. PHP 算法题:有多少苹果用来分赃1.1
  5. [JavaScript] JavaScript 运算符与流程控制
  6. Python:数据导入、爬虫:csv,excel,sql,html,txt
  7. C++ 字符串字母大小写转换
  8. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
  9. Redis系列2- C#中使用Redis的示例
  10. Python 常见的坑汇总