图像的典型特征描述子——LBP

2023-10-11 05:59
文章标签 图像 典型 特征描述 lbp

本文主要是介绍图像的典型特征描述子——LBP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下文章摘录自:

《机器学习观止——核心原理与实践》

京东: https://item.jd.com/13166960.html

当当:http://product.dangdang.com/29218274.html

(由于博客系统问题,部分公式、图片和格式有可能存在显示问题,请参阅原书了解详情)

 

1.1    图像的典型特征描述子

1.1.1  LBP

LBP是Local Binary Patterns的缩写,即局部二值模式。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood等人在1994年提出来的,属于一种特殊的纹理模型。

LBP描述子不仅计算过程相对简单,而且产生的最终效果也不错,因而在学术界和工业界的很多领域都得到了较为广泛的应用。例如目前非常火热的人脸识别研究方向中就有不少采用了这种描述子来完成的。另外,OpenCV和Scikit-image等多种图像处理库也专门提供了LBP的实现接口,其重要性可见一斑。

LBP算子除了原始版本,还有多个演进版本。

1.1.1.1          原始LBP算法

前者的主要计算步骤如下所示:

Step1. 将图像的被检测区域分割成一个个cells,例如16*16大小

Step2. 比较一个像素值与其周边8个neighbor的大小。换句话说,就是在一个3*3的区域中,最中间的像素值相比于其它像素的大小。如下图所示:

图 ‑ LBP中的阈值比较

 

Step3. 在上述比较过程中,如果某个neighbor的值比中间值小,那么它会被记为0;相反的就会被标注为1。这样一来3*3大小的框一共可以产生8个二进值(0或者1)的数值

Step4. 沿着正方向或者反方向来组装这8个二进制数,那么将得到一个新的数值。比如在上图所示的例子中,我们首先针对原始数据进行threshold处理,得到中间图;然后再采用顺时针方向来组成新数值,得到:

00010011 (二进制码)

=19 (十进制码)

最后我们把19赋予给中间的像素点,这样就完成了

 

如果用数学来表达的话,LBP的计算公式可以参考:

其中(xc, yc) 指的是3*3框中的中心点, ic和ip分别是中心点和它的各个neighbor的像素灰度值,而s则是如下所示的一个函数:

Step5. 重复以上步骤,直到处理完所有像素点,得到完整的LBP结果。

 

原始版本LBP的代码实现范例如下所示:

template <typename _Tp>

void lbp::OLBP_(const Mat& src, Mat& dst) {

    dst = Mat::zeros(src.rows-2, src.cols-2, CV_8UC1);

    for(int i=1;i<src.rows-1;i++) {

        for(int j=1;j<src.cols-1;j++) {

            _Tp center = src.at<_Tp>(i,j);

            unsigned char code = 0;

            code |= (src.at<_Tp>(i-1,j-1) > center) << 7;

            code |= (src.at<_Tp>(i-1,j) > center) << 6;

            code |= (src.at<_Tp>(i-1,j+1) > center) << 5;

            code |= (src.at<_Tp>(i,j+1) > center) << 4;

            code |= (src.at<_Tp>(i+1,j+1) > center) << 3;

            code |= (src.at<_Tp>(i+1,j) > center) << 2;

            code |= (src.at<_Tp>(i+1,j-1) > center) << 1;

            code |= (src.at<_Tp>(i,j-1) > center) << 0;

            dst.at<unsigned char>(i-1,j-1) = code;

        }

    }

}

可以看到原始LBP的计算过程并不复杂。

1.1.1.2          圆形LBP算法

从前一小节可以看到,原始版本的LBP算法计算过程相当简单,而且可以较好的捕捉到图像的局部细节。不过它的一个主要缺点是覆盖范围不但是固定的,而且范围较小——这样一来在某些场景下并不能很好地满足不同尺寸和频率纹理的诉求。

为了克服上述的缺点,并达到灰度不变性等要求,LBP的作者又提出了一种名为圆形LBP算子(即Circular LBP或Extended LBP)的方法。后者不仅用圆形的邻域代替了3*3的正方形邻域,而且将范围也扩大到了半径为R的圆形中的P个像素点(其中R和P的具体取值都是可以设置的)。

根据R和P的取值不同,自然可以得到形态各异的LBP计算方式,如下示意图所示的分别是当R=1, 2, 3时的LBP情况:

图 ‑ R和P取不同值时的圆形LBP算法

 

另外,利用可变半径的圆对近邻像素点进行编码,还可以得到不同的近邻表示方法。如下参考图所示:

图 ‑ 不同形态的近邻

 

假设中心点为(xc, yc),那么在圆形LBP算法中neighbor点(xp, yp)的计算公式可以参考下面的表达式:

不难理解,通过上述计算公式得出的结果值有可能不在像素值的正常范围,此时可以考虑利用插值方式来解决。例如OpenCV采用的是bilinear interpolation,计算公式如下:

 

圆形LBP的参考实现代码如下所示:

void lbp::ELBP_(const Mat& src, Mat& dst, int radius, int neighbors) {

    neighbors = max(min(neighbors,31),1); // set bounds...

    dst = Mat::zeros(src.rows-2*radius, src.cols-2*radius, CV_32SC1);

    for(int n=0; n<neighbors; n++) {

        float x = static_cast<float>(radius) * cos(2.0*M_PI*n/static_cast<float>(neighbors));

        float y = static_cast<float>(radius) * -sin(2.0*M_PI*n/static_cast<float>(neighbors));

        // relative indices

        int fx = static_cast<int>(floor(x));

        int fy = static_cast<int>(floor(y));

  

这篇关于图像的典型特征描述子——LBP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/186025

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

poj2505(典型博弈)

题意:n = 1,输入一个k,每一次n可以乘以[2,9]中的任何一个数字,两个玩家轮流操作,谁先使得n >= k就胜出 这道题目感觉还不错,自己做了好久都没做出来,然后看了解题才理解的。 解题思路:能进入必败态的状态时必胜态,只能到达胜态的状态为必败态,当n >= K是必败态,[ceil(k/9.0),k-1]是必胜态, [ceil(ceil(k/9.0)/2.0),ceil(k/9.

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

深度剖析AI情感陪伴类产品及典型应用 Character.ai

前段时间AI圈内C.AI的受够风波可谓是让大家都丈二摸不着头脑,连C.AI这种行业top应用都要找谋生方法了!投资人摸不着头脑,用户们更摸不着头脑。在这之前断断续续玩了一下这款产品,这次也是乘着这个风波,除了了解一下为什么这么厉害的创始人 Noam Shazeer 也要另寻他路,以及产品本身的发展阶段和情况! 什么是Character.ai? Character.ai官网:https://

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。

Winfrom中解决图像、文字模糊的方法

1.添加清单 2.将清单中的下面内容取消注释

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。