【OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子

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

【youcans 的 OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子


特征通常是针对于图像中的某个目标而言的。针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。

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


4.2.2 改进的 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 特征编码也会发生变化,因此在大尺寸图像时就不能准确提取到所需的纹理特征,不能反映所描述的纹理信息。

圆形可变半径模式

为了满足尺度、灰度和旋转不变性的要求,Ojala 等对 LBP 算子进行了改进,将 3×3 邻域扩展到任意邻域,并用圆形邻域代替了方形邻域。改进算子允许在半径为 R 的圆形邻域内有 P 个采样点,称为扩展 LBP 算子(Extended LBP,Circular LBP)。

每个采样点的值可以通过下式计算:
xp=xc+R∗cos(2πp/P)yp=yc−R∗sin(2πp/P)x_p = x_c + R*cos(2 \pi p /P) \\ y_p = y_c - R*sin(2 \pi p /P) \\ xp=xc+Rcos(2πp/P)yp=ycRsin(2πp/P)
其中 (xc,yc)(x_c,y_c)(xc,yc) 为邻域中心, (xp,yp)(x_p,y_p)(xp,yp) 为采样点 p。如果采样点 p 的坐标不是整数位置,则用双线性插值方法估计其灰度值:
f(x,y)=[1−x,x][f(0,0),f(0,1)f(1,0),f(1,1)][1−yy]f(x,y) = [1-x, x] \begin{bmatrix} f(0,0), f(0,1)\\ f(1,0), f(1,1) \end{bmatrix} \begin{bmatrix} 1-y\\ y \end{bmatrix} f(x,y)=[1x,x][f(0,0),f(0,1)f(1,0),f(1,1)][1yy]

旋转不变模式

LBP 算子是灰度不变的,但不是旋转不变的。图像旋转后的 LBP 值是不同的,从而影响识别精度。。

Maenpaa等提出具有旋转不变性的 LBP 算子,不断旋转圆形邻域得到一系列 LBP 值,将最小的 LBP 值作为该邻域的 LBP 值,从而具有旋转不变性。

等价模式(Uniform Pattern)

一个 LBP 特征大量不同的二进制组合,且随邻域集内采样点数的增加而以指数形式增长,如半径为 R 的圆形区域内含有 P 个采样点的 LBP 算子具有 2P2^P2P 种不同模式。模式种类数量太多不利于纹理的提取、分类、识别及存取,因此需要研究用少量模式数量来表示图像的纹理特征。

Ojala提出了“等价模式(Uniform Pattern)”,把某个最多有两次 0/1 跳变的二进制组合所对应的 LBP 定义为一个等价模式类,其它所有的模式都定义为混合模式类。这种方法将模式数量由 2P2^P2P 种减少为 P(P−1)+2P(P-1)+2P(P1)+2 种,显著减少了特征向量的维数,可以减少高频噪声的影响。

此外,还有各种改进的 LBP 方法,例如:

  • TLBP,中心像素与周围所有像素比较,而不是选择 P 个采样点
  • DLBP,考察四个方向的灰度变化,每个方向用 2bits 编码
  • MLBP,用采样点像素的平均值代替中心像素进行比较处理
  • MB-LBP,将图像级联分块,以小区域代替像素单位进行处理
  • VLBP, 对于动态图像序列,考虑前 p 帧图像和后 p 帧图像的 LBP 特征
  • RGB-LBP,对彩色图像的 RGB 颜色分量分别计算 LBP 后再进行连接

例程 14.8:特征描述之 extendLBP 改进算子

    # 14.8 特征描述之 extendLBP 改进算子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 dst# extend LBP,在半径为 R 的圆形邻域内有 N 个采样点def extendLBP(gray, r=3, n=8):height, width = gray.shapeww = np.empty((n, 4), np.float)  # (8,4)p = np.empty((n, 4), np.int)  # [x1, y1, x2, y2]for k in range(n):  # 双线性插值估计坐标偏移量和权值# 计算坐标偏移量 rx,ryrx = r * np.cos(2.0 * np.pi * k / n)ry = -(r * np.sin(2.0 * np.pi * k / n))# 对采样点分别进行上下取整x1, y1 = int(np.floor(rx)), int(np.floor(ry))x2, y2 = int(np.ceil(rx)), int(np.ceil(ry))# 将坐标偏移量映射到 0-1tx = rx - x1ty = ry - y1# 计算插值的权重ww[k, 0] = (1 - tx) * (1 - ty)ww[k, 1] = tx * (1 - ty)ww[k, 2] = (1 - tx) * tyww[k, 3] = tx * typ[k, 0], p[k, 1], p[k, 2], p[k, 3] = x1, y1, x2, y2dst = np.zeros((height-2*r, width-2*r), np.uint8)for h in range(r, height-r):for w in range(r, width-r):center = gray[h, w]  # 中心像素点的灰度值for k in range(n):# 双线性插值估计采样点 k 的灰度值# neighbor = gray[i+y1,j+x1]*w1 + gray[i+y2,j+x1]*w2 + gray[i+y1,j+x2]*w3 + gray[i+y2,j+x2]*w4x1, y1, x2, y2 = p[k,0], p[k,1], p[k,2], p[k,3]gInterp = np.array([gray[h+y1,w+x1], gray[h+y2,w+x1], gray[h+y1,w+x2], gray[h+y2,w+x2]])wFlatten = ww[k,:]grayNeighbor = np.vdot(gInterp, wFlatten)  # 一维向量的内积# 由 N 个采样点与中心像素点的灰度值比较,构造 LBP 特征编码dst[h-r, w-r] |= (grayNeighbor > center) << (np.uint8)(n-k-1)return dst# 特征描述之 extendLBP 改进算子img = cv2.imread("../images/fabric1.png", flags=1)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像# 1) skimage 特征检测from skimage.feature import local_binary_patterntimeBegin = cv2.getTickCount()lbpSKimage = local_binary_pattern(gray, 8, 1)timeEnd = cv2.getTickCount()time = (timeEnd-timeBegin)/cv2.getTickFrequency()print("1) skimage.feature 封装:", round(time, 4))timeBegin = cv2.getTickCount()imgLBP1 = basicLBP(gray)  # 从右上角开始顺时针旋转timeEnd = cv2.getTickCount()time = (timeEnd-timeBegin)/cv2.getTickFrequency()print("2) basicLBP:", round(time, 4))timeBegin = cv2.getTickCount()r1, n1 = 3, 8imgLBP2 = extendLBP(gray, r1, n1)timeEnd = cv2.getTickCount()time = (timeEnd-timeBegin)/cv2.getTickFrequency()print("3) extendLBP(r={},n={}):{}".format(r1, n1, round(time, 4)))timeBegin = cv2.getTickCount()r2, n2 = 5, 8imgLBP3 = extendLBP(gray, r2, n2)timeEnd = cv2.getTickCount()time = (timeEnd-timeBegin)/cv2.getTickFrequency()print("4) extendLBP(r={},n={}):{}".format(r1, n1, round(time, 4)))plt.figure(figsize=(9, 6))plt.subplot(231), plt.axis('off'), plt.title("origin")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.subplot(232), plt.axis('off'), plt.title("gray")plt.imshow(gray, 'gray')plt.subplot(233), plt.axis('off'), plt.title("LBP(skimage)")plt.imshow(lbpSKimage, 'gray')plt.subplot(234), plt.axis('off'), plt.title("basic LBP")plt.imshow(imgLBP1, 'gray')plt.subplot(235), plt.title("extend LBP (r={},n={})".format(r1,n1))plt.imshow(imgLBP2, 'gray'), plt.axis('off')plt.subplot(236), plt.title("extend LBP (r={},n={})".format(r2,n2))plt.imshow(imgLBP3, 'gray'), plt.axis('off')plt.tight_layout()plt.show()

运行结果:

  1. skimage.feature 封装: 0.075
  2. basicLBP: 1.9195
  3. extendLBP(r=3,n=8):28.5426
  4. extendLBP(r=5,n=8):28.2654

在这里插入图片描述


【本节完】

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

227. 特征描述之 LBP 纹理特征算子
228. 特征描述之 extendLBP 改进算子

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

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

相关文章

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较&#xff08;skimage&#xff09; 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中&#xff0c;我们都会用到多线程的知识&#xff0c;今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么&#xff1f; 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程&#xff1a;一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程&#xff0c;这个过程经编译和优化后存储在数据库服务器中&#xff0c;应用程序使用时只要调用即可。存储过程(Stored Procedur…

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

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具有旋转不变性和灰度不变性的优点…

【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;或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测&…