Uniform LBP算子Python实现代码

Uniform LBP(均匀LBP)

为解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)。通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,即:它把值分为59类,58个uniform pattern为一类,依次从大到小排序;其它的所有值为第59类。这样直方图从原来的256维变成59维。这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。
Python代码:

import numpy as np
import cv2
import os
np.set_printoptions(threshold = 1e6)
def arry_58():
    l = np.zeros(58, dtype=int)
    m = []
    a = -1
    for i in range(256):
        bit = '{:08b}'.format(i)  # 二进制化
        arry = []  # 二进制生成数组
        count = 0  # 计数变化次数
        # 把字符串变为数组方便统计变化次数
        for x in range(len(bit)):
            arry.append(int(bit[x]))
        # print(arry)
        first = arry[0]  # 数组第一个为first,与之后的比较
        for j in range(1, len(arry)):
            if arry[j] != first:  # 如果变化,计数单位加1
                count += 1
                first = arry[j]  # 并且把变化的值重新赋值
        # print(count)
        if count <= 2:  # 如果变化次数小于2,则依次排序
            a += 1
            # print(i)
            l[a] = i
    l = l.tolist()
    return l
def uniform_LBP(img):
    h, w = img.shape  # 图像的长和宽
    dst = np.zeros((h - 2, w - 2), dtype=img.dtype)  # 新建一张图
    # dst = np.zeros(img.shape, dtype=img.dtype)  # 新建一张图
    arry58 = arry_58()
    for i in range(1, h - 1):
        for j in range(1, w - 1):
            center = img[i][j]
            code = []
            count = 0

            code7 = img[i - 1][j - 1]
            if code7 >= center:
                code7 = 1
            else:
                code7 = 0
            code.append(code7)

            code6 = img[i - 1][j]
            if code6 >= center:
                code6 = 1
            else:
                code6 = 0
            code.append(code6)

            code5 = img[i - 1][j + 1]
            if code5 >= center:
                code5 = 1
            else:
                code5 = 0
            code.append(code5)

            code4 = img[i][j + 1]
            if code4 >= center:
                code4 = 1
            else:
                code4 = 0
            code.append(code4)

            code3 = img[i + 1][j + 1]
            if code3 >= center:
                code3 = 1
            else:
                code3 = 0
            code.append(code3)

            code2 = img[i + 1][j]
            if code2 >= center:
                code2 = 1
            else:
                code2 = 0
            code.append(code2)

            code1 = img[i + 1][j - 1]
            if code1 >= center:
                code1 = 1
            else:
                code1 = 0
            code.append(code1)

            code0 = img[i][j - 1]
            if code0 >= center:
                code0 = 1
            else:
                code0 = 0
            code.append(code0)
            LBP = code7*128 + code6*64 + code5*32 + code4*16 + code3*8 + code2*4 + code1*2 + code0*1
            #print("LBP值为:",LBP)
            #print("8位编码为:",code)
            first = code[0]  # 数组第一个为first,与之后的比较
            for x in range(1, len(code)):
                if code[x] != first:  # 如果变化,计数单位加1
                    count += 1
                    first = code[x]  # 并且把变化的值重新赋值
            #print("跳变次数",count)
            if count > 2:  # 如果变化次数大于3,则归为59位
               dst[i - 1][j - 1] = 58
            else:  # 否则,按原来的数计算
                loca = arry58.index(LBP)  # 获取位置
                dst[i - 1][j - 1] = loca
    return dst

if __name__ == '__main__':
    gray = cv2.imread('./b.jpg', cv2.IMREAD_GRAYSCALE)
    print(gray.shape)
    a = uniform_LBP(gray)
    cv2.imshow('uniform_lbp', a)
    cv2.imwrite("./2.jpg", a)
    cv2.waitKey(0)

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Uniform LBP是一种局部二值模式(LBP)的变体,它在LBP的基础上增加了一个限制条件,即只有最多两个跳变。在Matlab中,可以使用Image Processing Toolbox中的函数来实现Uniform LBP的计算和图像处理。 ### 回答2: Uniform LBP是一种针对局部二值模式(Local Binary Pattern,LBP)的改进方法,主要用于纹理分类和人脸识别等领域。它的优点在于能够减小LBP的维度,提高特征的鲁棒性和判别能力。Matlab是一个常用的数学计算和数据可视化工具,非常适合进行图像处理和分析,因此Uniform LBP在Matlab中的实现也非常广泛。 Uniform LBP的基本思想是将LBP码中不符合“Uniform”条件的转化为“0”,而保留符合条件的为“1”,最终得到一个只由0和1组成的二进制序列,从而减小特征向量中的维度。Uniform LBP的定义和计算方式与LBP相似,但是只有当相邻像素间的灰度值进行二进制编码后不超过两次改变的二进制码才会被视为Uniform模式。相应地,Uniform LBP还具有旋转不变性和灰度缩放不变性等特点,在纹理分类和人脸识别等领域都具有很好的应用价值。 在Matlab中实现Uniform LBP,需要先通过像素差值来计算LBP码,然后根据Uniform模式的定义来将其转化为0和1组成的二进制序列。具体的实现步骤包括:首先读取图像文件并将其转化为灰度图像,然后计算像素差值得到LBP码,最后根据Uniform模式的定义将LBP码转化为Uniform LBP码,最终得到一个只由0和1组成的二进制序列。 除了实现Uniform LBP算法,Matlab还提供了许多与图像处理有关的工具箱和函数,如Image Processing Toolbox、Computer Vision Toolbox等,这些工具箱和函数可以帮助用户更方便地实现图像处理和分析任务,提高算法的效率和准确度。因此,Uniform LBP在Matlab中的应用具有广泛的前景和应用价值。 ### 回答3: Uniform LBP是一种局部二值模式,是一种用于纹理分类和人脸识别的有效方法。Uniform LBP的基本思想是在原始LBP操作中,将像素值与它周围像素的阈值进行比较,从而将其分类为0或1,最终形成一个二进制数字,以形成一个具有空间不变性和旋转不变性的特征向量。 Uniform LBP在图像的分类和识别中广泛使用,是一种非常快捷的方法,可以识别出图像中的纹理特征,并且随着LBP中点值分布的差异而变化。实际上,Uniform LBP是一种不变性很高的算法,通过提取图像特征,可以快速准确地进行图像分类和识别。 在Matlab中,我们可以使用Image Processing Toolbox来实现Uniform LBP。首先需要读取图像,然后将图像进行灰度化处理,接着设定LBP半径和邻域个数参数。然后我们可以计算每个像素点的Uniform LBP值,最终形成一个特征向量,用于图像分类和识别。 总的来说,Uniform LBP是一种用于图像分类和识别的有效方法,由于其简单、高效、不变性高等优点,被广泛地应用于各种图像识别和分类领域。在Matlab中,我们可以轻松地实现Uniform LBP,以便更好地应用于实际应用中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值