• 什么是LBP纹理特征?
    LBP(Local Binary Patterns,局部二值模式)是提取局部特征作为判别依据的,一种有效的纹理描述算子,度量和提取图像局部的纹理信息。它具有旋转不变性和灰度不变性等显著的优点,对光照具有不变性。由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出用于纹理特征提取。
    LBP特征基本描述:
    LBP的基本思想是定义于像素的8邻域中(3x3的窗口), 以中心像素的灰度值为阈值, 将周围8 个像素的值与其比较, 如果周围的像素值小于中心像素的灰度值, 该像素位置就被标记为0, 否则标记为1。这样3x3的邻域内的八个点经过比较,顺时针能够产生8位二进制数(通常转换为十进制,即LBP码,共256种),每个像素得到一个二进制组合, 即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息,如下图。

    LBP算法的核心思想,是以某个像素点为中心,与其邻域像素点共同计算。所以光照变化很难改变中心像素点的灰度值与周围8个像素的大小关系。因为光照是一种区域性质的变化,而不是单像素性质的变化。
    LBP特征改进描述:
    1)圆形LBP算子:
    基本的 LBP算子的最大缺陷在于它只覆盖了一个3∗33*33∗3固定范围内的小区域,这显然不能满足不同尺寸纹理的需要。为了适应不同尺寸的纹理特征,达到灰度和旋转不变性的要求。Ojala将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域。改进后的 LBP 算子允许在半径为 R的圆形邻域内有任意多个像素点。从而得到了半径为R的圆形区域内含有P个采样点的LBP算子,如下图。(2)2)LBP旋转不变模式算子:
    为保证图像旋转时LBP不变,提出了LBP旋转不变算法。即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。这样就出现了多个位置模式对应同一个LBP值的情况,但这其实保证了图像旋转以后还是同一个值。如下图,8种模式都对应的一个LBP(00001111),8种模式可以看做一个图旋转个不同的角度(黑色0,白色1)。

    3)LBP等价算子:
    由上可知LBP会产生很多不同的模式,比如半径5,20个采样点,就有可能产生2202^{20}220种二进制模式,这对图像整体纹理描述很不方便。即使在纹理分类或人脸识别时采用的是LBP模式的统计直方图来进行的,但数据量过大将不合适,且直方图表示过于稀疏。所以需要对LBP模式进行降维,使得利用更少的数据就可以表达很好的图像纹理信息。
    Ojala提出了(Uniform Pattern)进行降维,利用LBP算子中0,1改变的次数来进行归类,定义从0到1或从1到0最多有两次突变时,该LBP对应的称为一个等价模式,而等价模式以为的都归为混合模式。这样等价模式的总数为2+2(p-1)+(p-1)(p-2)/2种,其中p为采样点数。0次突变2种,1次突变2(p-1)种,两次突变(p-1)(p-2)/2种。
  • LBP算子怎么用python实现?
    采用skimageskimageskimage包中的local_binary_pattern
    skimage.feature.local_binary_pattern(image, P, R, method='default')
    灰度和旋转不变的LBP(局部二进制模式)。
    参数:
    image:(N, M) array
    灰度图像
    P:int
    圆对称邻居设定点的数目(角空间的量化)(采样点的数量)。
    R:float
    圆的半径(算子的空间分辨率)(圆形算子的半径)。
    method:{‘default’, ‘ror’, ‘uniform’, ‘var’}
    确定算子计算的模式。
    ‘default’: 原始的局部二值模式是灰度的,但不是旋转不变(基本算子)。
    ‘ror’: 扩展的模式(旋转不变模式算子)实现是灰度和旋转不变。
    ‘uniform’: 改进的旋转不变性均匀模式和对具有灰度和旋转不变性的角空间进行精细量化(降维算子)。
    ‘nri_uniform’: 非旋转不变的均匀模式变量,只有灰度不变(非旋转+降维)
    ‘var’: 旋转不变性方差是对局部图像纹理对比度的度量,它具有旋转不变性而不具有灰度不变性。
    返回:
    output:(N, M) array
    LBP 图像.
    LBP算子对于图片的实际物理意义理解:

    上图可以理解为:黑色(或白色)表示比中心像素更弱(或更强)的像素。当周围的像素都是黑色或白色,那么图像区域是平坦的(即无特征)。连续的黑色或白色像素组被认为是统一的图案,可以解释为角或边。如果像素在黑白像素之间来回切换,则该模式被认为是不均匀的。
  • 应用实例:
from skimage.feature import local_binary_pattern
from skimage import data
from skimage.color import label2rgb
import matplotlib.pyplot as plt
import numpy as np
radius = 3
n_points = 8 * radius
image = data.brick()
plt.imshow(image,cmap='gray')
METHOD = 'uniform'#采用等效算子
lbp = local_binary_pattern(image, n_points, radius, METHOD)
plt.imshow(lbp,cmap='gray')
plt.colorbar()
def hist(ax, lbp):#绘制LBP的直方图n_bins = int(lbp.max() + 1)#直方图横坐标return ax.hist(lbp.ravel(), density=True, bins=n_bins, range=(0, n_bins),facecolor='0.5')w = width = radius - 1
edge_labels = range(n_points // 2 - w, n_points // 2 + w + 1)#边点对应的LBP范围
flat_labels = list(range(0, w + 1)) + list(range(n_points - w, n_points + 2))#平面点对应的LBP范围
i_14 = n_points // 4            #直方图的四分之一
i_34 = 3 * (n_points // 4) #直方图的四分之三
corner_labels = (list(range(i_14 - w, i_14 + w + 1)) +list(range(i_34 - w, i_34 + w + 1)))#角点对应的LBP范围
label_sets = (edge_labels, flat_labels, corner_labels)#三种点作为标签集
def overlay_labels(image, lbp, labels):mask = np.logical_or.reduce([lbp == each for each in labels])return label2rgb(mask, image=image, bg_label=0, alpha=0.5)#返回一个RGB图像,其中彩色编码标签被涂在图像上
def highlight_bars(bars, indexes):for i in indexes:bars[i].set_facecolor('r')#在直方图里将直方图的条状高亮为红色
fig, (ax_img, ax_hist) = plt.subplots(nrows=2, ncols=3, figsize=(9, 6))
plt.gray()
titles = ('edge', 'flat', 'corner')
for ax, labels in zip(ax_img, label_sets):ax.imshow(overlay_labels(image, lbp, labels))#在原图上绘制标记点
for ax, labels, name in zip(ax_hist, label_sets, titles):counts, _, bars = hist(ax, lbp)highlight_bars(bars, labels)ax.set_ylim(top=np.max(counts[:-1]))ax.set_xlim(right=n_points + 2)ax.set_title(name)
ax_hist[0].set_ylabel('Percentage')#设置y标签为百分数
for ax in ax_img:ax.axis('off')

LBP算子经常与直方图联合使用:

radius = 2
n_points = 8 * radiusdef kullback_leibler_divergence(p, q):p = np.asarray(p)q = np.asarray(q)filt = np.logical_and(p != 0, q != 0)return np.sum(p[filt] * np.log2(p[filt] / q[filt]))def match(refs, img):best_score = 10best_name = Nonelbp = local_binary_pattern(img, n_points, radius, METHOD)n_bins = int(lbp.max() + 1)hist, _ = np.histogram(lbp, density=True, bins=n_bins, range=(0, n_bins))for name, ref in refs.items():ref_hist, _ = np.histogram(ref, density=True, bins=n_bins,range=(0, n_bins))score = kullback_leibler_divergence(hist, ref_hist)if score < best_score:best_score = scorebest_name = namereturn best_namebrick = data.brick()
grass = data.grass()
gravel = data.gravel()refs = {'brick': local_binary_pattern(brick, n_points, radius, METHOD),'grass': local_binary_pattern(grass, n_points, radius, METHOD),'gravel': local_binary_pattern(gravel, n_points, radius, METHOD)
}# classify rotated textures
print('Rotated images matched against references using LBP:')
print('original: brick, rotated: 30deg, match result: ',match(refs, rotate(brick, angle=30, resize=False)))
print('original: brick, rotated: 70deg, match result: ',match(refs, rotate(brick, angle=70, resize=False)))
print('original: grass, rotated: 145deg, match result: ',match(refs, rotate(grass, angle=145, resize=False)))# plot histograms of LBP of textures
fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(nrows=2, ncols=3,figsize=(9, 6))
plt.gray()ax1.imshow(brick)
ax1.axis('off')
hist(ax4, refs['brick'])
ax4.set_ylabel('Percentage')ax2.imshow(grass)
ax2.axis('off')
hist(ax5, refs['grass'])
ax5.set_xlabel('Uniform LBP values')ax3.imshow(gravel)
ax3.axis('off')
hist(ax6, refs['gravel'])plt.show()

程序1结果:

程序二结果:

python实现LBP纹理提取相关推荐

  1. 【OpenCV】纹理提取

    求一幅图的纹理特征图 原图 (1)转为灰度图 cvtColor(src_img, gray_img, CV_BGR2GRAY); (2)获得LBP模板并赋值 LBP纹理提取代码 /* CV:LBP A ...

  2. python统计图片的纹理信息_python实现LBP方法提取图像纹理特征实现分类

    题目描述 这篇博文是数字图像处理的大作业. 题目描述:给定40张不同风格的纹理图片,大小为512*512,要求将每张图片分为大小相同的9块,利用其中的5块作为训练集,剩余的4块作为测试集,构建适当的模 ...

  3. python图像纹理提取_提取图像的颜色、纹理特征(传统算法)

    Python-Image-feature-extraction Python实现提取图像的纹理.颜色特征,包含快速灰度共现矩阵(GLCM).LBP特征.颜色矩.颜色直方图.1044197988/Pyt ...

  4. python实现gabor滤波器提取纹理特征 提取指静脉纹理特征

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8989836.html 参考博客:https://blog.csdn.net/xue_wenyu ...

  5. LBP算法提取图片纹理特征图

    LBP算法提取图片纹理特征图 一.项目目标 采用LBP算法提取图片的纹理特征图. 二.LBP算法原理 LBP指局部二值模式,英文全称:Local Binary Patterns.最初功能为辅助图像局部 ...

  6. 基于LBP纹理特征计算GLCM的纹理特征统计量+SVM/RF识别纹理图片

    作者 | Raini 出品 | 北京图特摩斯科技有限公司 (thutmose.cn) 说在前头: 局部特征检测方法 斑点Blob检测,LoG检测 , DoG,DoH检测,SIFT算法,SUFT算法 边 ...

  7. LBP纹理特征提取学习笔记

    前言 LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietikäi ...

  8. OpenCV Gabor滤波器实现纹理提取与缺陷分析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一:Gabor滤波器介绍 Gabor滤波器是OpenCV中非常强大 ...

  9. CUDA C 纹理提取Texture Fetching

    CUDA C 纹理提取Texture Fetching 一.参数曲面的纹理 使用纹理指定参数曲面属性. 二.CUDA C 纹理获取开发 用于计算纹理函数,根据纹理引用的各种属性返回的值的公式(请参见纹 ...

最新文章

  1. 如何快速学习产品?实践才是王道!同为小白的人儿加油!
  2. java开发环境jdk1.8_linux 搭建 jdk1.8 java开发环境
  3. (stack 解析表达式)矩阵链乘
  4. opcenum在计算机服务找不到,OPC DCOM 问题处理
  5. 调整idea中控制台及右侧提示框字体大小
  6. 装箱与拆箱的概念及意义
  7. 大数据之_亿级分布式日志管理ELK_工作笔记001_ELK认识介绍
  8. 2019年6月多校联训b层——搜索算法 Problem A 宽搜 营救
  9. Python.Algorithms(2nd)pdf
  10. vue项目中报常见错误
  11. ONIE——开放网络安装环境
  12. 12. JLINK在线调试+软件调试方法与技巧
  13. 算法练习:Sequence II
  14. c语言笔试程序改错题,C语言笔试--程序改错题.doc
  15. 微信小程序|飞翔的圣诞老人
  16. Hipo-iPod 处理对象
  17. JQData | A股投资指南-单因子选股的有效性验证
  18. 蓝牙信标的优势及应用场景
  19. websocket接口自动化集成pytest测试框架
  20. 计算机毕业设计java+springboot宠物商城系统

热门文章

  1. MapGIS 6.7安装方法教程
  2. python碰撞检测算法_GJK碰撞检测算法
  3. 2022年最新前端面试题,持续更新
  4. Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional
  5. Arduino UNO开发板开箱体验
  6. 欧美生活馆—供应链后台
  7. 浅谈UpdatePanel
  8. Apple Developer 注册及DUNS编码申请
  9. 在服务器里面修改油画,油画错误如何修改?
  10. serverlet 区别_浅谈JSP serverlet的区别与联系