【OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图

『youcans 的 OpenCV 例程200篇 - 总目录』


【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图


局部二值模式(LBP,Local binary patterns)是一种用来描述图像局部纹理特征的算子,它具有旋转不变性和灰度不变性的优点 。 LBP 特征计算简单、效果较好,在计算机视觉领域得到了广泛的应用。


4.2.3 LBP 特征的统计直方图

描述纹理的常用方法是使用图像或目标区域的统计直方图。

基本 LBP 算子

基本的 LBP 算子定义在 3×3 的窗口内,以窗口中心像素为阈值,与相邻的 8 个像素的灰度值比较,大于阈值则标记为 1,否则标记为 0。从右上角开始顺时针旋转,排列 8 个 0/1标记值,得到一个 8 位二进制数,就是窗口中心像素点的 LBP 值。
LBPP,R(xc,yc)=∑p=0P−1S(gp−gc)∗2pS(gp−gc)={1,gp≥gc0,gp<gcLBP_{P,R} (x_c,y_c) = \sum_{p=0}^{P-1} S(g_p-g_c)*2^p\\ S(g_p-g_c) = \begin{cases} 1, \quad g_p \ge g_c\\ 0, \quad g_p \lt g_c \end{cases} LBPP,R(xc,yc)=p=0P1S(gpgc)2pS(gpgc)={1,gpgc0,gp<gc

LBP 直方图

图像可以用 LBP 特征向量来表示,但在应用中一般并不是直接使用 LBP 图谱进行分类识别,而是使用 LBP 特征谱的统计直方图进行分类识别。因为 LBP 特征是与图像中的位置紧密相关的,直接对两幅图片提取 LBP 特征进行判别分析,会由于位置没有对准而带来很大的误差。

为了解决这个问题,可以将图像划分为若干子区域,对每个子区域内提取 LBP 特征后在子区域内建立 LBP 特征的统计直方图。图片的每个子区域可以用一个统计直方图来描述,整个图片就由若干个统计直方图组成,称为 LBP 特征的统计直方图(LBPH,Local Binary Patterns Histograms)。

LBPH 将 LBP 特征与图像的空间信息结合起来。将 LBP 特征图像分成 m 个子块,提取每个子块的 LBP 特征并建立统计直方图,将这些直方图依次连接在一起,就形成 LBP 特征的统计直方图。

计算 LBP 统计直方图的步骤为:

(1)计算 LBP 特征图像;

(2)将 LBP 特征图像划分为若干块子区域(cell),默认划分 8*8=64 块子区域;

(3)计算每个子区域 LBP 特征图像的直方图(cell_LBPH),并进行归一化处理;

(4)将每个子区域的 LBP 直方图依次排列成一行,形成 LBP 特征向量;

(5)用机器学习方法对 LBP 特征向量进行训练,检测和识别目标。

例程只给出 LBP 统计直方图的构造,基于 LBP 直方图的特征检测和目标识别,将在模式识别中介绍。


例程 14.10:特征描述之 LBP 直方图

    # 14.10 特征描述之 LBP 直方图def basicLBP(gray):height, width = gray.shapedst = np.zeros((height, width), np.uint8)kernelFlatten = np.array([1, 2, 4, 128, 0, 8, 64, 32, 16])  # 从左上角开始顺时针旋转for h in range(1, height-1):for w in range(1, width-1):LBPFlatten = (gray[h-1:h+2, w-1:w+2] >= gray[h, w]).flatten()  # 展平为一维向量, (9,)dst[h, w] = np.vdot(LBPFlatten, kernelFlatten)  # 一维向量的内积return dstdef calLBPHistogram(imgLBP, nCellX, nCellY):  # 计算 LBP 直方图height, width = gray.shape# nCellX, nCellY = 4, 4  # 将图像划分为 nCellX*nCellY 个子区域hCell, wCell = height//nCellY, width//nCellX  # 子区域的高度与宽度 (150,120)LBPHistogram = np.zeros((nCellX*nCellY, 256), np.int)for j in range(nCellY):for i in range(nCellX):cell = imgLBP[j * hCell:(j + 1) * hCell, i * wCell:(i + 1) * wCell].copy()  # 子区域 cell LBPprint("{}, Cell({}{}): [{}:{}, {}:{}]".format(j*nCellX+i+1, j+1, i+1, j*hCell, (j+1)*hCell, i*wCell, (i+1)*wCell))histCell = cv2.calcHist([cell], [0], None, [256], [0, 256])  # 子区域 LBP 直方图LBPHistogram[(i+1)*(j+1)-1, :] = histCell.flatten()print(LBPHistogram.shape)return LBPHistogram# 特征描述之 LBP 直方图img = cv2.imread("../images/fabric2.png", flags=1)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像height, width = gray.shapenCellX, nCellY = 4, 4  # 将图像划分为 nCellX*nCellY 个子区域hCell, wCell = height//nCellY, width//nCellX  # 子区域的高度与宽度 (150,120)print("img: h={},w={}, cell: h={},w={}".format(height, width, hCell, wCell))basicLBP = basicLBP(gray)  # 计算 basicLBP 特征算子# LBPHistogram = calLBPHistogram(basicLBP, nCellX, nCellY)  # 计算 LBP 直方图 (16, 256)fig1 = plt.figure(figsize=(9, 8))fig1.suptitle("basic LBP")fig2 = plt.figure(figsize=(9, 8))fig2.suptitle("LBP histogram")for j in range(nCellY):for i in range(nCellX):cell = basicLBP[j*hCell:(j+1)*hCell, i*wCell:(i+1)*wCell].copy()  # 子区域 cell LBPhistCV = cv2.calcHist([cell], [0], None, [256], [0, 256])  # 子区域 cell LBP 直方图ax1 = fig1.add_subplot(nCellY, nCellX, j * nCellX + i + 1)ax1.set_xticks([]), ax1.set_yticks([])ax1.imshow(cell, 'gray')  # 绘制子区域 LBP  ax2 = fig2.add_subplot(nCellY,nCellX,j*nCellX+i+1)ax2.set_xticks([]), ax2.set_yticks([])ax2.bar(range(256), histCV[:, 0])  # 绘制子区域 LBP 直方图print("{}, Cell({}{}): [{}:{}, {}:{}]".format(j * nCellX + i + 1, j + 1, i + 1, j * hCell, (j + 1) * hCell, i * wCell, (i + 1) * wCell))plt.show()

在这里插入图片描述

在这里插入图片描述


【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125681261)
Copyright 2022 youcans, XUPT
Crated:2022-7-7

227. 特征描述之 LBP 纹理特征算子
228. 特征描述之 extendLBP 改进算子
229. 特征描述之 LBP 算子比较(skimage)
230. 特征描述之 LBP 统计直方图

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

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

相关文章

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性&#xff0c;因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源&#xff0c;在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码&#xff0c;测试连接&#xff0c;若通过说明成功&#xff1b;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念&#xff0c;是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用&#xff0c;如模式识别、目标分类、图像编…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵&#xff08;GLCM&#xff09; 4.2.4 灰度共生矩阵&#xff08;GLCM&#xff09; 灰度共生矩阵&#xff08;Gray level co-occurrence matrix&#xff0c;GLCM&#xff…

oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问

ODM FINDING:FROM http://www.os2ora.com/how-to-analyze-awr-report-1/ 推荐 kaya 的这篇文章引用如下&#xff1a;如果关注数据库的性能&#xff0c;那么当拿到一份AWR报告的时候&#xff0c;最想知道的第一件事情可能就是系统资源的利用情况了&#xff0c;而首当其冲的&am…

【OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】237. 基于主成分提取的方向校正&#xff08;OpenCV&#xff09; 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种基于统计的数据降维方法&#xff0c;又称主…

swoole 捕捉php错误,swoole怎么处理错误

在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获&#xff0c;不得跨协程捕获异常。不仅是应用层throw的Exception&#xff0c;底层的一些错误也是可以被捕获的&#xff0c;如function、class、method不存在下面的代码中&#xff0c;try/catch和throw在不同的协程…

【OpenCV 例程200篇】235. 特征提取之主成分分析(sklearn)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】235. 特征提取之主成分分析&#xff08;sklearn&#xff09; 特征提取是指从原始特征中通过数学变换得到一组新的特征&#xff0c;以降低特征维数&#xff0c;消除相关性&#xff0c;减少无用信息…

Linux 进程资源分配,linux 进程管理和内存分配

1、进程相关概念进程&#xff1a;正在运行中的程序内核功用&#xff1a;进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等Process&#xff1a;运行中的程序的一个副本&#xff0c;是被载入内存的一个指令集合进程 ID(Process ID&#xff0c;PID)号码被用来标记各…

【OpenCV 例程300篇】234. 特征提取之主成分分析(PCA)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】234. 特征提取之主成分分析&#xff08;PCA&#xff09; 5.1 特征提取的方法 初步获取的图像特征维数通常很大&#xff0c;而且往往包含一定的无关或冗余特征。特征提取是指从原始特征中通过数学变…

Java并发编程基础

线程的简介 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务。 为什么要使用多线…

【OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析&#xff08;OpenCV&#xff09; 文章目录【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析&#xff08;OpenCV&#xff09;5.2 主成分分析的数学方法5.4 OpenC…

linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...

环境&#xff1a;Vmware Workstation&#xff1b;CentOS-6.4-x86_64说明&#xff1a;1、将共享内存挂载至进程&#xff1a;void *shmat(int shmid, const void *shmaddr,int shmflg);参数shmid是要附加的共享内存区标示符。总是把参数shmaddr设为0。参数shmflg可以为SHM_RDON…

Java中锁的使用和实现

首先&#xff0c;我们要了解一个概念&#xff0c;JAVA中的锁到底是什么呢&#xff1f; 锁是用来控制多个线程访问共享资源的方式&#xff0c;一般来说&#xff0c;一个锁能够防止多个线程同时访问共享资源。 Lock接口 在Java SE 5之后&#xff0c;并发包中新增了Lock接口&am…

【OpenCV 例程200篇】225. 特征提取之傅里叶描述子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】225. 特征提取之傅里叶描述子 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目…

【OpenCV 例程300篇】238. OpenCV 中的 Harris 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】238. OpenCV 中的 Harris 角点检测 角是直线方向的快速变化。角点通常被定义为两条边的交点&#xff0c;或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测&…

基础线性规划实现(matlab,lingo)

目录 一、本次所需解的问题 二、matlab解题 1&#xff09;语法 2&#xff09;数学思维 3&#xff09;matlab解题 运行结果&#xff1a; 三、lingo解题 lingo解题如下&#xff1a; 运行结果&#xff1a; 最后&#xff1a; 一、本次所需解的问题 需解出下面该线性规划问…

cwntos linux kde桌面,Centos如何安装KDE的桌面

其实KDE其实在初次安装系统的时候就可以选择&#xff0c;我下面是进入系统后的安装方法&#xff1a;第一步&#xff1a;检查KDE首先查看自己是否安装了KDE# yum grouplist在grouplist的输出结果中的“Installed Groups:”部分中&#xff0c;如果你能找到“X Window System”和“…

【OpenCV 例程 300篇】239. Harris 角点检测之精确定位(cornerSubPix)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】239. Harris 角点检测之精确定位&#xff08;cornerSubPix&#xff09; 角是直线方向的快速变化。角点通常被定义为两条边的交点&#xff0c;或者说角点的邻域应该具有两个不同区域的不同方向的边界…

基础线性规划实现---python

目录 一、问题 何为线性规划问题&#xff1a; 二、python进行求解 1.通过观察matlab解线性规划步骤进行求解 2.python求解步骤 1&#xff09;求解用到的模块&#xff08;scipy 和 numpy&#xff09;&#xff1a; 2&#xff09;对 max z2x13x2-5x3 该问题确定c如下&…