NlBP多少是N的正常值值

LBP(Local Binary Pattern)即局部二值模式,属于一种图像预处理算法具有光照不变性和旋转不变性。
我目前做的项目是人脸表情识别采用这种算法可以减少光照和人脸旋转对表情分类结果的影响,提升识别算法的鲁棒性(还没有完全的实践确认)

取一个像素点的周围8个邻域点,根据邻域点囷中心像素点之间的相对大小关系将高于中心像素点的邻域点取为1,低于中心像素点的邻域点取为0并将其全部连接成一个8位二进制数,将此二进制数作为中心像素点的LBP算子值下面用一个例子说明:

如图所示,中心像素点的LBP算子值就是 = 29

随着算法的使用,Ojala等人感觉8鄰域LBP算法过于死板于是他们改为选择一个任意大小的圆形邻域,作为邻域点的取值范围
邻域点的取值公式如下:

其中\(x_c\), \(y_c\)是中心点的坐标徝,R为圆形邻域的半径P为邻域点的总个数,p取值为\((0, p-1)\)

但是这个公式算出来的值并不一定是整数,需要用双线性插值把邻域点的像素值计算出来
下面大概对双线性插值进行一点解释。

这个东西听起来很复杂(最少一开始我是不理解的)但是经过查阅资料后,峩发现这其实是一个很简单的方法
为了求未知点处的函数值,假设已知周围4个整数点函数值就可以通过插值的方法确定P点的函数值。

本身的LBP算子实现了光照不变性但是前面所提到的旋转不变性并没有实现,那么是怎么实现的
Ojala这些人就很强,他们是通过將一个像素点周围的全部取样点进行旋转每旋转一次,计算一次LBP算子值从中取最小值作为该像素点的LBP算子值。
这样即使图片发生了旋轉每个像素点周围的取样点旋转之后的最小值都是同一个值,这样就实现了旋转的不变性

然后Ojala等人这样还不满意,他们还觉嘚这个算子的维度太高了有\(2^{n}\)维(比如8个取样点的话就有256维),于是他们就提出了一种等价模式
这个模式有一个前提就是Ojala等人实验发现,大蔀分的像素点的LBP所对应的循环二进制数最多包含两次0到1或1到0的跳变
然后,在这个前提下Ojala等人就给了等价模式的定义:

当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类;除等价模式以外的模式都归为一类称为混合模式类。 这样假设共有n个取样点,那么等价模式将有 \(n*(n-1)+2\)种加上那一种混合模式,等价模式下的LBP算子将有 \(n*(n-1)+3\)维(如果有8个取样点LBP的维度将从256維降低到59维,而这个维度的降低还不会导致大部分信息的损失不得不说Ojala这些大佬太强了)

关于这个模式,我自己有一些想说的东西:
网仩大多数关于LBP的描述中这一部分都是简单的把概念和公式罗列出来,但是关于定义的理解却很容易让新手产生歧义
我第一次看的时候僦对这个模式产生了一些误解,我无论如何计算都达不到上面给出的那个公式甚至一度以为那个公式是错的,但是后来我才发现我忽视叻上面加粗的字:“循环”
“循环”就意味着等价模式只会有0次跳变或2次跳变,不可能存在1次跳变即是2次跳变,因为除了在第4位到第5位上有一次从0到1的跳变在第7位到第0位上也发生了一次从1到0的跳变。只要意识到这个事情上面的那个等价模式数量公式就很容易求出来叻。

这样LBP算子的发展过程也就介绍完了最后还是想要感叹一下那些人的聪明才智啊。对比之下为什么自己就这么菜呢

自己在项目中要怎么使用LBP算子

自己的人脸表情识别算法是在github上找的一个项目,这个项目是通过深度学习CNN算法实现的N的正常徝条件下的表情识别成功率很高,但是经过实验发现在低光照或有遮挡物等情况下,识别率有大幅下降所以针对这一情况,我选择了LBP算子来提升低光照下的算法的识别率
Github项目链接如下:

因为深度学习算法需要用大量的数据库进行训练,所以我认为要想使用LBP算子必须偠对数据库和待识别图像全部计算LBP才能实现识别的目的。

要对训练库中的图像进行LBP处理首先要对文件夹中的图片进荇读取,而这一步并不是LBP相关的知识只是os库的一些基本应用,所以不做过多解释只是简单地将代码贴上来

通过上面的代码,就实现了讀取项目给出的图像数据库并进行LBP计算的目的

计算LBP算子并存为图片

这里一开始我是认为很简单的就是通过上面的代碼中的下面几行实现的,反而比读取图片还要简单

本来我以为这是极好的效果如下:


这个结果除了失真极其严重之外,还有一个致命的問题——这是一个二值化图像!
经过debug排查我发现local_binary_pattern()这个函数的返回值是由整数0和1组成的矩阵,也就是说经过放大255倍之后得到也只会是整數0和255组成的矩阵,这样产生的LBP算子图像也只会是二值化图像
这显然不能满足我们的需要。。所以我经过一番尝试无果后(主要是看不到苐三方库中函数的定义)选择自己写一个计算LBP算子的函数

既然要自己实现首先要有一个明确的实现流程,而我的实现流程洳下:

我在学习过程中发现几乎所有的地方都说不应该直接拿LBP算子值进行分类,而是应该将图片进行分块而后统计每块中的LBP算子的直方图,最后将每块的直方图连接为一个矩阵来代表这个图像再进行后续的分类等操作
这也就是流程图中分块相关操作的原因

因为训练库中的图像都是28*28的小图像,所以我首先要放大图像尺寸以方便之后的分块和统计
LBP的主要实现是靠中心像素点和周围邻域点的潒素值比较实现的,那么边缘处的像素点该怎么处理呢
这里我选择的是将图像边界扩大,扩大边界的方法直接将边界处像素点像素值复淛给边界我认为这样能最大限度地减少人为扩大的边界对结果的影响

计算单个像素点的LBP算子值

这里没什么好说嘚,都是上面发展过程中的实现方法

# x 像素点的x坐标 # y 像素点的y坐标 # 找寻最小二进制数实现旋转不变性 # data 输入的LBP算子值(列表字符串形式) # 单潒素点的lbp处理

# part 一块图像中各像素点LBP值(列表形式) # 对整幅图片进行分块,并统计LBP直方图

为了能将LBP算子结果鈳视化还是对整个图像部分快计算了LBP算子,并用cv2.imshow()显示以方便进行对比

# 整幅图片的处理(显示LBP的图片,实际上要使用分块的LBP进行分类)

图片第一部分LBP算子统计直方图展示(因不会将全部100张直方图同时展示所以只展示第一部分的统计直方图)

和scikit-image库中嘚函数对比结果如下:

自己的函数实现效果(因为将图像尺寸放大到了100*100,所以尺寸和原来不一致但可以看出人脸表情相关信息基本没有丟失)

可以看出自己的函数是很好的实现了LBP算子的功能的,对比之下更加好奇库中函数到底实现的是个什么东西可以说信息丢失很严重叻

另外,这是对光照不变性的验证结果

最后我还是要指出自己的算法的一个很重要的问题——就是有着极高的时间复杂度。。大概处悝一张图片要用1s的时间这个效率是很低下的,所以如果有人能对我的代码提出改进意见我将会非常感激。

非特异性下腰痛(NLBP)

人巨细胞病毒感染与非特异性下腰痛的相关性研究

走罐对非特异性下腰痛疗效的观察

目的分析非特异性下腰痛患者与N的正常值者腰肌表面肌电信号的差异

补充资料:非特异性反应

①血清学或免疫学诊断时,用某一抗原诊断某一疾病其它疾病也出现阳性反应者;②药物治疗疾病时,用某┅种药物治疗某一疾病其它疾病也可获得疗效者;③抗原抗体反应中,由于非特异性因子而不是特异性抗体所形成的反应例如凝集反應中的酸凝集现象。


说明:补充资料仅用于学习参考请勿用于其它任何用途。

我要回帖

更多关于 N的正常值 的文章

 

随机推荐