1.OpenCV
- 是一个开源的计算机视觉库;
- 用c语言和C++编写,并进行了深度优化,可多线程处理;
- 可以在windows\Linux\Mac OS X上运行;
- 目前在开发Python\java\Matlab语言版本及接口;
- 用于高效的计算,强调实时应用的开发;
- 目标是提供易于使用的计算机视觉接口;
- 该库含有大约500多个函数;
- 包括:产品质量检验\医学图像处理\安保领域\交互操作\相机矫正\双目视觉\机器人学;
OpenCV大坑
- OpenCV读进来的图片通过排列为BGR,不是主流的RGB!
- PIL读入的图片是img类型,其他库读进来的都是numpy矩阵;
- 各大图库的性能,最好的是OpenCV;
OpenCV常见算法
- 图像基本操作:读取\显示\存储:cv2.imread(),cv2.imshow(),cv2.write();
- 将彩色像素转换为灰度像素;
- 图像的几何变换:平移\缩放\旋转\插值(最邻近\双线性);
- 对比增强:线性变换\伽玛变换\直方图均衡化;
- 边缘检测:Sobel\Canny;
- 图像的二维滤波:cvFilter2D;
2.最小二乘法
什么是线性回归
- 举例说明:
- 某产品的利润在售价为2元\5元\10元时分别为4元\10元\20元;
- 商品的利润与售价的关系符合直线:y=2x;
- 上述关系中,"2"称为回归系数,即斜率;
- 回归系数表示商品的售价x变动一个单位时,利润y与之对应的变动关系;
- 线性回归表示离散点总体上"最逼近"哪条直线;
最小二乘法(Least Square Method)
- 通过最小化误差的平方和;寻找最佳匹配函数;
- 利用最小二乘法可方便求出未知数据;
- 并使得这些数据与实际数据之间的误差平方和最小;
- 假设一系列数据点
;
- 我们给定的拟合函数为h(x),h(x)对xi的估计量为:
;
- 残差为:
三种范数
-范数:残差绝对值的最大值:
;
- 1-范数:绝对残差之和:
;
- 2-范数:残差平方和:
;
拟合程度
- 通俗的将,就是拟合函数h(x)与待求函数y之间的相似性;
- 2-范数越小,相似性越高;
最小二乘法定义
;
- 这是一个无约束最优化的问题;
- 分别对k和b求偏导,令偏导数为0,可得极值点;
;
3.RANSAC
- 随机采样一致性(random sample consensus);
- RANSAC是一种思想;
- 一个求解已知模型的参数的框架;
- 不限定某一特定问题;
- 可以是计算机视觉的问题,
- 也可以是统计数学,甚至是经济学领域的模型参数估计的问题;
- 是一种迭代的方法;
- 在一组含离群被观测数据中估算数学模型的参数;
- 是一个非确定性的算法;
- 会产生一个在一定概率下的合理结果;
- 允许使用多次的迭代增加其概率;
- 基本假设为:"内群"数据可以通过几组模型参数表示其数据分布;
- "离群"数据不适合模型化;
- 数据受到噪声(指的是"离群"数据)的影响;
- 假定给定一组"内群"(通常很小);
- 存在一个程序;
- 可以估算最佳解释或
- 最适用这一数据的模型的参数;
RANSAC与最小二乘法
- 生产实践中的数据往往都会有一定偏差;
- 我们猜测两个变量x和y具有一定的线性关系:
;
- 最小二乘法通过计算关于a和b的最小均方差的偏导数为零的值;
- 很多情况下,最小二乘法都是线性回归属性;
- 但遗憾的是,最小二乘法只适合误差较小的情况;
- RANSAC在模型确定及最大迭代次数的允许下,总能找到最优解;
- 对含有80%误差的数据集,RANSAC的效果远优于最小二乘法;
- 最小二乘法对一张图片中的大量像素点,计算速度慢;
RANSAC计算步骤
- 输入一组观测数据(含有较大的噪声点或无效点);
- 输入一个用于解释观测数据的参数化模型,比如y=ax+b
- 输入一些可信的参数;
- 在数据中随机选择几个点设定为内群;
- 计算适合内群的模型:y=ax+b-->y=2x+6,...
- 把没有选定为内群的点带入模型中验证;
- 计算这些点是否为内群点;
- 记录下内群数量;
- 重复上述步骤;
- 比较哪次计算中内群数量最多;
- 内群最多的模型就是所求解;
几个问题
- 不同的数学模型,计算模型参数的方法不同;
- RANSAC的作用不在于计算模型参数;
- 模型需要已知;
- 开始的时候选择多少随机点(n)?
- 重复多少次(K)?
RANSAC参数确定
- 假定每个点为内群的概率w:
- w=内群的数目/(内群数目+外群数目);
- 通常不知道w的值;
是选择的n各点都是内群的概率;
是所选n个点至少有一个不是内群的概率;
表示重复k次都没有全部n个点都是内群的概率;
- 算法运行k次以后成功的概率为p:
- 通过p可反算得到重复次数k;
;
- 当n不变,k越大,p越大;
- 当w不变,n越大,k越大;
- 通常w未知,n选小一点较好.
RANSAC优缺点
- 优点:
- 能鲁棒的估计模型参数;
- 缺点
- 参数计算的迭代次数无上限;
- 设置了上限,可能得不到最优的结果;
- 只有一定的概率得到可信的模型.概率与迭代次数成正比;
- 要求设置同问题相关的阈值;
- 只能从特定数据集中估计出一个模型;
- 存在多个模型的化,RANSAC不能找到;
- 要求数学模型已知;
4.哈希算法
- 解决图像相似度的度量问题;
哈希算法的种类
- 哈希算法是一类算法的总称;
- 共有三种
- 均值哈希算法aHash;
- 差值哈希算法dHash;
- 感知哈希算法pHash;
什么是哈希(Hash)
- 散列函数或散列算法又称哈希函数:Hash Function;
- 一种从任何一种数据中创建小的数字"指纹"的方法;
- 散列函数把消息或数据压缩成摘要;
- 使数据量变小,将数据的格式固定;
- 将数据打乱混合,重新创建一个散列值(hash values,hash codes,hash sums或hashes)的指纹;
- 散列之通常用一个短的随机字母和数字组成的字符串表示;
- 哈希算法将得到的任意长度的二进制值映射为较短的固定长度的二进制值,即哈希值;
- 哈希值是一段数据唯一且极其紧凑的数值表示形式;
- 更改一段明文的任意一个字母,得到的哈希值都不相同;
- 哈希算法是一个函数;
- 能够把几乎所有数字文件转换为一串数字和字母构成的看似混乱的字符串;
- 哈希函数是一种加密函数;
作为加密函数,哈希函数的两个特点
- 不可逆性;从输出的字符串反推输入非常非常难;
- 唯一性和不可预测性:输入信息的点点区别,哈希算法的输出值相差甚远;
汉明距离
- 两个整数之间的汉明距离为两个数字对应二进制不同位置的数目;
均值哈希算法步骤
- 缩放:图片缩放为8x8,保留结构,去除细节;
- 灰度化:图片转为灰度图
- 求均值:计算所有像素的平均值;
- 比较:像素值大于均值,记为1,否则记为0,共计64位;
- 生成hash:按顺序组合第4步的1和0,即为图片指纹(hash);
- 对比指纹:对比两个指纹,计算汉明距离;
- 汉明距离越近,图片越相似;
差值哈希算法步骤
- 同均值哈希相比,只有中间比较hash有变化;
- 步骤:
- 图片缩放为8*9,保留结构,去除细节;
- 转化为灰度图;
- 像素值大于后一个像素值记作1,相反记作0;
- 本行不与下一行对比;
- 每行9个像素,8个差值,共计64位;
- 将上述步骤生成的1和0按顺序组合,即为图片指纹;
- 将两图对比汉明距离;
- 不相同位数越少,图片越相似.
感知哈希算法步骤
- 缩放图片为32x32大小;
- 转化为灰度图;
- 计算DCT(把图片分离成分率的集合);
- 缩小DCT,保留左上角的8*8;
- 这些代表图片的最低频率;
- 计算缩小DCT后的所有像素平均值;
- 进一步缩小DCT,大于均值记为1,反之记为0;
- 顺序组合上述结果,得到64位指纹;
- 计算汉明距离;
三种哈希算法比较
- aHash均值哈希:速度较快,过于严格,不够精确
- pHash感知哈希:精度较高,速度较差;
- dHash差值哈希:精度较高,速度非常快;
5.拓展-DCT
- 离散余弦变换(Discrete Cosine Transform):
- 主要用于数据或图像的压缩;
- 将空域信号转换到频域上;
- 良好的去相关性的能力;
- DCT变换本身为无损变换;
- DCT变换为对称变换;
- 可利用DCT反变换恢复原始图像;
- 在图像分析与压缩领域用途极为广大;
- JPEG静态图像编码及MJPEG\MPEG动态编码标准中都使用了DCT变换.
公式
- 其中:
是输出的变换结果;
- N为原始信号的点数;
- f(i,j)是原图像中像素点(i,j)的像素值;
是DCT系数;
;
- 应用举例:
- 某图像的一个8x8方块的亮度值;
- 为了减少绝对值波动,数值移位,变成-128~127;
- 经过DCT变换公式,经计算,临时结果为:
DCT在JPEG压缩编码中的应用
- JPEG(Joint Photographic Experts Group)
- 两种基本的压缩方法:
- 采用DCT为基础的有损压缩算法;
- 以预测为基础的无损压缩算法;
- 有损压缩,压缩比为25:1时;
- 还原后的图像与原始图像,非图像专家难以分辨;
- 得到广泛的应用;
DCT在数字水印(digital watermarking)技术中的应用
- 数字水印技术将特定信息嵌入到数字信息内容中;
- 要求嵌入的信息不能被轻易的除去;
- 在一定的条件下可以被提取出来;