图像处理

图像处理基础

  • 图像预处理方法及原理
    低通高通滤波器
    高斯滤波器
    均值、中值滤波

  • 图像的增强和降噪
    几何变换
    颜色变换
    区域置零

  • 常用的图像特征提取算法
    方向梯度直方图(HOG)
    尺度不变特征变换(SIFT)
    加速稳健特征(SURF)
    高斯函数差分(DOG)
    局部二值模式(LBP)
    哈尔变换(HAAR)

  • 常用的图像插值算法

  • 直方图
    直方图的概念
    直方图均衡化

图像变换

图像编码和压缩

图像增强和复原

图像分割

边缘检测

  • 传统的边缘检测算子
    Sobel
    Canny
    Prewitt
    Laplace
    Robert
    各算法优缺点

  • 极大值抑制

形态学处理

  • 腐蚀
  • 膨胀
  • 开运算
  • 闭运算

OpenCV

注:以下转自面试问题总结——关于OpenCV
【地表最全】零基础!计算机视觉OpenCV从入门到入土

OpenCV 中 cv::Mat 的深拷贝和浅拷贝问题

深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。
浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。

OpenCV 的 Mat 时,有几种赋值方式分别为:
  深拷贝 是 b = a.clone();a.copyTo(b);
  浅拷贝 是 b = a;b(a);

  关于这个问题,我还测试了 OpenCV 中的 ROI,就是图像截图,发现ROI也是浅拷贝。

  C++ 中利用opencv存储图像的结构体是 Mat。

OpenCV 中 RGB2GRAY 是怎么实现的

  本质上就是寻找一个三维空间到一维空间的映射,以 R、G、B 为轴建立空间直角坐标系,则图片上的每一个像素点都可以用一个点表示,则可以通过一个公式 $Gray = 0.29900×R + 0.58700×G + 0.11400×B$,来完成一维空间的映射。

连续图像转化为数字图像需要进行哪些操作?

  取样 量化

数字图像中有哪些基本特征?

  颜色特征、纹理特征、形状特征、空间关系特征等。

图像边缘检测中常用的边缘检测算子有哪些?

  Roberts 算子、Prewitt 算子、Sobel 算子、Canny 算子、Laplacian 算子等。

对霍夫变换的理解

  霍夫变换常用来提取图像中的直线和圆等几何形状。它通过一种投票算法检测具有特定形状的物体,就是通过计算累计结果的局部最大值得到一个符合该几何形状的集合作为结果。

  算法原理:针对每个像素点,使得 $\theta$ 在 -90 度到 180 度之间,用极坐标 $p = xcos\theta + ysin\theta$ 计算得到共 270 组 $(p,\theta)$ 代表着霍夫空间的 270 条直线。将这 270 组值存储到 $H$ 中。如果一组点共线,则这组点中的每个值,都会使得 $H(p,\theta)$ 加 1,因此找到最大的 $H$ 值,就是共线的点最多的直线,也可以通过设定阈值来判定。

对 HOG 特征的理解

  主要思想:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓,即梯度的统计信息,而梯度主要位于边缘的地方很好地描述。
  HOG 特征检测算法的几个步骤:颜色空间归一化 —> 梯度计算 —> 梯度方向直方图 —> 重叠块直方图归一化 —> HOG 特征。

图像的插值方法有哪些?

  最近邻法
  双线性内插法
  三次内插法

Grabcut 的基本原理和应用

  Graph CutGrab Cut 算法,两者都是基于图论的分割方法。
  Graph Cut 在计算机视觉领域普遍应用于前背景分割、抠图等。
  基本原理:根据待分割的图像,确定图的节点与边,即图的形状已确定下来,是给图中所有边赋值相应的权值,然后找到权值和最小的边的组合,就完成了图像分割。

SIFT / SURF的特征提取方法,是如何保持尺度不变性的?

  SIFT (Scale-Invariant Feature Transform) 算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT 所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

  如何保持尺度不变性?
  ① 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点。(第一步获取图片的高斯金字塔,高斯金字塔指的是图片在不同尺寸下进行的高斯模糊处理后的图片,为了寻找图片的特征点,我们要找到图片在不同尺寸空间里的极值,这些极值通常存在于图片的边缘或者灰度突变的地方,所以要对高斯模糊后的图片进行高斯差分,然后到寻找极值点。)
  ② 关键点定位:由于图片的坐标是离散,所以要精确定位的话,作者采用了曲面拟合的方法,通过插值找到真正极值点的位置,位置找到之后,我们要找到这个极值点的主方向。
  ③ 关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
  ④ 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。

  SURF 是在 SIFT 的基础上改进的,原理基本相似,在特征点检测这儿,SIFT 是先进行非极大值抑制,再去除低对比度的点,最后再通过 Hessian 矩阵去除边缘的点;而 SURF 是先用 Hessian 矩阵确定候选点,然后再进行非极大值抑制,该算法提高了 SIFT 的速度和鲁棒性,且理论上 SURFSIFT 速度的 3 倍。(见书《OpenCV3编程入门》P417)

关于 FLANN 算法

  FLANN 算法也属于关键点匹配算法,算法步骤整体来说分为两步:一是建立索引,而是搜索。
  建立索引:其实就是要两部分参数,一是数据也就是 mat 矩阵,二是一些具体参数,这个参数要根据建立的索引类型来设置。而有哪些索引类型呢?共有:线性索引、KD-Tree 索引、K均值索引、复合索引、LSH 方法索引、自动索引六种。
  进行搜索:有两种搜索方式 :搜索 k 邻近 (具体点的个数由用户设定,设 n 个就一定返回 n 个)、搜索半径最近 (即可能不存在符合条件的点,则返回空的)。
  SIFT / SURF 是基于浮点数的匹配,ORB 是二值匹配,速度更快。对于 FLANN 匹配算法,当使用 ORB 匹配算法的时候,需要重新构造 HASH

Canny边缘检测的流程

  图像降噪——计算图像梯度,得到可能边缘——非极大值抑制——双阈值筛选

图像锐化 – sharpen

  平滑:把图像变模糊;
  锐化:把图像变清晰;
  图像锐化主要用于增强图像的灰度跳变部分,这和图像平滑对灰度跳变的抑制正好相反。

图像对比度

  对比度:指一幅图像中灰度反差的大小;
  对比度 = 最大亮度 / 最小亮度

图像滤波

  定义:把滤波想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像上,透过该窗口查看。
  滤波的作用:去除图像中的噪声
  低通滤波器:去除图像中的高频部分——模糊化
  高通滤波器:去除图像中的低频部分——锐化
  线性滤波器:方框滤波、均值滤波、高斯滤波
  非线性滤波:中值滤波、双边滤波

OpenCV 中图像加法(cv2.add())与图像融合(cv2.addWeighted())有何区别?

  图像加法:目标图像 = 图像1 + 图像2
  图像融合:目标图像 = 图像1 × 系数1 + 图像2 × 系数2 + 亮度调节量

如何检测图片中的汽车,并识别车型,如果有遮挡怎么办?

  首先这是一个细粒度的分类(Fine-Grained Classification)问题,和普通的分类不一样,要分类的类别往往只是有细微的差异。
  思路:
  ① 人工框定局部图像,然后识别。比如我去框定,汽车的车灯,汽车的前脸,汽车轮毂等,然后用 cnndeep cnn 其他的分类器做这些的分类,对于分类器来说输入是汽车的车灯+汽车的前脸+汽车轮毂,而不是整张图片,分类器再从车灯前脸等提取高级特征,从而得到一个分类模型。
  ② 不做局部变换,做图片整体识别。但是做分级或是分层。首先,训练第一个分类器,它只针对汽车和非汽车进行分类,标记了 carother。这一步要求尽可能的广,涵盖生活中常见的图片,力求 98% 以上的准确率,每个分类用了2w张图片,实际上能达到 99.5% 的准确率。接着,对于汽车做品牌分类器,只对汽车所属的品牌进行分类,不对细分的子品牌分类。这一步每一类人工标记5000张图片,输入是第一步的输出,准确率能达到96%以上。
最后,对每个品牌的汽车进行车型分类,这一层识别率在 94% 左右。这样会得到一个 0.98×0.96×0.94~0.88 的识别率。

常用图像增强算法

  ① 直方图均衡化:直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。

  ② 对数图像增强算法:对数图像增强是图像增强的一种常见方法,其公式为: $S = c \times log(r+1)$,其中 $c$ 是常数(以下算法 $c=255/(log(256)$),这样可以实现整个画面的亮度增大。

  ③ 指数图像增强算法:指数图像增强的表达为:$S = cR^{r}$,通过合理的选择c和r可以压缩灰度范围,算法以 $c=1.0/255.0, r=2$ 实现。

  ④ 加Masaic算法(马赛克):原理:用中心像素来表示邻域像素

  ⑤ 曝光过度问题处理:对于曝光过度问题,可以通过计算当前图像的反相($255-image$),然后取当前图像和反相图像的较小者为当前像素位置的值。

  ⑥ 高反差保留:高反差保留主要是将图像中颜色、明暗反差较大两部分的交界处保留下来,比如图像中有一个人和一块石头,那么石头的轮廓线和人的轮廓线以及面部、服装等有明显线条的地方会变被保留,而其他大面积无明显明暗变化的地方则生成棕灰色。其表达形式为:$dst = r \times(img - Blur(img))$。

  ⑦ 拉普拉斯算子图像增强:使用中心为 58 邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的。

  ⑧ Gamma校正:伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的。

数字图像处理中常用图像分割算法有哪些?

  ① 多数的图像分割算法:均是基于灰度值的不连续和相似的性质。

  ② 图像边缘分割:边缘是图像中灰度突变像素的集合,一般用微分进行检测。基本的边缘检测算法有:Roberts 算子、Sobel 算子。稍高级的算法有:Canny 边缘检测器。

  ③ 图像阈值分割:由于阈值处理直观、实现简单且计算速度快,因此阈值处理在分割应用中处于核心地位。如 Otsu(最大类间方差算法)算法。

  ④ 基于区域的分割:区域生长算法和区域分裂与聚合都是属于基于区域的分割算法。