Python实现LBP纹理提取

news2024/11/24 19:00:20

1、什么是LBP纹理特征?

LBP(Local Binary Patterns,局部二值模式)是提取局部特征作为判别依据的,一种有效的纹理描述算子,度量和提取图像局部的纹理信息。它具有旋转不变性和灰度不变性等显著的优点,对光照具有不变性。由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出用于纹理特征提取。

LBP特征基本描述:

LBP的基本思想是定义于像素的8邻域中(3x3的窗口), 以中心像素的灰度值为阈值, 将周围8 个像素的值与其比较, 如果周围的像素值小于中心像素的灰度值, 该像素位置就被标记为0, 否则标记为1。这样3x3的邻域内的八个点经过比较,顺时针能够产生8位二进制数(通常转换为十进制,即LBP码,共256种),每个像素得到一个二进制组合, 即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息,如下图。

LBP算法的核心思想,是以某个像素点为中心,与其邻域像素点共同计算。所以光照变化很难改变中心像素点的灰度值与周围8个像素的大小关系。因为光照是一种区域性质的变化,而不是单像素性质的变化。

LBP特征改进描述:

1)圆形LBP算子:

基本的 LBP算子的最大缺陷在于它只覆盖了一个3 ∗ 3 3*33∗3固定范围内的小区域,这显然不能满足不同尺寸纹理的需要。为了适应不同尺寸的纹理特征,达到灰度和旋转不变性的要求。Ojala将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域。改进后的 LBP 算子允许在半径为 R的圆形邻域内有任意多个像素点。从而得到了半径为R的圆形区域内含有P个采样点的LBP算子,如下图。

2)LBP旋转不变模式算子:

为保证图像旋转时LBP不变,提出了LBP旋转不变算法。即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。这样就出现了多个位置模式对应同一个LBP值的情况,但这其实保证了图像旋转以后还是同一个值。如下图,8种模式都对应的一个LBP(00001111),8种模式可以看做一个图旋转个不同的角度(黑色0,白色1)。

3)LBP等价算子:

由上可知LBP会产生很多不同的模式,比如半径5,20个采样点,就有可能产生 2^{20} 种二进制模式,这对图像整体纹理描述很不方便。即使在纹理分类或人脸识别时采用的是LBP模式的统计直方图来进行的,但数据量过大将不合适,且直方图表示过于稀疏。所以需要对LBP模式进行降维,使得利用更少的数据就可以表达很好的图像纹理信息。

Ojala提出了(Uniform Pattern)进行降维,利用LBP算子中0,1改变的次数来进行归类,定义从0到1或从1到0最多有两次突变时,该LBP对应的称为一个等价模式,而等价模式以为的都归为混合模式。这样等价模式的总数为2+2(p-1)+(p-1)(p-2)/2种,其中p为采样点数。0次突变2种,1次突变2(p-1)种,两次突变(p-1)(p-2)/2种。

2、基于python的LBP实现

  • 首先将检测窗口划分为16×16的小区域(cell);
  • 对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
  • 然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。
  • 最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;

然后便可利用SVM或者其他机器学习算法进行分类了。参考一些博客中的代码实现效果如下:

from skimage.feature import local_binary_pattern
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

img = np.array(Image.open("./111.tif"))
# lbp是像素矩阵
n_point, radius = 8, 3
lbp = local_binary_pattern(img, n_point, radius, 'default')
max_bins = int(lbp.max() + 1)  # .max()取lbp中最大的数
# test_hist是某个灰度级的个数即y坐标。-是横坐标。
test_hist, _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))

plt.figure(figsize=(10, 4.5))
plt.imshow(lbp,cmap='gray')
plt.show()
plt.pause(10)

local_binary_pattern参数详解:

local_binary_pattern(image, P, R, method='default')

参数(调参)
image:(N,M)阵列灰度图像。(只能是灰度图)

P:int圆对称邻居设置点的数量(角度空间的量化)。

R:float圆的半径(操作员空间分辨率)。

method:{‘default’,‘ror’,‘uniform’,‘var’}确定模式的方法(调参使用)

  •     'default':原始的局部二值模式,它是灰度但不是旋转不变的。
  •     'ror':扩展灰度和旋转不变的默认实现。
  •     'uniform':改进的旋转不变性和均匀的模式以及角度空间的更精细的量化,灰度和旋转不变。
  •     'nri_uniform':非旋转不变的均匀图案变体,它只是灰度不变的R199。
  •     'var':局部对比度的旋转不变方差度量,图像纹理是旋转但不是灰度不变的。

返回值:输出:(N,M)阵列LBP图像

np.histogram()解释:

np.histogram()是一个生成直方图的函数
histogram(a,bins=10,range=None,weights=None,density=False);
 
a是待统计数据的数组;
 
bins指定统计的区间个数;
 
range是一个长度为2的元组,表示统计范围的最小值和最大值,默认值None,表示范围由数据的范围决定
 
weights为数组的每个元素指定了权值,histogram()会对区间中数组所对应的权值进行求和
 
density为True时,返回每个区间的概率密度;为False,返回每个区间中元素的个数
 
a = np.random.rand(100)
hist,bins = np.histogram(a,bins=5,range=(0,1))
print(hist)
print(bins)

# 输出
# [19 30 15 16 20]
# [ 0.   0.3  0.4  0.6  0.9 1. ]

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

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

相关文章

uniapp中使用vuex(解决uniapp无法在data和template中获取vuex数据问题)

uniapp中使用vuex(解决uniapp无法在data和template中获取vuex数据问题) 1. uniapp中引入vuex2. uniapp中使用vuex3. 解决uniapp无法在data和template中获取vuex数据问题 1. uniapp中引入vuex 1 .在根目录下新建文件夹store,在此目录下新建index.js文件&…

第五章——动态规划3

蒙德里安的梦想 我们在黑框内横着放红框,我们发现当横向小方格摆好之后,纵向小方格只能一次纵向摆好,即纵向小方格只有一种方案,即整个摆放小方格的方案数等于横着摆放小方格的方案数 f[i,j]表示的是现在要在第i列摆,j…

代码随想录Day64(一刷完结)

今天学习单调栈解决最后一道题 84.柱状图中的最大矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,…

C++中的list容器

文章目录 list的介绍list的使用list的构造list iterator的使用list capacitylist元素访问list modifierslist的迭代器失效 list与vector的对比 list的介绍 list是可以在常数范围内的任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代;   …

FFMPEG中的filter使用二

上一篇我们在使用滤镜时是手动创建各种滤镜,然后根据处理链路手动链接不同的过滤器,有助于我们理解滤镜的流程。这一篇我们使用参数形式,让ffmpeg自动帮我们创建和链接过滤器,这样可以减少代码量,同时我们可以先使用参…

学系统集成项目管理工程师(中项)系列15_质量管理

1. 质量(Quality)的定义 1.1. 反应实体满足主体明确和隐含需求的能力的特性总和 1.2. 明确需求是指在标准、规范、图样、技术要求、合同和其他文件中用户明确提出的要求与需要 1.3. 隐含需求是指用户和社会通过市场调研对实体的期望以及公认的、不必明…

thinkphp路由,请求和响应

文章目录 定义获取路由后面的参数跨域请求请求响应 定义 thinkphp定义路由一般在route路由下的app.php中 下面这是一个简单的路由 Route::rule(admin/login,/app/controller/Admin/login)->middleware(\app\middleware\MyMiddleware::class);该路由表示当访问admin/login时…

人工智能课程笔记(7)强化学习(基本概念 Q学习 深度强化学习 附有大量例题)

文章目录 1.强化学习与深度学习的区别2.强化学习中的基本概念3.强化学习、有监督学习和无监督学习的区别4.强化学习的特点5.离散马尔可夫过程6.马尔可夫奖励过程7.马尔可夫决策过程8.策略学习8.1.策略学习概念8.2.策略评估与贝尔曼方程 9.强化学习的最优策略求解10.基于价值的强…

K8s基础1——发展起源、资源对象、集群架构

文章目录 一、发展起源二、资源对象2.1 集群类2.2 应用类2.3 存储类2.4 安全类 三、集群架构 一、发展起源 K8s官方文档 K8s怎么来的? 十几年来,谷歌内部使用的大规模集群管理系统是Brog,基于容器技术实现了资源管理的自动化和跨多个数据中心…

基于Python的连锁超市收银系统的开发与研究_kaic

基于Python的连锁超市收银系统的开发与研究 摘要:近几年来,国内的连锁超市收银系统也在不断的发展与完善,超市收银系统是一个超市管理的核心,他决定了超市的安全性。目前,大大小小的超市基本上由传统的人工管理逐渐过渡…

IT 面试手册 - 序

IT 面试手册 - 序 前言 首先,感谢你阅读我的文章。作为在计算机互联网行业摸爬滚打近十载的半个过来人,在这里分享一些关于求职面试和自我提升的心得感悟,希望能够给你一些启发。 背景 对于 IT 从业者来说,当今这个时代&#x…

Docker的四种网络模式

1.Host 模式 通常来讲,启动新的Docker容器,都会分配独立的Network Namespace隔离子系统,如果在运行是指定为host模式,那么Docker容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace子…

计算机网络知识复习

目录 TCP/IP协议群做了哪些事情? TCP协议为什么是3次握手,4次挥手? 如果网络延迟是30ms,那么Ping(基于UDP的)一个网站需要多少ms? 如果请求一个HTTP协议的网站,TTFB至少ms? CDN更换图片&am…

WeakMap 与 WeakSet

WeakSet WeakSet 结构与 Set 类似,也是不重复的值的集合。 成员都是数组和类似数组的对象,WeakSet 的成员只能是对象,而不能是其他类型的值。 若调用 add() 方法时传入了非数组和类似数组的对象的参数,就会抛出错误。 const b …

Linux进程间通信 - 信号(signal) 与 管道(pipe) 与 消息队列

什么是进程间通信,就是进程与进程之间进行通信,互相发送消息;可以通过 信号 或者 管道 或者 消息队列 或者 信号量 去通信! 目录 一、信号 1. 信号简介 2. 都有那些信号? 3. 注册信号的函数 1). signal 2). sig…

十一、通过六个因素对织物起球等级进行预测

一、需求分析 根据之前做训练的模型,对不同等级的标准样卡进行测试 测试样本有48张,其中包括起球个数、起球总面积、起球最大面积、起球平均面积、对比度、光学体积六个指标,最终确定出织物的等级 数据集fiber.csv大致结构如下: …

微服务保护 笔记分享【黑马笔记】

微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I&#xff…

Notion——构建个人知识库

前言 使用Notion快三年了,它All in one的理念在使用以后确实深有体会,一直想找一个契机将这个软件分享给大家,这款笔记软件在网上已经有很多的教程了,所以在这里我主要想分享框架这方面给大家,特别对于学生党、准研究生…

【Java笔试强训 12】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥二进制插…

深圳雷龙SD NAND的存储应用方案

前言: 很感谢深圳雷龙发展有限公司为博主提供的两片SD NAND的存储芯片,在这里博主记录一下自己的使用过程以及部分设计。 深入了解该产品: 拿到这个产品之后,我大致了解了下两款芯片的性能。CSNP4GCR01-AMW是一种基于NAND闪存和SD控制器的4G…