局部二值模式LBP

article/2025/9/19 2:29:06

文章目录

    • 1.基础介绍
    • 2.局部二值模式(Local Binary Patterns,LBP)编码介绍
    • 3.使用`skimage`求`lbp`
    • 参考资料


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.基础介绍


局部二值模式(Local Binary Patterns,LBP)是一种用于图像处理和计算机视觉中的特征描述符。它通过将每个像素与其周围像素进行比较,并将结果编码为二进制数来描述图像的纹理信息。

LBP最初由芬兰奥卢大学的Timo Ojala、Matti Pietikainen和Topi Maenpaa于1994年在论文Multiresolution Gray-scale and Rotation Invariant Texture Classification with Local Binary Patterns中提出。他们提出了一种用于纹理分析和识别的算法,并将其应用于人脸识别任务。

LBP算法对于每个像素,将其与周围的8个像素进行比较,将比它亮的像素设为1,比它暗的像素设为0,这样就得到了一个8位二进制数。将这个二进制数转化为十进制数,得到的值即为该像素的LBP值。对于整张图像,可以统计不同LBP值的出现频率,并用这些频率作为图像的特征向量。

在这里插入图片描述

LBP算法具有计算简单、对光照变化不敏感、对噪声具有鲁棒性等优点,因此被广泛应用于图像处理和计算机视觉领域,如纹理分类、人脸识别、行人检测等。


2.局部二值模式(Local Binary Patterns,LBP)编码介绍

在上图中,展示了如何计算中心点的LBP编码,具体的如下:

图片来自于1
在这里插入图片描述

这里选右上角为起始点,沿顺时针方向,从由往左写出LBP的二进制编码,再转成十进制即可。逐像素将结果写到lbp对应的输出数组中,可以得到输出:

图片来自于1
在这里插入图片描述

这里有三点值的注意,一个是LBP编码起始点的选择,另一个是可以选择邻近8个像素,也可以选半径为r圆上的点,最后一个是图像边界像素的处理。

  • 选半径为r圆上的点

在这里插入图片描述

黑色的点表示像素值小于等于中心像素值,白色的点表示比中心像素值大。编码的起始位置为右侧中间的那个点。对于同一个算法实现,起始点只要保持一致就可以了,不同算法实现之间不具有可比性。

在LBP编码时,需要注意的是uniform和非uniform的编码方式,在LBP算法中,uniform是指具有最多两个跳变的二进制模式。例如,在8邻域中,二进制模式00011000、00010001、00001110等都是uniform模式,因为它们只有两个跳变。相反,二进制模式00011101、00100110等不是uniform模式,因为它们具有三个或更多的跳变。uniform LBP是指二进制编码中跳变次数不超过2次的LBP编码。因此,对于8邻域的LBP算法,有256种不同的二进制编码。其中,有59种uniform LBP编码,它们的跳变次数不超过2次。

对于图像分类等任务,使用uniform LBP特征可以减少非uniform LBP特征所引入的噪声,从而提高算法的准确性和稳健性。此外,由于uniform LBP特征的数量相对较少,因此计算速度也相对较快。

特别的,在skimage.feature.local_binary_pattern函数中实现的uniform模式和上面介绍的uniform还不一样,其只包含所有的10都是连续的且邻接的二进制码,对于8个邻近像素的模式,skimage.feature.local_binary_patternuniform编码只包括00000000/00000001/00000011/00000111/00001111/00011111/00111111/01111111/11111111这8种,其他形式的编码都是非uniform的。因此LBP码共有9个值。这种编码带有轮动性,对纹理的旋转有鲁棒性。

使用skimage计算lbp的简单示例如下,对于边界像素使用0值填充,

image = np.array([[5,4,2,2,1],[3,5,8,1,3],[2,5,4,1,2],[4,3,7,2,7],[1,4,4,2,6]], dtype=np.uint8)
radius = 1
n_points = 8
METHOD = "uniform"
lbp = skimage.feature.local_binary_pattern(image, n_points, radius, METHOD)
print(lbp)

计算过程:

在这里插入图片描述

3.使用skimagelbp

代码来自3

from skimage.transform import rotate
from skimage.feature import local_binary_pattern
from skimage import data
from skimage.color import label2rgb
import matplotlib.pyplot as plt
# settings for LBP
radius = 1
n_points = 8 * radiusdef overlay_labels(image, lbp, labels):mask = np.logical_or.reduce([lbp == each for each in labels])return label2rgb(mask, image=image, bg_label=0, alpha=0.5)def highlight_bars(bars, indexes):for i in indexes:bars[i].set_facecolor('r')image = data.brick()
lbp = local_binary_pattern(image, n_points, radius, METHOD)def hist(ax, lbp):n_bins = int(lbp.max() + 1)return ax.hist(lbp.ravel(), density=True, bins=n_bins, range=(0, n_bins),facecolor='0.5')# plot histograms of LBP of textures
fig, (ax_img, ax_hist) = plt.subplots(nrows=2, ncols=3, figsize=(9, 6))
plt.gray()# 根据二进制编码划分边,平坦和角特征
titles = ('edge', 'flat', 'corner')
w = width = radius - 1
edge_labels = range(n_points // 2 - w, n_points // 2 + w + 1)
flat_labels = list(range(0, w + 1)) + list(range(n_points - w, n_points + 2))
i_14 = n_points // 4            # 1/4th of the histogram
i_34 = 3 * (n_points // 4)      # 3/4th of the histogram
corner_labels = (list(range(i_14 - w, i_14 + w + 1)) +list(range(i_34 - w, i_34 + w + 1)))
label_sets = (edge_labels, flat_labels, corner_labels)for ax, labels in zip(ax_img, label_sets):ax.imshow(overlay_labels(image, lbp, labels))for ax, labels, name in zip(ax_hist, label_sets, titles):counts, _, bars = hist(ax, lbp)highlight_bars(bars, labels)ax.set_ylim(top=np.max(counts[:-1]))ax.set_xlim(right=n_points + 2)ax.set_title(name)ax_hist[0].set_ylabel('Percentage')
for ax in ax_img:ax.axis('off')

在这里插入图片描述

上面的代码中,因为参数radius=1, num_points=8,mode=uniform,因此其对应的二进制LBP编码有9种,其中0000000011111111表示平坦的面,00001111表示边,0011111100000011表示角,如上图所示。

当然,上面是以最简单的radius=1介绍的,当使用更大的半径取更多的点时,每个点上的像素值是通过双线性插值来计算的。LBP算法还有很多变体和改进,如旋转不变LBP、对称LBP、多尺度LBP等,需要根据具体应用场景和需求选择合适的算法和参数。

参考资料

  • 1.https://pyimagesearch.com/2015/12/07/local-binary-patterns-with-python-opencv/
  • 2.https://stackoverflow.com/questions/32105338/uniform-lbp-with-scikit-image-local-binary-pattern-function
  • 3.https://scikit-image.org/docs/stable/auto_examples/features_detection/plot_local_binary_pattern.html

http://chatgpt.dhexx.cn/article/UybDBIhn.shtml

相关文章

LBP(Local Binary Pattern)

一、LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。在1994年提出,由于LBP特征计算简单、效果较好,因此LBP特征在计算…

Windows保护模式(一)段寄存器GDT表

保护模式 x86 CPU的3个模式:实模式、保护模式和虚拟8086模式。 段寄存器 段式内存管理 段式内存管理是将内存划分成若干段,处理器在访问一个内存单元时通过“段基址偏移”的方式计算出实际的物理地址。 在Intel x86处理器中,有专门的段寄存…

段、GDT、调用门学习笔记

保护模式 什么是保护模式 x86 CPU的3个模式:实模式、保护模式、虚拟8086模式。AMD64与Intel64 AMD在1999年的时候拓展了这套指令集,成为x86-64后改名叫AMD64,AMD是首先开发了64拓展,但是AMD的 64位拓展并不支持32位,后来Intel也开发了64位…

linux内核gdt,linux内核学习之全局描述符表(GDT)(二)

在进入保护模式之前,我们先要学习一些基础知识。今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT)。 同实模式一样,在保护模式下,对内存的访问仍然使用段地址加偏移地址。但是,在保护模式下,在每个段能够…

【IDT】 windows IDT GDT LDT

IDT: (Interrupt Descrptor Table)中断描述符表,用来处理中断的。 IDT的获取: 可以通过SIDT指令,它可以在内存中找到IDT,返回一个IDTR结构的地址。也可以通过kpcr结构获取 ISR: …

GDT 表与段选择子等解析

来源:https://blog.csdn.net/qq_37653144/article/details/82821540 https://blog.csdn.net/yeruby/article/details/39718119 https://blog.csdn.net/lindorx/article/details/89410113 全局描述表(GDT Global Descriptor Table):在保护模式下一个重要的数据结构…

GDT和GDTR

文章目录 GDTR和GDTGDT和GDTR关系GDTR的结构GDT的结构如何在MBR中建立GDT和GDTR? GDTR和GDT GDT和GDTR关系 GDT是global descriptor table,全局描述符表,它是描述符组成的一张描述符表。描述符就是段描述符它用来描述一个段的信息,由8个字节…

GDT,LDT,GDTR,LDTR

GDT,LDT,GDTR,LDTR 前言全局描述符表GDT局部描述符表LDT中断描述符表IDT段选择子任务寄存器TR实例1:访问GDT2:访问LDT 前言 所谓工作模式,是指CPU的寻址方式、寄存器大小、指令用法和内存布局等。 实模式 段基址:段内偏移地址”产生的逻辑地…

GDT和LDT详解

1.GDT 我们回顾一下实际的操作系统的内存关系: ​ 程序/进程 → 映射 段 表 逻辑地址 → segment unit 段 基 址 偏 移 地 址 虚拟地址 → page unit 页 表 物理内存地址 \text{程序/进程}\overset{段表}{\xrightarrow[\text{映射}]{}} \text{逻辑地址}\overset{段基址偏移…

GDT(全局描述符表)和LDT(局部描述符表)

Home > GDT(全局描述符表)和LDT(局部描述符表) 每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段&#xff0c…

什么是数据可视化?

到底什么是数据可视化?带你一窥究竟~ 技术人最不该忽视可视化数据分析! 导读:在这个“人人都是数据分析师”的时代,大企业的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环…

当下最火的中台到底是个什么鬼,看完这一篇最通俗易懂的文章后,你就会彻底明白了!...

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你提升技术视野! 背景 自从阿里巴巴现任CEO逍遥子在2015年提出”大中台,小前台”战略以来,关于”什么是中台”,可谓是一石激起千层浪,大量文章在描述…

STD::是什么?

【&#xff23;&#xff0b;&#xff0b;】std&#xff1a;&#xff1a;是什么&#xff1f; 引例&#xff1a; #include<iostream> int main() {std::cout<<"我喜欢C";//输出一句话std::cout<<std::endl;//换行return 0; } 1.std是什么&#xff1…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 算术是什么意思 数学 什么是算术和 算术和是正数的和,即绝对值的和,例如2+13.5+7,Ge个数值皆为正且相加。  主要区别于代数和,…

matlab语句temp,maxtemp什么意思 will什么意思

maxtemp什么意思 will什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Min Temp 和 Max Temp 是什么意思 最小的Temp和最大Temp Temp: Chang用的办公软件和其他应用程序通常会临时保Cun用户的工作结果,…

html 玫瑰花

简易html 代码玫瑰花 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>玫瑰</title><style type"text/css"> #shusheng { position: absolute; width: 100%; height: 100%; text-align: center; } &…

计算并输出所有的玫瑰花数

如果一个n位正整数等于它的n个数字的n次方和&#xff0c;则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。 #include <stdio.h> #include <math.h>int main() {for (int i 1000; i < 10000; i){if (i pow(i%10, 4) pow((i/…

C语言代码:玫瑰花

前文 在古希腊神话中&#xff0c;玫瑰花集爱与美于一身&#xff0c;既是美神的化身&#xff0c;又溶进了爱神的血液&#xff0c;所以它所代表的含义是爱情。 我们应该用玫瑰花来表达我们的爱意&#xff0c;但是好多的恋人都是因为异地而没有办法去买一束新鲜的玫瑰去送给自己的…

七夕玫瑰花合集

图片来源&#xff1a;百度动图 一年一度的七夕又快到了&#xff0c;用Python画一朵玫瑰花送给你的那个TA吧图片。更多表白代码可以到”阿黎逸阳的代码“公众号中翻看表白合集中的文章。 一、绘制结果 1. 玫瑰花1 2. 玫瑰花2 二、画玫瑰花代码 1. 用turtle库画一朵玫瑰花版本1 #…