HOG和LBP特征翻拍分类研究

优秀创作者-戚朕.png

HOG:Histogram of Oriented Gradient(方向梯度直方图)

HOG (Histogram of oriented gradient)特征是Dalal在2005年CVPR会议上提出的一种用于人体目标检测的图像描述方法,该特征由图像局部区域的梯度方向直方图组成,具有角度不变性和光照不变性。

原理

  • 该特征的主要思想是:图像中局部区域的梯度方向可以代表该子图区域的边缘和形状特征。在实际操作中,将图像分为小的细胞单元(cells),每个细胞单元计算一个梯度方向(或边缘方向)直方图。为了满足光照不变性,需要对直方图进行对比度归一化:将细胞单元组成更大的块(blocks)并归一化块内的所有细胞单元来实现。归一化的块叫做HOG描述子。将检测窗口中的所有块的HOG描述子组合起来就形成了最终的特征向量。

步骤

  1. 对图像进行缩放、伽马校正等预处理。
  2. 计算每个像素点的梯度值,得到梯度图。在数字图像中,梯度即为相邻像素点的差,例如下图中,像素值为136的点,其垂直方向梯度为139-133=6,水平方向梯度为139-134=5,根据这两个值可以得到梯度强度g和梯度方向θ

  1. 在每一个8×8的cell内计算梯度直方图。如下图所示,根据区域内的梯度强度g和梯度方向θ统计梯度直方图,将180°划分成9个区间,将g作为权重,将区域内的像素点梯度方向进行投票统计,得到该区域内的方向分布。

  1. 对每个16×16的block(即对每个2×2的cell进行滑动窗口处理)进行归一化,以降低光照(像素均值)和对比度(像素方差)影响。
  2. 得到HOG特征向量。每一个block计算得到4*9区间=36大小的特征向量,根据图像长宽整合特征向量,就可以将其用于SVM或者CNN分类。

利弊

  • 在翻拍低分辨率电脑屏幕等设备时,由于干涉效应会在成像时生成摩尔纹(如下图),摩尔纹具有明显的方向特征,可以通过HOG统计的方向直方图反映出来

  • 对于高端屏幕/手机的效果一般

用法

# 使用HOG方法提取图像的纹理特征.
img = cv2.imdecode(np.fromfile(img_paths[i], dtype=np.uint8), -1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.resize(img, (207, 194))
# 伽玛变换
img = np.power(img, gamma).astype(np.uint8)
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)
hist = hog.compute(img, winStride, padding).reshape((-1,))
复制代码

可视化

image.png

LBP:Local Binary Pattern(局部二值模式)直方图

LBP是一种简单,有效的纹理分类的特征提取算法。LBP算子是由Ojala等人于1996年提出的,主要的论文是”Multiresolution gray-scale and rotation invariant texture classification with local binary patterns”, pami, vol 24, no.7, July 2002。LBP就是”local binary pattern”的缩写。

原理

  • 原始的LBP算子定义为在3 ∗ 3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于等于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3 ∗ 3邻域内的8个点经顺时针方向比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,反映了该区域的纹理信息。

  • 改进:圆形LBP算子:

为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。

为了让LBP具有旋转不变性,将二进制串进行旋转。假设一开始得到的LBP特征为10010000,将其按照顺时针方向旋转,可以转化为00001001的,对应了一个最小的LBP特征值,这样LBP就是旋转不变的。

  • 在应用中,最常用的是把LBP的统计柱状图作为图像的特征向量。为了考虑特征的位置信息,把图像分成若干个小区域,在每个小区域里进行直方图统计,类似于HOG中的块,最后再把所有区域的直方图依次连接到一起作为特征向量接受下一级的处理。

利弊

  • 一定程度上消除了光照变化的问题,具有旋转不变性
  • 纹理特征维度低,计算速度快
  • 当光照变化不均匀时,各像素间的大小关系被破坏,对应的LBP算子也就发生了变化。
  • 通过引入旋转不变的定义,使LBP算子更具鲁棒性。但这也使得LBP算子丢失了方向信息。
  • 翻拍分类上比HOG效果要好

用法

from skimage.feature import local_binary_pattern
import numpy as np
import cv2
img = cv2.imdecode(np.fromfile(img_paths[i], dtype=np.uint8), -1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# img = cv2.resize(img, (512, 512))
img = img / 255
# 伽玛变换
img = np.power(img, gamma)
tain_imgs.append(img)
lbp = local_binary_pattern(img, n_point, radius, 'uniform')
hist = lbp.flatten()
复制代码

可视化

image.png

关于我们

  • 三百云是国内优秀的以人工智能为依托、以汽车交易定价和汽车金融风控的标准化为核心产品的独立第三方的汽车交易与金融SaaS服务提供商;
  • 三百云AI团队面向行业用户,基于业界领先的机器学习技术和海量汽车行业数据,提供高精度的AI识别服务。团队主要研究的领域包括图像分类、语义分割、目标检测、推荐算法、自然语言处理等,以领域内的关键技术为依托开发了车系分类、各种卡证的结构化识别、中控台里程数识别等服务,并根据业内用户的需求进行持续优化和改进。
  • 三百云AI团队是一个积极扩展和前进的多元化团队,实习/正式岗位持续开放中。不论你是人工智能相关专业的在校生还是经验丰富的算法大牛,都可以在这里获得施展才华的机会~
  • 官网:www.sanbaiyun.com/
    投递简历:hr@che300.com,请注明来自掘金?
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享