更多精彩内容请关注微信公众号:听潮庭

计算机视觉的深度学习实战四:图像特征提取

综述:

  • 颜色特征

    • 量化颜色直方图、聚类颜色直方图
  • 几何特征
    • Edge,Corner,Blob
  • 基于关键点的特征描述子
    • SIFT、SURF、ORB
  • 其他特征提取:(LBP、Gabor)
  • 代码实践

一、颜色特征

1、量化颜色直方图

  • 适用颜色空间:RGB、HSV等颜色空间
  • 操作
    • 颜色空间量化,单元(bin)由单元中心代表
    • 统计落在量化单元上的像素数量

  • 最常用的方法是将颜色空间的各个分量(维度)均匀地进行划分。
  • HSV空间
  • 优势:计算高效
  • 劣势:量化问题、稀疏

2、聚类颜色直方图

  • 适用颜色空间:Lab等颜色空间
  • 操作:
    • 使用聚类算法对所有像素点颜色空间进行聚类
    • 单元(bin)由聚类中心代表
    • 聚类算法则考虑到图像颜色特征在整个空间的分布情况,避免出现大量的bin中的像素数量非常稀疏的情况;
  • lab空间是用数字化的方法来描述人的视觉感应。
  • Lab颜色空间中:
    • L分量用于表示像素的亮度,取值范围是[1,100],表示从纯黑到纯白;
    • a表示从品红色到深绿色的范围,取值范围是[127,-128];
    • b表示从黄色到蓝色的范围,取值范围是[127,-128].

3、

  • 设想两幅图像的颜色直方图几乎相同,只是互相错开了一个bin,这时如果采用L1距离或者欧拉距离计算两者的相似度,会得到很小的相似度值。
  • 为了克服这个缺陷,需要考虑到相似但不相同的颜色之间的相似度:
    • 一种方法是采用二次式距离;
    • 另一种方法是对颜色直方图事先进行平滑过滤,即每个bin中的像素对于相邻的几个bin也有贡献。

二、几何特征

1、边缘(Edge)

  • 像素明显变化的区域
  • 具有丰富的语义信息
  • 用于
    • 物体识别
    • 几何、视角变换

  • 边缘定义:

    • 像素值函数快速变化的区域->一阶导数的极值区域

边缘提取:

  • 先高斯(高斯平滑)去噪,再用一阶导数获取极值
  • 导数对噪声敏感

  • 高斯滤波yijiedao
  • 标准差->尺度

  • 梯度幅值/强度
  • 梯度(增加最快)方向



  • 边缘提取尺度问题:
    • 不同标准差的滤波(x方向)
    • 能捕捉到不同尺度的边缘

三、基于特征点的特征描述子

  • 从不同的距离,不同的方向、角度,不同的光照条件下观察一个物体时,物体的大小,形状,敏感都会有所不同。但我们依然可以判断它是同一物体。
  • 理想的特征描述子应该具备这些性质。即,在大小、方向、明暗不同的图像中,同一特征点应具有足够相似的描述子,称之为描述子的可复现性

1、几何特征:特征点/关键点

  • 不同视角图片之间的映射
  • 稳定局部特征点
    • 可重复性、显著
    • 抗图片变换:外貌变换(亮度,光照);几何变换(平移、选择、尺度)

兴趣点/关键点(Interest point/Key point)

  • 图片配准/拼接
  • 运动跟踪
  • 物体识别
  • 机器人导航
  • 3D重建

2、几何特征:Harris角点

Harris角点(Corner

  • 一种显著点

    • 任何方向上移动小观察窗,导致的像素变动
  • 数学模型:偏移(u,v)后窗内图像变化
    • 取 E(u,v)大的patch,其中w(x,y)相当于权重

判断Harris角点:

  • 图像中直线:一个特征值大,另一个特征值小;
  • 图像中平面:两个特征值都小,且近似相等;
  • 图像中角点:两个特征值都大,且近似相等;

3、FAST角点检测

  • FAST角点检测是一种快速角点特征检测算法。

  • FAST角点定义为:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点,也就是某些属性与众不同。

  • FAST特征点检测是对兴趣点所在圆周上的16个像素点进行判断,若判断后的当前中心像素点为暗或亮,将决定其是否为角点。

  • 确定一个阈值t,观察某像素点为中心的一个半径等于3像素的离散化的圆,这个圆的边界上有16个像素。

  • 如果在这个大小为16个像素的圆上有N(12)个连续的像素点,他们的像素值要么都比
    I p + t I_p+t Ip​+t
    大,要么都比
    I p − t I_p-t Ip​−t
    小,则p他就是一个角点。

4、几何特征:斑点

  • 拉普拉斯梯度

    • 一阶导极值二阶导数
    • 梯度/边缘可以通过寻找二阶导数接近零
    • 但对噪声很敏感,首先对图像进行高斯卷积滤波进行降噪出路,再采用Laplace算子进行边缘检测。
  • 高斯拉普拉斯滤波/Laplacian of Ganssian(LoG)

  • 当sigma较小时,将识别出更为细节的边缘。
斑点(Blob)
  • LoG图找极值点→斑点

局部特征:SIFT(尺度不变特征变换)Scale-invariant feature transform

  • 基于尺度空间不变的特征
  • SIFT特征计算步骤
    • 在DoG尺度空间中获取极值点,即关键点

      • LoG尺度空间和DoG(差分高斯)尺度空间
    • 对关键点处理
      • 位置插值(获得精确的关键点)
      • 去除边缘点
    • 关键点的方向估计
    • 关键点描述子的生成
      • 区域坐标旋转
      • 计算采样区域的直方图
  • 特点:
    • 具有良好的不变性

      • 旋转、尺度缩放、平移、亮度变化、
      • 对视角变化、仿射变换和噪声也有一定程度的稳定性
    • 独特性好,信息量丰富
      • 适用于在海量特征数据库中进行快速、准确的匹配
    • 多量性
      • 即使少数物体也可以产生大量的SIFT特征
    • 计算快
      • 经优化的SIFT匹配算法甚至可以达到实时性
    • 可扩展性,可以很方便的与其他形式的特征向量进行联合。
  • 尺度空间:
    • 使用不同σ的LoG对图片进行滤波

    • 使用LoG,则后续计算量大,故使用DoG来代替LoG,用差分代替微分。
  • 高斯金字塔就是在传统金字塔的基础上,对每一层用不同的参数σ做高斯模糊,是的每一层金字塔有多张高斯模糊图像,这样一组图像是一个octave。

  • SIFT-计算高斯差分(DoG)空间

  • SIFt-DoG空间极值点就是“关键点”
    • 圆半径→特征点尺度
    • 圆心→特征点坐标
  • 通过拟合三维二次函数来精确确定关键点的位置和尺度
    • 离散空间的极值点并不是真正的极值点,上图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值。
  • 同时去除低对比度的关键点和不稳定的边缘相应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。
    • DoG算子会产生较强的边缘响应,需要剔除不稳定的边缘相应点。获取特征点处的Hessian矩阵,主曲率通过一个2×2的Hessian矩阵H求出
SIFT-特征点方向估计
  • 在尺度上计算梯度直方图

    • 8方向以特征点为中心、以3×1.5σ为半径
  • 活取最高值方向为关键点主方向
  • 为了匹配的稳定性,将超过最高值80%的方向称为辅方向
  • 为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内的图像旋转一个方向角θ
  • 即将原图像x轴转到与主方向相同的方向。
SIFT-计算特征点描述子
  • 在旋转后的坐标上采样16×16的像素窗
  • 在旋转后的坐标上采样16×16的像素床
    • 4×4网格
    • 8方向直方图
    • 总共128维
  • SIFT的缺点是:计算太复杂,如果不借助硬件加速或专门的图像处理器很难实现。
  • 改进方式:Haar-like特征:
    • Haar-like特征分为:边缘检测、线性特征、中心特征和对角线特征,这些特征组合成特征模板
    • 特征模板有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。
    • Haar特征值反映了图像的灰度变化情况。
  • Haar-like特征的快速计算:积分图
    • 同一个像素如果被包含在不同的Haar-like的特征模板中,会被重复计算多次;
    • 积分图是根据四个角点就能计算区域内的像素之和的方法。

5、局部特征:SURF

SURF(Speed-Up Robust Features)算子是Herbert Bay等人在2006年提出的,它是对SIFT的改进,可将速度提高三倍。

SURF只要是把SIFT中的某些运算做了简化。

  • SURF把SIFT中的高斯二阶微分的模板进行了简化,使得卷积平滑操作仅需要转换成加减运算。
  • 在方向确定阶段,在圆形区域计算x,y方向的haar小波响应,找到模最大的扇形方向。
  • 为了找出图像中的特征点,需要对原图进行变换,变换图就是原图每个像素的Hessian矩阵行列式的近似值构成的。
  • 求Hessian时要先高斯平滑,然后求二阶导数,这对于离散的像素点而言,是用模板卷积形成的,这两种操作合在一起用一个Haar模板代替就可以了。
  • 小造型
  • 为了保证旋转不变性,在SURF中,统计特征点领域内的Haar小波特征。
  • 即以特征点为中心,计算半径为6s(s为特征点所在的尺度值)的邻域内,统计60度扇形内所有点在x(水平)和y(垂直)方向的Haar小波响应总和。
  • 然后60度扇形以一定间隔进行旋转,最后将最大值那个扇形的方向作为该特征点的主方向。
  • 在特征点周围取一个正方形框,框的边长为20s(是所检测到该特征点所在的尺度)。该框的方向,就是检测出来的主方向。
  • 最终,SURF的特征点特征向量的维度为64维。
  • 然后把该框分为16个子区域,每个子区域统计25个像素的水平方向和垂直方向的Haar小波特征,这里的水平和垂直方向都是相对主方向而言的。
  • 近似SIFT算法,实现快速版
    • 先确定后选点,再找最大值
    • Haar模板
  • 加速三倍
  • 亮度效果下效果好
  • 模糊方面优于SIFT
  • 尺度不变上不及SIFT
  • 旋转不变上差很多

6、ORB特征描述

  • SIFT和SURF计算复杂,难以用于实时性特征检测,更何况SIFT与SURF以前还是收费的
  • ORB特征基于FAST角点的特征点检测与BRIEF特征描述技术
ORB的基本思路
  • 它是对FAST角点与BRIEF特征描述子的一种结合与改进
  • FAST角点检测的缺点是:
    • 缺乏尺度不变性;
    • 可以通告构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性;
  • BRIEF的缺点是
    • 缺乏旋转不变性;
    • 需要给BRIEF加上旋转不变性

7、BRIEF

  • BRIEF需要先平滑图片,然后在特征点周围选择一个Patch,在这个Patch内通过一种选定的方法来挑选Nd个点对。

  • 比较点对中两点像素的大小,进行如下赋值

  • 所有Nd个点对,都进行比较之间,我们就生成了一个Nd长的二进制串。

  • 点对的生成方式(共有五种)

    • 1、X,Y都服从在[-s/2,s/2]范围内的均匀分布,且相互独立
    • 2、X,Y都服从均值为0,方差为S²/25d的高斯分布,且相互独立,即X和Y都已原点为中心,进行同方差的高斯分布;
  • 点对的位置一旦随机选定,就不能再更改

ORB对BRIEF的改进
  • ORB在计算BRIEF描述子时建立的坐标系是以关键点为圆心,以关键点和取点区域的形心(圆形)的连线为X轴建立坐标系
  • 计算形心时,圆形区域上每个点的质量是其对应的像素值

四、LBP

LBP(局部二值模式)

  • 将每个像素点与周围点大小比较

    • 半径为R的圆上,均匀采样P个点
    • 大小量化为0或1
  • 多个bit组成一个数,统计每个数的直方图
  • 为解决旋转不变性的问题:将LBP周围的二进制码(如11110001)按位旋转,取二进制码最小的值为最终LBP值。
  • 如:对于11110001情况,我们按位旋转,得到11100011,11000111,10001111,0001111,00111110,01111100,11111000七个不同的二进制数,最小值为00011111.
  • 改进的LBP:
    • 将3×3邻域扩展到任意邻域,并用圆形邻域代替了正方向邻域,这种LBP特征叫做Extended LBP,也叫Circular LBP。
  • LBP特征具有灰度不变性和旋转不变性等显著优点。

五、Gabor

  • Gabor是一个用于边缘提取的线性滤波器,其频率和方向表达与人类视觉系统类似,能够提供良好的方向选择和尺度选择特性,而且对于光照变化不敏感;
  • 十分适合纹理分析
  • 使用一个三角函数与一个高斯函数叠加就得到了一个Gabor滤波器

Gabor滤波器组

  • Gabor滤波器组类似于人类的视觉系统

    • 多频率/尺度
    • 多方向
  • Gabor滤波器

    • 频域:属于加窗傅里叶变换
    • 空域:一个高斯核函数和正弦平面波的乘积
  • 三尺度

  • 八方向

六、代码实现

1、Haaris Corner

import numpy as np
import cv2 as cv
filename = "picture/chessboard.png"
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#result is dilated for marking the corners, not important
dst = cv.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:cv.destroyAllWindows()

2、ORB

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1 = cv.imread('picture/box.png',0)          # queryImage
img2 = cv.imread('picture/box_in_scene.png',0) # trainImage
# Initiate ORB detector
orb = cv.ORB_create()
# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)# create BFMatcher object
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
# Draw first 10 matches.
img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:20],None, flags=2)
plt.imshow(img3),plt.show()

3、图片拼接

(注意原始图片不能过大,否则报错,此处500*375)

from Stitcher import Stitcher
import cv2# 读取拼接图片
imageA = cv2.imread("image/3.png")
imageB = cv2.imread("image/4.png")# 把图片拼接成全景图
stitcher = Stitcher()
(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)# 显示所有图片
cv2.imshow("Image A", imageA)
cv2.imshow("Image B", imageB)
cv2.imshow("Keypoint Matches", vis)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
import cv2class Stitcher:#拼接函数def stitch(self, images, ratio=0.75, reprojThresh=4.0,showMatches=False):#获取输入图片(imageB, imageA) = images#检测A、B图片的SIFT关键特征点,并计算特征描述子(kpsA, featuresA) = self.detectAndDescribe(imageA)(kpsB, featuresB) = self.detectAndDescribe(imageB)# 匹配两张图片的所有特征点,返回匹配结果M = self.matchKeypoints(kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh)# 如果返回结果为空,没有匹配成功的特征点,退出算法if M is None:return None# 否则,提取匹配结果# H是3x3视角变换矩阵      (matches, H, status) = M# 将图片A进行视角变换,result是变换后图片result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))# 将图片B传入result图片最左端result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB# 检测是否需要显示图片匹配if showMatches:# 生成匹配图片vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches, status)# 返回结果return (result, vis)# 返回匹配结果return resultdef detectAndDescribe(self, image):# 将彩色图片转换成灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 建立SIFT生成器descriptor = cv2.xfeatures2d.SIFT_create()# 检测SIFT特征点,并计算描述子(kps, features) = descriptor.detectAndCompute(image, None)# 将结果转换成NumPy数组kps = np.float32([kp.pt for kp in kps])# 返回特征点集,及对应的描述特征return (kps, features)def matchKeypoints(self, kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh):# 建立暴力匹配器matcher = cv2.DescriptorMatcher_create("BruteForce")# 使用KNN检测来自A、B图的SIFT特征匹配对,K=2rawMatches = matcher.knnMatch(featuresA, featuresB, 2)matches = []for m in rawMatches:# 当最近距离跟次近距离的比值小于ratio值时,保留此匹配对if len(m) == 2 and m[0].distance < m[1].distance * ratio:# 存储两个点在featuresA, featuresB中的索引值matches.append((m[0].trainIdx, m[0].queryIdx))# 当筛选后的匹配对大于4时,计算视角变换矩阵if len(matches) > 4:# 获取匹配对的点坐标ptsA = np.float32([kpsA[i] for (_, i) in matches])ptsB = np.float32([kpsB[i] for (i, _) in matches])# 计算视角变换矩阵(H, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh)# 返回结果return (matches, H, status)# 如果匹配对小于4时,返回Nonereturn Nonedef drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status):# 初始化可视化图片,将A、B图左右连接到一起(hA, wA) = imageA.shape[:2](hB, wB) = imageB.shape[:2]vis = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8")vis[0:hA, 0:wA] = imageAvis[0:hB, wA:] = imageB# 联合遍历,画出匹配对for ((trainIdx, queryIdx), s) in zip(matches, status):# 当点对匹配成功时,画到可视化图上if s == 1:# 画出匹配对ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1]))ptB = (int(kpsB[trainIdx][0]) + wA, int(kpsB[trainIdx][1]))cv2.line(vis, ptA, ptB, (0, 255, 0), 1)# 返回可视化结果return vis

计算机视觉的深度学习实战四:图像特征提取相关推荐

  1. 2.11 计算机视觉现状-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.10 数据扩充 回到目录 2.12 总结 计算机视觉现状 (The State of Computer Vision) 深度学习已经成功地应用于计算机视觉.自然语言处理. ...

  2. 基于MATLAB的计算机视觉与深度学习实战

    基于深度学习的汽车目标检测 一.项目任务 随着标记数据的积累和GPU高性能汁算技术的发展,卷积神经网络的研究和应用也不断涌现出新的成果.本项目使用己标记的小汽车样本数据训练RCNN(Regions u ...

  3. 读《python计算机视觉与深度学习实战》(郭卡,戴亮编著)笔记·part1

    1.Dataset pytorch中提供了两种Dataset,一种是Dataset,另一种是IterableDataset. 在构建Dataset子类的时候,一般来说只需要定义__init__.__g ...

  4. 深度学习实战23(进阶版)-语义分割实战,实现人物图像抠图的效果(计算机视觉)

    大家好,我是微学AI,今天给大家带来深度学习实战23(进阶版)-语义分割实战,实现人物图像抠图的效果.语义分割是计算机视觉中的一项重要任务,其目标是将图像中的每个像素都分配一个语义类别标签.与传统的目 ...

  5. PyTorch深度学习实战(5)——计算机视觉基础

    PyTorch深度学习实战(5)--计算机视觉基础 0. 前言 1. 图像表示 2. 将图像转换为结构化数组 2.1 灰度图像表示 2.2 彩色图像表示 3 利用神经网络进行图像分析的优势 小结 系列 ...

  6. 深度学习实战-图像风格迁移

    图像风格迁移 文章目录 图像风格迁移 简介 画风迁移 图像风格捕捉 图像风格迁移 图像风格内插 补充说明 简介 利用卷积神经网络实现图像风格的迁移. 画风迁移 简单来说就是将另一张图像的绘画风格在不改 ...

  7. Keras深度学习实战(38)——图像字幕生成

    Keras深度学习实战(38)--图像字幕生成 0. 前言 1. 模型与数据集分析 1.1 数据集分析 1.2 模型分析 2. 实现图像字幕生成模型 2.1 数据集加载与预处理 2.2 模型构建与训练 ...

  8. 目标检测YOLO实战应用案例100讲-基于深度学习的航拍图像YOLOv5目标检测研究及应用(论文篇)

    目录 基于深度学习的航拍图像目标检测研究 航拍图像目标检测 评价指标与数据集

  9. [机器学习实战] 深度学习为黑白图像着彩色

    深度学习增强了视觉和语言处理等"认知"任务,连谷歌都转向了基于神经网络的语言翻译,如此火爆的原因或许是它不需要掌握各个领域的特定知识就能取得想要的结果.当然,海量GPUs并行计算硬 ...

最新文章

  1. 【跃迁之路】【597天】程序员高效学习方法论探索系列(实验阶段354-2018.09.25)...
  2. C#设计模式之:抽象工厂模式与反射
  3. SPList和SPDocumentLibrary 通过代码更新审批状态
  4. linux之man命令用法入门
  5. C# 导出word文档及批量导出word文档(3)
  6. Keyboarding(信息学奥赛一本通-T1452)
  7. 基础集合论 第一章 9 幂集
  8. 机器学习与控制:ADMM的ODE模型与基于Lyapunov的收敛分析
  9. 前端开发工程师就业时应该选择大公司还是小公司?这是我听过最靠谱的答案!
  10. 关于DDS文件格式的说明
  11. html中怎样写渐变色代码,如何用CSS写渐变色
  12. python测试驱动开发_使用Python进行测试驱动开发的简单介绍
  13. 正在创建系统还原点_如何在Windows 7中创建系统还原点
  14. 软件工程复习知识点汇总(2)
  15. 电机专用MCU芯片LCM32F037系列内容介绍
  16. 通俗易懂:什么是.NET?.NET Framework?.NET Core?(比较全面)
  17. 电线电缆使用时的安全要求和存放方法
  18. python爬虫破解百度文库_用Python爬取百度文库0下载券的免费文档详细步骤,附可执行软件...
  19. Android Studio 快捷键
  20. 串口wifi模块串口无线模块

热门文章

  1. 《IQ情缘》:爱因斯坦的科学游戏
  2. 单片机ADC消抖处理 温度转换
  3. #eeeeee #4D4D4D
  4. 什么是新零售,新零售的模式又该怎么做?
  5. js原型对象的深拷贝
  6. RabbitMQ入门教程(四):工作队列(Work Queues)
  7. canvas抽奖插件大转盘和九宫格
  8. elasticsearch学习——spring整合
  9. 小小的总结一下数据采集
  10. jsp ssm289美食推荐管理系统 java毕业设计项目源码含论文ppt介绍