7-2 OpenCV算法解析

7-2 OpenCV算法解析

  • 目录
  • 1 OpenCV
    • OpenCV大坑之BGR
    • OpenCV 性能
    • OpenCV常见算法
  • 2 最小二乘法
    • 2.1 线性回归
      • 什么是线性回归?
    • 2.2 线性回归--最小二乘法(Least Square Method)
      • 2.2.1 最小二乘法
      • 2.2.2 三种范数:
      • 2.2.3 最小二乘法的定义、k & b
  • 3 RANSAC
    • 3.1 什么是 RANSAC
    • 3.2 RANSAC与最小二乘法
    • 3.3 RANSAC的步骤
      • 输入
      • 步骤
      • 问题
    • 3.4 RANSAC的参数确定
    • 3.5 RANSAC的应用
      • 全景拼接
    • 3.6 RANSAC的优缺点
      • 优点:
      • 缺点:
  • 4 图像相似度比较哈希算法
    • 4.1 分类
    • 4.2 汉明距离
    • 4.3 均值哈希算法
      • 步骤
    • 4.4 差值哈希算法
      • 步骤
    • 4.5 感知哈希算法
      • 步骤
    • 4.6 三种算法的比较
      • 比较的是啥?
  • 5 离散余弦变换DCT
    • 5.1 什么是DCT
    • 5.2 DCT 应用
      • 简介DCT在 JPEG压缩编码 中的应用:
      • DCT在数字水印(digital watermarking)技术中的应用:

目录

  1. OpenCV
  2. 最小二乘法
  3. RANSAC
  4. 图像相似度比较哈希算法
  5. 离散余弦变换DCT

1 OpenCV

  • OpenCV是一个开源的计算机视觉库,可以从 http://opencv.org 获取。

  • OpenCV 库用C语言和 C++ 语言编写,可以在 Windows、Linux、Mac OS X 等系统运行。同时也在积极开发 Python、Java、Matlab 以及其他一些语言的接口,将库导入安卓和 iOS 中为移动设备开发应用。

  • OpenCV 设计用于进行高效的计算,十分强调实时应用的开发。它由 C++ 语言编写并进行了深度优化,从而可以享受多线程处理的优势。

  • OpenCV 的一个目标是提供易于使用的计算机视觉接口,从而帮助人们快速建立精巧的视觉应用。

  • OpenCV 库包含从计算机视觉各个领域衍生出来的 500 多个函数,包括

    • 工业产品质量检验

    • 医学图像处理

    • 安保领域

    • 交互操作

    • 相机校正

    • 双目视觉

    • 以及机器人学

      Just have fun!

OpenCV大坑之BGR

  • OpenCV 对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!
#opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
img4 = cv2.imread('1.jpg')
img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)
  1. 除了OpenCV读入的彩色图片以BGR顺序存储外,其他所有图像库读入彩色图片都以RGB存储。
  2. 除了PIL读入的图片是img类之外,其他库读进来的图片都是以numpy 矩阵。

OpenCV 性能

各大图像库的性能,最好的OpenCV,无论是速度还是图片操作的全面性,都属于碾压的存在,毕竟他是一个巨大的cv专用库。

7-2 OpenCV算法解析_第1张图片

OpenCV常见算法

  1. 图像的基本操作读取显示存储
    • 通过调用OpenCV中的 cv2.imread()cv2.imshow()cv2.write() 分别实现。
  2. 在OpenCV中实现将彩色像素转化为灰度像素
  3. 图像的几何变换
    • 平移、缩放、旋转、插值(最近邻、双线性)。
  4. 对比增强
    • 线性变换、伽马变换、直方图均衡化。
  5. 边缘检测:
    • Sobel、Laplace、Canny
  6. 图像的二维滤波:
    • cvFilter2D

2 最小二乘法

2.1 线性回归

什么是线性回归?

举个例子

  • 某商品的利润在售价为2元、5元、10元时分别为4元、10元、20元,
  • 我们很容易得出商品的利润与售价的关系符合直线:y=2x.

在上面这个简单的一元线性回归方程中,我们称“2”为回归系数,即斜率为其回归系数

  • 回归系数表示商品的售价(x)每变动一个单位,其利润(y)与之对应的变动关系。

7-2 OpenCV算法解析_第2张图片

线性回归表示这些离散的点**总体上“最逼近”**哪条直线。

对!就是用一根直竹签,穿过最多的糖葫芦球

2.2 线性回归–最小二乘法(Least Square Method)

2.2.1 最小二乘法

  • 它通过最小化误差的平方和,寻找数据的最佳函数匹配。
  • 利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
  • 假设我们现在有一系列的数据点 (xi,yi) (i=1,…,m),那么由我们给出的拟合函数h(x)得到的估计量就是h(xi)
  • 残差:ri = h(xi) – yi

2.2.2 三种范数:

  1. -范数:残差绝对值的最大值,即所有数据点中残差距离的最大值:
  2. 1-范数:绝对残差和,即所有数据点残差距离之和:
  3. 2-范数:残差平方和:

2-范数!

科学家告诉我们,2-范数的效果最好

  • 拟合程度,用通俗的话来讲,就是我们的拟合函数h(x)与待求解的函数y之间的相似性。那么2-范数越小,自然相似性就比较高了。

2.2.3 最小二乘法的定义、k & b

  • 由此,我们可以写出最小二乘法的定义了:

7-2 OpenCV算法解析_第3张图片

  • 这是一个 无约束的最优化问题,分别对 kb 求偏导,然后令偏导数为0,即可 获得极值点

7-2 OpenCV算法解析_第4张图片

3 RANSAC

3.1 什么是 RANSAC

  • 随机采样一致性(random sample consensus)

  • RANSAC是一种思想,一个求解已知模型的参数的框架。它不限定某一特定的问题,可以是计算机视觉的问题,同样也可以是统计数学,甚至可以是经济学领域的模型参数估计问题。

    • 把大象放冰箱,总共分几步?
  • 它是一种迭代的方法,用来在一组包含离群的被观测数据中 估算出数学模型的参数。 RANSAC是一个非确定性算法,在某种意义上说,它会产生一个在一定概率下合理的结果,其允许使用更多次的迭代来使其概率增加。

    [注]

    请划去句子中的修饰成分:估算出数学模型的参数 ===>> 估算参数

    • 故这个算法要提前知道数学模型,谢谢!
  • RANSAC的基本假设是 “内群”数据可以通过几组模型参数来叙述其数据分布,而**“离群”数据**则是不适合模型化的数据。 数据会受噪声影响,噪声指的是离群,例如从极端的噪声或错误解释有关数据的测量或不正确的假设。 RANSAC假定,给定一组(通常很小的)内群,存在一个程序,这个程序可以估算最佳解释或最适用于这一数据模型的参数。

7-2 OpenCV算法解析_第5张图片

3.2 RANSAC与最小二乘法

  • 生产实践中的数据往往会有一定的偏差。
  • 例如我们知道两个变量X与Y之间呈线性关系,Y=aX+b,我们想确定参数a与b的具体值。通过实验,可以得到一组X与Y的测试值。虽然理论上两个未知数的方程只需要两组值即可确认,但由于系统误差的原因,任意取两点算出的a与b的值都不尽相同。我们希望的是,最后计算得出的理论模型与测试值的误差最小。
  • 最小二乘法:通过计算最小均方差关于参数a、b的偏导数为零时的值。事实上,很多情况下,最小二乘法都是线性回归的代名词。
    • 遗憾的是,最小二乘法只适合于误差较小的情况。
  • 在模型确定以及最大迭代次数允许的情况下,RANSAC总是能找到最优解。(对于包含80%误差的数据集,RANSAC的效果远优于直接的最小二乘法。)
  • 由于一张图片中像素点数量大,采用最小二乘法运算量大,计算速度慢。

7-2 OpenCV算法解析_第6张图片

3.3 RANSAC的步骤

输入

RANSAC算法的输入:

  1. 一组观测数据(往往含有较大的噪声或无效点),
  2. 一个用于解释观测数据的参数化模型
  3. 一些可信的参数。

步骤

  1. 在数据中随机选择几个点设定为内群
  2. 计算适合内群的模型
  3. 把其它刚才没选到的点带入刚才建立的模型中,计算是否为内群
  4. 记下内群数量
  5. 重复以上步骤
  6. 比较哪次计算中内群数量最多,内群最多的那次所建的模型就是我们所要求的解

[注]

不同问题对应的数学模型不同,因此在计算模型参数时方法必定不同,RANSAC的作用不在于计算模型参数,而是提供更好的输入数据(样本)。(这导致ransac的缺点在于要求数学模型已知)

问题

这里有几个问题:

  1. 一开始的时候我们要随机选择多少点(n)
  2. 以及要重复做多少次(k)

3.4 RANSAC的参数确定

  • 假设每个点是真正内群的概率为 w:
    w = 内群的数目/(内群数目+外群数目)
  • 通常我们不知道 w 是多少,
    • w^n是所选择的n个点都是内群的机率,
    • 1-w^n 是所选择的n个点至少有一个不是内群的机率,
    • (1 − w^n)^k 是表示重复 k 次都没有全部的n个点都是内群的机率,
    • 假设算法跑 k 次以后成功的机率是p,那么,
      • 1 − p = (1 − w^n)^k
      • p = 1 − (1 − w^n)^k
  • 我们可以通过P反算得到抽取次数K,K=log(1-P)/log(1-w^n)
  • 所以如果希望成功机率高:
    • 当n不变时,k越大,则p越大; 当w不变时,n越大,所需的k就越大。
    • 通常w未知,所以n 选小一点比较好。

3.5 RANSAC的应用

全景拼接

  • 流程
    1. 针对某个场景拍摄多张/序列图像
    2. 通过匹配特征(sift匹配)计算下一张图像与上一张图像之间的变换结构。
    3. 图像映射,将下一张图像叠加到上一张图像的坐标系中
    4. 变换后的融合/合成

7-2 OpenCV算法解析_第7张图片
7-2 OpenCV算法解析_第8张图片
7-2 OpenCV算法解析_第9张图片

3.6 RANSAC的优缺点

优点:

  1. 它能鲁棒的估计模型参数。
    • 例如,它能从包含大量局外点的数据集中估计出高精度的参数。

缺点:

  1. 它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。
  2. RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。
  3. 它要求设置跟问题相关的阀值。
  4. RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。
  5. 要求数学模型已知

4 图像相似度比较哈希算法

[注] 各位看官,这里的哈希不是sha256的哈希!同名而已

4.1 分类

相似图像搜索的哈希算法有三种:

  1. 均值哈希算法
  2. 差值哈希算法
  3. 感知哈希算法

4.2 汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

7-2 OpenCV算法解析_第10张图片

基本上:汉明距离若是小于5,则被认为是同一张图(不过不一定)

4.3 均值哈希算法

步骤

  1. 缩放:图片缩放为8*8,保留结构,除去细节。
  2. 灰度化:转换为灰度图。
  3. 求平均值:计算灰度图所有像素的平均值。
  4. 比较:像素值大于平均值记作1,相反记作0,总共64位。
  5. 生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。
  6. 对比指纹:将两幅图的指纹对比,计算汉明距离,即两个64位的hash值有多少位是不一样的,不相同位数越少,图片越相似。

4.4 差值哈希算法

  • 差值哈希算法相较于均值哈希算法,前期和后期基本相同,只有中间比较hash有变化。

步骤

  1. 缩放:图片缩放为 8*9,保留结构,除去细节。
  2. 灰度化:转换为灰度图。
  3. 比较:像素值大于后一个像素值记作1,相反记作0。本行不与下一行对比,每行9个像素,八个差值,有8行,总共64位
  4. 生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。
  5. 对比指纹:将两幅图的指纹对比,计算汉明距离,即两个64位的hash值有多少位是不一样的,不相同位数越少,图片越相似。

4.5 感知哈希算法

  • 均值哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是 **DCT(离散余弦变换)**来降低频率的方法。

步骤

  1. 缩小图片32 * 32 是一个较好的大小,这样方便DCT计算
  2. 转化为灰度图:把缩放后的图片转化为灰度图。
  3. 计算DCT:DCT把图片分离成分率的集合
  4. 缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表图片的最低频率。
  5. 计算平均值:计算缩小DCT后的所有像素点的平均值。
  6. 进一步减小DCT:大于平均值记录为1,反之记录为0.
  7. 得到信息指纹:组合64个信息位,顺序随意保持一致性。
  8. 最后比对两张图片的指纹,获得汉明距离即可。

4.6 三种算法的比较

  • aHash:均值哈希。速度比较快,但是常常不太精确。
  • pHash:感知哈希。精确度较高,但是速度方面较差一些。
  • dHash:差值哈希。精确度较高,且速度也非常快。

比较的是啥?

  • 均值哈希本质上是对 颜色 的比较;
  • 感知哈希由于做了 DCT 操作,本质上是对 频率 的比较;
  • 差值哈希本质上是基于渐变的感知哈希算法。

5 离散余弦变换DCT

5.1 什么是DCT

  • 离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。
  • DCT变换本身是无损的,同时,由于DCT变换是对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。
  • DCT变换在当前的图像分析以及压缩领域有着极为广大的用途,我们常见的JPEG静态图像编码以及MJPEG、MPEG动态编码等标准中都使用了DCT变换。

7-2 OpenCV算法解析_第11张图片

其中,

  • F(u,v)是输出的变换结果;
  • N为原始信号的点数。
  • f(i,j)是原图像中像素点(i,j)的像素值;
  • c(u), c(v)是DCT系数。

7-2 OpenCV算法解析_第12张图片

7-2 OpenCV算法解析_第13张图片

[应用举例]:
某个图象的一个8*8方块,的亮度值。 为了减少绝对值波动,先把数值移位一下,变成-128~127

7-2 OpenCV算法解析_第14张图片

  • 根据DCT变换公式,各种计算,获得临时结果

7-2 OpenCV算法解析_第15张图片

5.2 DCT 应用

简介DCT在 JPEG压缩编码 中的应用:

  • JPEG(Joint Photographic Experts Group) 专家组开发了两种基本的压缩算法,
    • 一种是采用以离散余弦变换(DCT)为基础的有损压缩算法,
    • 另一种是采用以预测技术为基础的无损压缩算法。
  • 使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。
    7-2 OpenCV算法解析_第16张图片

DCT在数字水印(digital watermarking)技术中的应用:

  • 数字水印技术 是 将特定的信息嵌入到数字信息的内容中,要求嵌入的信息不能被轻易的去除,且在一定的条件下可以被提取出来,以确认作者的版权。

7-2 OpenCV算法解析_第17张图片

你可能感兴趣的:(AI)