计算机视觉 - 理论入门
- 前言
- 一,导论:
- 二,卷积:
- 图像去噪:
- 常值卷积:
- 高斯卷积:
- 椒盐去噪:
- 锐化程度:
- 三,边缘检测:
- 图像信号导数:
- 求导算子:
- 图像梯度:
- 提取边缘:
- canny算法:
- 四,拟合:
- 最小二乘法:
- y方向:
- 全方向:
- 极大似然估计思想:
- Robust 最小二乘:
- RANSAC:
- 自适应:
- 指纹识别:
- 霍夫变换:
- 投票策略:
- 直线确定:
- 调整网格适应噪声:
- Canny梯度投票:
- 霍夫圆:
- SNAKE:
- 五、角点:
- 全景图片:
- 基础检测:
- 泰勒展开:
- 边和角点区分:
- Harris角点检测方法:
- 不变和协变:
- 优缺点:
- 六,Blob:
- 拉普拉斯衰减:
- 拉普拉斯多尺度检测:
- 非最大化抑制:
- 优缺点:
- SIFT特征:
- 拉普拉斯和Blob区别:
- 自适应椭圆仿射协变-尺度不变性
- SIFT图像匹配系统:
- 七,纹理分割分类:
- 砖墙纹理分类:
- 自适应窗口大小:
- 多维高斯:
- 按照纹理分类图片任务:
- 八,分割:
- 基本分割法:
- K-means优缺:
- mean shift重心漂移法:
- Normalization Cut方法:
- 九,识别(分类+检测):
- 先验后验:
- 识别:
- 词袋模型:
- 空间金字塔:
- 后记:
前言
Vue框架:
从项目学Vue
OJ算法系列:
神机百炼 - 算法详解
Linux操作系统:
风后奇门 - linux
C++11:
通天箓 - C++11
Python常用模块:
通天箓 - python
计算机视觉系列博客分两条主线:算法理论 + opencv实操
理论来源于[计算机视觉(本科) 北京邮电大学 鲁鹏 清晰完整合集](https://www.bilibili.com/video/BV1nz4y197Qv/?spm_id_from=333.337.search-card.all.click&vd_source=78f225f12090c7d6b26a7d94b5887157)
实操将以kaggle具体比赛为例讲解opencv以及神经网络
一,导论:
-
人类视觉:
image / video -> 虹膜采集光 -> 视网膜成像 -> 传递到大脑 -> 解析看到的相
优点:利于分辨,150ms分辨是否动物
缺点:不利于动态视觉,多种语义分割,错觉感知(克林顿、静态图在动、同一个颜色)
计算机视觉:
image / video -> ccd / cmod成像 -> 计算机分析
-
CV目的:
通过像素了解真实含义(语义鸿沟)
图像给我们的信息:(两大研究方向)
- 3D还原
- 语义信息
-
历史线:
- 1950S,Hubel & Wiesel发现猫在看到简单图形后大脑皮层神经元开始活跃
- 1960S,MIT明斯基留作业用AI推理完成视觉系统
- David Marr为CV分为三层:
- 干什么,又什么约束
- 如何表示输入、输出、计算、特征。用什么算法去处理输入。
- 如何用硬件加速运算、硬件又对算法和表示提出了什么要求。
-
应用:
电影特效、3D重建、人脸检测、虹膜识别、指纹识别、自动驾驶、行人检测、虚拟现实、天气识别、
二,卷积:
图像去噪:
- 图像分类:
- 单bit二进制:0黑 1白
- 单Byte灰度图:255亮 0暗
- 三ByteRGB图:3通道
- 噪声分类:
- 胡椒噪声:点有黑有白
- 脉冲噪声:白点
- 高斯噪声:服从高斯分布的随机干扰,可以看为是理想图上每个点加一个高斯函数上点
- 去噪原理:像素邻域的加权平均值替换每个像素
常值卷积:
-
卷积核/滤波核:每个点的权值
如:权重相等的k=1/9 & [[1,1,1],[1,1,1],[1,1,1]]是平均卷
-
卷积操作:每个点的3*3矩阵翻转后乘像素值,加和赋值
m-k n-l 表示翻转后对应 k l
-
卷积操作的性质:
-
线性:
-
偏移不变:
-
交换:
-
结合:
-
分配:
-
实数乘积:
-
脉冲不变:
-
-
填充padding:
四个边的点缺失了邻居,无法卷积,需要padding。
五种填充方式:填0 填1 环状填原图 拉伸边 镜像边。防止卷积几次之后图像消失
-
卷积核大赏:
-
原图:[[0,0,0],[0,1,0],[0,0,0]]
-
左移:[[0,0,0],[0,0,1],[0,0,0]]
-
下移:[[0,1,0],[0,0,0],[0,0,0]]
-
均值平滑/去噪:k=1/9 & [[1,1,1],[1,1,1],[1,1,1]]
-
锐化:[[0,0,0],[0,2,0],[0,0,0]] - k=1/9 & [[1,1,1],[1,1,1],[1,1,1]]
原图i*卷积核e - 均值平滑/去噪i*卷积核g = 边缘图
原图 + 边缘图i*卷积核e = 锐化i*(2e - g)
-
-
均值卷积的问题:振铃模糊效果
高斯卷积:
- 高斯函数:近者权值大、远者权值小
-
几何意义:
- 3D效果:中间突、周围平
- 2D效果:中间白、周围黑
- 数组归一化效果:中间值大,周围小
-
高斯卷积核两个参数:
-
窗框:3*3 还是 5*5,越大每个点的权值越小,太大了就都是0
-
方差σ:越小则越尖锐,越大则越缓和
-
高斯卷积核的窗框和方差固定关系:
h = 3 σ + 1 + 3 σ w = 3 σ + 1 + 3 σ h = 3σ + 1 + 3σ \\ w = 3σ + 1 + 3σ h=3σ+1+3σw=3σ+1+3σ
-
-
高斯核卷积勾股定理:
两次直角边σ做高斯卷积 = 一次斜边σ’做高斯卷积
σ 斜边长 2 = σ 直角边长 2 + σ 直角边长 2 σ_{斜边长}^ 2 = σ_{直角边长}^2 + σ_{直角边长}^2 σ斜边长2=σ直角边长2+σ直角边长2
-
高斯核分解:分为x & y方向分别高斯
-
高斯核分解的应用:降低时间复杂度,大核可以用两次小核模拟
m*m的卷积核 对 n*n的图像 卷积:原本时间复杂度:O(n^2 * m^2),现在( n^2 * m)
-
高斯噪声:高斯噪声模型本身含有σ,噪声的σ越大,想要消除噪声的高斯核所需σ和窗宽越大,但是同时边缘也会被模糊的越大
椒盐去噪:
-
中值滤波器:本身没有固定权值,每到一个图像,将窗框内所有像素值从大到小排序(非线性),选取中位数直接放到当前点上,不管重复:但是乘法求和是线性的
-
中值非平均的优缺点:
- 一般比均值靠谱:不受极端值(椒盐)的影响
- 窗框比较大时,中值其实和当前点关系不大,导致图像比均值模糊
锐化程度:
-
α == 1:
锐化:[[0,0,0],[0,2,0],[0,0,0]] - k=1/9 & [[1,1,1],[1,1,1],[1,1,1]]
原图i*卷积核e - 均值平滑/去噪i*卷积核g = 边缘图原图 + 边缘图i*卷积核e = 锐化i*卷积核(2e - g)
-
α刻画锐化程度:
-
最后的结果又称为拉普拉斯高斯,高低都比原本高斯大且尖锐
三,边缘检测:
-
边缘的定义:边缘是图像强度函数中快速变化的地方,图像中的大多数语义和形状信息都可以编码在边缘中。
-
边缘4种分类:表面不连续,深度不连续,表面颜色不连续,光照不连续
-
边缘的信号描述:白色是255,值高于黑色的0,信号函数突变的地方就是边缘,对于突变的描述可以使用一阶导数
图像信号导数:
-
图像x方向导数公式:
将趋于0的变量直接置为1,得到CV中的导数公式:
一点(x,y)的水平导数 = - 该点像素值 + 右边点像素值 (-1,1)
X方向的导数(-1,1)可以检测纵向的边缘
-
Y方向的导数(-1,1)或者(1,-1)可以检测横向的边缘
求导算子:
-
典型:-1, 1
-
Prewitt算子:
Mx = [[-1,0,1],[-1,0,1],[-1,0,1]]
My = [[1,1,1], [0,0,0], [-1,-1,-1]]
-
Sobel算子:对噪声敏感更低
Mx = [[-1,0,1], [-2,0,2], [-1,0,1]]
可以拆分为[1,2,1] * [-1,0,1],相等于先平滑去噪声,再求边缘
My = [[1,2,1], [0,0,0], [-1,-2,-1]]
可以拆分为[1,2,1] * [-1,0,1]
-
Roberts算子:斜边
Mx = [[0, 1], [-1, 0]]
My = [[1, 0], [0, -1]]
图像梯度:
-
梯度指向强度增加最快的方向,而且竖纹横梯度,横纹竖梯度
-
梯度计算公式:
-
梯度大小公式:
-
梯度方向公式:
-
表示边缘常常使用X导数卷积和Y导数卷积结果,化为梯度导数结果进行表示
提取边缘:
-
去噪声:噪声使得图像信号持续微小震荡,直接求梯度发现处处梯度变化剧烈,到处都是边,所以需要先去噪,采用高斯滤波(padding之后避免值消失)
-
导数算子进行卷积。
-
用卷积的结合律可以减少时间复杂度:
- 对高斯核进行求导(导数算子卷积)
- 导后高斯核对图像进行卷积
-
高斯偏导模板:高斯核进行求导
同样随着σ变化,获得的边越来越粗狂,可以按照自己的需求选择σ
虽然高斯核类似于softmax全员正数,但是高斯偏导核有着负数
高斯核元素求和是1,但是高斯偏导核元素求和是0(没边不能检测出边)
canny算法:
-
先看传统算法的优劣:
-
高斯模糊去噪(导致边变粗)
-
直接求每个点的梯度模值:
对每个点X方向(-1,1)卷积,对每个点Y方向(-1,1)卷积
卷积结果平方和开方得到该点梯度值
-
设定噪声识别阈值:
梯度值低于阈值的点被识别为噪声,删除(设为0)
这个操作会有两个问题:
导致过滤得到的点都被认为是边,从而加宽了边
门限设置的不恰当导致删除了很多实际边,或者噪声出来了很多假边
Canny算法采用了双门限:先用高门限确定真边,然后降低门限增加弱边缘。且假设所有的真弱边都和强边相连,所以就算噪声通过了低门限,但是不与强边连接时也被删除。
-
非最大化抑制:细化边缘
一个点和梯度方向的邻居比较梯度值,仅留下梯度最大者
如果梯度方向不是整数,这个方向没有邻居,那就用线性插值造一个邻居
-
-
Canny算法过程:
- 高斯模糊去噪
- 计算梯度大小方向
- 利用方向进行非最大化抑制找细边
- 利用大小进行双门限相连过滤噪声边
四,拟合:
- 提取边缘后,利用边缘拟合一些形状,进而更好的分析这些形状,比如拟合得到了圆形,那么可以知道圆心位置
- 拟合遇到的困难:
- 噪声,本来属于线上的点现在被认为不在线上
- 外部点,本来不在线上的点可能被误认为在线上
- 丢失信息:遮挡
最小二乘法:
- 一旦线外点参与,则最后拟合线和真实线差距非常大
y方向:
-
我们知道哪些点在线上时(所有点都是线上点),采用最小二乘法拟合线,求线条y=mx+b的m & b
-
y方向能量函数E的定义和计算:所有点到线的偏移
-
y方向对m和b求导,找到E的最小值:
-
缺点:(疑水平直线没有y,x和y没有关系,不能求解水平直线)
而且垂直直线y-y’恒为0,也不能求解垂直直线
对于摄像机旋转带来的线条角度变化不能应对
全方向:
-
求线条ax + by = d的a & b & d
-
全方向能量函数E的定义和计算:所有点到直线的偏移
-
先解决极值点的d:
-
然后求a b,对N矩阵求导:
极大似然估计思想:
Robust 最小二乘:
-
有外点,ρ函数规定多远的外点就不予考虑:
-
σ太小则所有点对直线的贡献都差不多
σ太大则和最小二乘差不多,近者权值大,远者权值小
-
由于ρ函数非线性,所以不能求导等手段求最小值,需要使用随机梯度下降等等下降法
RANSAC:
-
外点较多,甚至有很多外部线
-
如下四步:
- 随机均匀地选择两个点
- 基于两点拟合出一条直线
- 所有其他点计算自己到直线距离,设定一个阈值k,距离小于k视为在线上,反之不在。
- 多次执行此操作并选择在线上点最多的线
-
多次执行采样数N,大概需要几次的计算方法:
s点数是由模型固定,p正常概率和e外点率都是指定
e表明是说不在线上点的概率,其实是说在线上点的概率
-
上式中e很难人为指定,对数据集很有信心就设高点,没有信心就低点,但是对数据集不清楚的时候,可以采用自适应的RANSAC方法:
自适应:
-
自适应过程:
-
N=+∞,sample_count =0
-
While N > sample_count:
选择样本拟合直线,计算线上点的数量
set 外点率e = 1- (线上点的数量)/(总点数)
从e重新计算N:N=log(1-p)/log(1-(1-e)^s)
将sample_count增加1
-
-
如果某一次迭代的N=100,当前N是150,那就再迭代50次
-
如果某一次迭代的N=100,当前N是120,那就结束
-
优缺点:
- 简单和通用
- 适用于许多不同的问题
- 在实践中工作得很好
- 但是很多参数需要调
- 不太适合低的初始比率,导致太多的迭代,或者可能完全失败
- 不能总是得到一个基于最小样本数的良好的初始化模型
-
搭配最小二乘法:
RANSAC找到的线仅仅基于两个点和给定的距离阈值,可以说拟合的直线在这个范围内,但是大概率不是当前这条线。
当找到所有内点后,使用全方向的最小二乘法找到的直线更接近所有点
指纹识别:
-
仿射变换:找到不同图片中的特殊点之后需要将他们对应起来
六个参数需要三对点构成三个方程,3个x和3个y
-
先随机找三对对应点,用剩下的点为构建的abcdef矩阵投票,最终得到一个可以满足最多对应的abcdef矩阵
-
不同的指纹和目标指纹都构建最优的abcdef矩阵,分别用各自的最优矩阵查看含有多少个对应点
霍夫变换:
- 适用情况:有很多外部线
投票策略:
-
让每个特征为所有与其兼容的模型投票,
希望噪声特征不会一致地投票给任何一个模型,
只要有足够的特征剩余,不要遮挡太多,就可以达成一个好的模型
-
初始投票方法:
- 离散的选取有限个a和b,每个构成一个格子
- 直线y = ax + b,其中a b都固定,只能给参数空间贡献一个点(a,b),投票给(a,b)格子
- 一个点的a b都不固定,为参数空间贡献一条直线,投票给很多格子。两个点投票直线的交点是两点构成的直线。
-
初始投票的缺点:ab参数本身无限,且垂直直线需要无限个a
-
极坐标投票法:
-
θ∈(0, 180),且垂直直线也可以表达为θ=90
-
ρ可以求出来:
-
-
梯度改进法:使用梯度的模和梯度方向为其投票
直线确定:
-
哪个格子的得票数最多,则这个格子对应的直线是目标直线
-
对于正方形则明显投票给了四个点(最亮),代表四条直线
对于圆形则明显没有达成一致的点,只是在一个范围内有一条带子
调整网格适应噪声:
- 噪声使得原本完好的点投票范围超出网格,有一种解决方法,即增加一格的宽度,适应更大的范围
- 但是,网格划分太宽则误认为多条线是一条线,网格划分太窄则每一格内投票数都太少,甚至不超过阈值
- 软投票:为了解决太窄而投票数太少的问题,每给一点投票,为其周围点也由近及远的投点点票
Canny梯度投票:
-
当我们使用Canny检测一个边缘点时,我们也知道它的梯度方向,这意味着点投票到的线是唯一确定的
-
修正霍夫变换:
对于每个边缘点(x,y)
θ=(x,y)上的梯度方向
ρ=x cos θ+ysin θ
H(θ, ρ) = H(θ, ρ) +1
霍夫圆:
-
圆三个参数:(x-a)^2 + (y-b)^2 = r^2,所以投票空间是三维
-
给定圆上一个点(x,y),直接在XOYOR空间确定一个R=0的点
因为圆弧梯度方向固定,所以圆形要么沿着梯度,要么背离梯度,每次确定圆半径后为两个点分别投出圆心票:
圆心票数最多的点(x,y,r)就是圆心,也就知道的圆的形状
SNAKE:
- 有遮挡,不确定这里是不是该有一条线
五、角点:
- 特征点用于:图像对齐、三维重建、运动跟踪、机器人导航、索引和数据库检索、物体识别
全景图片:
- 步骤1:提取特征步骤 2:匹配特征步骤 3:对齐图像
- 第一步:四个要求:
- 可重复性尽管进行了几何和光度变换,但在几幅图像中可以发现相同的特征。
- 每个特征都是独特的。
- 紧凑和高效,最好提取的特征比图像像素少得多
- 特征占据图像相对较小的面积;抗杂波和遮挡。全图即使是同一点差异也因为旋转平移而很大。
- 第二步:匹配特征同自适用RANSAC指纹匹配
基础检测:
-
角点满足第一步的四个要求,且角落附近的区域,图像梯度有两个或两个以上的主导方向,且独特而可重复
-
角点检测的基础方法:
小窗口在任何方向移动,窗口内都会产生很大的强度变化
移动[u,v]时窗口w(x,y)的外观变化:
E(u,v) = ∑w(x,y)·[I(x+u, y+v) - I(x,y)]^2,I表示Image本身,w(x,y)也是中心大而周围小
泰勒展开:
-
在(0,0)二维展开:
-
只取一阶导数:
两个λ都不趋于0,才是角点
-
λ的影响:
边和角点区分:
-
直接λ:
-
det公式法:
Harris角点检测方法:
-
可以解决光照、平移、旋转
-
PPT:
- 计算每个像素处的高斯导数
- 计算每个像素周围高斯窗口内的秒矩矩阵M
- 计算拐角响应函数R
- 设定阈值R
- 找到响应函数的局部最大值(非最大值抑制)
-
用于检测图像中的角点(corner),即两条边缘交汇处的像素点,步骤:
-
图像预处理:首先,将输入图像转换为灰度图像。
-
计算图像每个像素处的高斯梯度:使用一种梯度计算方法(如Sobel算子)计算图像在水平和垂直方向上的梯度。这可以帮助我们捕捉图像中的边缘。
-
计算每个像素周围高斯窗口内的秒矩矩阵M:对于每个像素点,使用计算得到的梯度信息来计算结构张量秒矩矩阵,它是一个2x2的矩阵,用来描述该像素点周围区域的梯度分布情况。
-
计算角点响应函数:通过计算结构张量的特征值(特征值代表梯度的变化程度)来评估每个像素点的角点特性。Harris角点检测使用以下角点响应函数:
R = det(M) - k * trace(M)^2
其中,det(M)表示结构张量的行列式,trace(M)表示结构张量的迹(即主对角线上元素的和),k是一个经验参数(通常取值为0.04 - 0.06),用于调整响应函数的敏感度。
-
阈值处理:根据计算得到的角点响应函数,对每个像素点进行阈值处理,将响应函数大于设定阈值的像素点标记为角点候选点。
-
非极大值抑制:在角点候选点,也就是所有找到的响应函数局部最大值中,对相邻的像素点进行非极大值抑制,只保留响应函数最大的像素点作为最终的角点。
-
显示角点:根据检测到的角点坐标,在原始图像上标记出检测到的角点位置。
-
不变和协变:
-
不变性invariance:变换后的图像角点位置不改变。
F(T(img)) = F(img)
-
协方差covariance:如果同一图像有两个变换后的版本,应该在对应的位置检测特征
F(T(img)) = T’(F(img))
优缺点:
- Harris角点检测算法通过计算像素点周围区域的梯度分布和角点特性来鉴别角点,它在计算速度和检测准确性上都有较好的表现。
- 然而,Harris没有尺度特性,变换大小、形状时,一个是R值随之变化,可能超过阈值,部分变后还不超过阈值的是invariance;另一个是角的位置不协变缩放。比如角的边缘非常粗的时候就不能提取出来角点。
六,Blob:
-
目标:在同一幅图像的缩放版本中独立检测对应的区域需要尺度选择机制来寻找与图像变换协变的特征区域大小。
-
高斯二阶导零点:
边缘是图像变化剧烈的地方,则高斯一阶导的极值,对应高斯二阶导过零点(不是一直处于零点的地方):
拉普拉斯衰减:
-
拉普拉斯核:随着图像内方差σ越大,衰减越剧烈:
拉普拉斯多尺度检测:
-
为卷积乘σ^2,使得信号不衰减:给定图像后计算得到方差σ,到拉普拉斯中算出圆半径
-
高斯拉普拉斯算子:用于二维斑点检测的圆对称算子
-
拉普拉斯函数对半径为r的二元圆的最大响应是多少?为了得到最大的响应,拉普拉斯函数的零点必须与圆对齐
因此,最大响应出现在σ=r/√2处。
-
也就是说,当找到最大响应时,将此时的σ乘√2 = r
-
步骤:
- 图像预处理:首先,将输入图像转换为灰度图像
- 计算拉普拉斯算子:应用拉普拉斯算子(通常使用离散的二阶导数操作)来计算图像的拉普拉斯变换。离散的二阶导数操作可以通过使用拉普拉斯模板(如3x3的模板)来实现,该模板包含正中心像素和其周围8个邻居像素的权重。通过对图像中的每个像素应用拉普拉斯算子,可以得到一个与原始图像尺寸相同的拉普拉斯图像。
- 边缘检测:在拉普拉斯图像中,通过寻找像素值的极值点来检测边缘。一般来说,正值极值点表示从亮到暗的边缘,负值极值点表示从暗到亮的边缘。可以通过设置一个阈值来确定哪些极值点被认为是边缘。
- 强边缘增强:为了增强边缘的显示,可以对检测到的边缘进行增强处理。这可以通过将边缘像素的灰度值设置为最大值(通常是255)来实现,同时将非边缘像素的灰度值设置为最小值(通常是0)。
- 显示结果:将增强后的边缘图像显示出来,以便可视化边缘和显著变化区域。
拉普拉斯检测是一种简单而有效的边缘检测方法,特别适用于对图像中细节和纹理的检测。然而,由于离散二阶导数对噪声敏感,拉普拉斯检测可能会受到噪声的干扰,产生不稳定的边缘结果。因此,在实际应用中,通常会与其他图像处理技术(如高斯滤波)结合使用,以提高边缘检测的质量和稳定性。
非最大化抑制:
-
一个点除了和不同σ下的同一位置的比较响应,还要和同σ下相邻位置的点做比较,这样其实是在选择圆心,重新画圆
优缺点:
- 优点是可以找到的圆很全
- 缺点是图像越大,高斯核越大,高斯核一阶导越大,高斯核二阶导越大,计算量越大
- 改进:只针对harris角点做圆,或者直接用SIFT特征
SIFT特征:
-
求高斯函数在空间和尺度上的差异的局部最大值
-
DOG函数:不需要二阶导,两次高斯核卷积做差即可,且效果接近拉普拉斯核
-
而且两次卷积可以先用σ高斯核卷后,继续用((kσ)^2 - σ^2)开方得到kσ卷积结果,且两次卷积因为窗框都是2σ+1,所以窗框小了 计算量都比直接kσ卷积计算量小
-
且可以对图像进行放缩,最后在放缩中检测的圆R和不放缩中检测的圆R差异就是放缩倍数。
这里的放缩其实在图像中直接隔点采样即可
-
使用5个不同σ对图像进行卷积的结果做差,可以得到4张等效拉普拉斯卷积图,在四张拉普拉斯卷积图中,每三张进行一次非最大化抑制,得到一个合适的σ,一共得到了两个σ。
总结目标准备输出s个合适的σ时,k离散地进行取值,离散间隔为k = 2^(1/s)
拉普拉斯和Blob区别:
- 拉普拉斯(blob)响应是不变的,旋转和缩放
- blob位置和缩放,协变,旋转和缩放
- 强度变化呢?
自适应椭圆仿射协变-尺度不变性
-
仿射变换近似于大致平面物体和大致正射影相机的视点变化
-
要做到自适应椭圆可以借助harris角点检测工具:
-
找到SIFT或者拉普拉斯构建的圆,找到圆中像素梯度变化最剧烈的两个方向,沿着梯度方向改变圆半径,直到两个方向梯度变化一样,得到λ1=λ2的椭圆,此时椭圆内角度不同
-
分格子投票,每个格子内梯度方向投一个角度,统计最多得票的角度,将椭圆内角度扭转到此
-
不依靠强度判别图像相似度,如白天和晚上照片光阴强度差异很大。继续投票,每个小格子内给自己梯度方向投票:
-
按照投票将SIFT区域序列化:16个格子 * 每个里面8个方向的票数 = 128位,比较SIFT椭圆内的128位序列就能知道相似度。(小格投票可以防止误识别我爱中国和爱我中国一样,我!=爱)
SIFT图像匹配系统:
-
创建高斯差分金字塔-用于模拟观察者距离物体的远近程度及模糊程度:
- 对图像进行方差不同的高斯卷积,得到多个图像,作为第一层
- 对第一层图像分别进行隔点采样,进行方差为2σ的高斯卷积。隔点采样的目的是减小图片尺度
- 如上进行几次迭代,得到几层的高斯金字塔,每层有几个不同方差卷积得到的图片
- 金字塔的同一层之间,相邻的两个图片做差,得到高斯差分金字塔(Difference of Gaussian,DOG)
-
关键点位置确定:
- 阈值化:在DOG中设定一个阈值来过滤掉低对比度的特征点
- 在高斯差分金字塔中寻找极值:比较像素点与其8邻域的像素值,确定极值
- 由于差分金字塔不是连续的。使用泰勒展开更精确的寻找极值点
- 舍去低对比度的点(可能为噪声)
- 边缘效应去除:计算点的梯度,放入方向直方图中,若某点主导方向和边缘方向夹角小,则被认为边缘上的点,会被舍弃
-
关键点方向分配:
- 构建梯度直方图:邻域划分为16个子区域,计算每个点梯度幅值和方向
- 主导方向选择:从梯度直方图中找出具有最大梯度幅值的主导方向
- 创建关键点描述子:在确定关键点的主导方向后,将关键点周围的邻域划分为子区域,并计算每个子区域内的梯度方向直方图。将所有子区域的特征向量连接起来形成关键点的描述子
-
特征点匹配:
使用关键点的描述子,使用特征点之间的欧氏距离或相似度度量来找到最佳匹配对
如果和第一张图片对应点相似度明显高于和第二张图片对应点的相似度,那么视为有效对应点。反之,如果第一张图片对应点相似度和第二张图片差异不大,那么这个特征点有可能出错,就不参与判断过程。
七,纹理分割分类:
- 纹理的作用:
- 从纹理中提取形状:从图像纹理中估计表面方向或形状从纹理线索中
- 分割/分类分析,表示纹理将纹理一致的图像区域分组
- 合成:生成新的纹理补丁/图像给出一些例子
- 对感知的重要性:
- 通常材料属性的指示可能是重要的外观线索,特别是当物体的形状相似时。
- 目的是区分形状、边界和纹理。
砖墙纹理分类:
-
步骤:
- 用[-1, 1]卷积得到竖纹,用上下卷积核[-1,1]卷积得到横纹
- 用小窗口开始滑动,统计每个小窗内平均水平梯度值和平均竖直梯度值。竖纹水平梯度大,横纹竖直梯度大。
- 对所有窗口内内容进行knn或者kmeans聚类,可以对纹理进行分类
-
定义两个点之间的距离:
-
上述方法的两个缺点:
- Knn 或 K-means的前提假设:我们知道纹理大概多大,从而选择了合适大小的小窗窗口大小。但是对于斑马这样身体纹理巨大的情况,选的窗口太小则以为斑马纹全是黑色。
- 假设了所有的纹理都可以简单的通过横向滤波器和纵向滤波器分类。
自适应窗口大小:
-
从小框逐渐过度到大框,当框内纹理特征变化很小时说明窗口大小合适了
-
可以选取很多种滤波器,在D维空间上进行Knn或者kmeans。常用的有48种纹理滤波器(6种方向+4种大小+点/边/bar)
-
卷积核尺寸越大,关注的内容越宏观,得到的图片越抽象
-
从左黑右白的卷积核用于检测竖纹就归纳得到一个结论,就是卷积核的走向和可检测的图像走向类似:
多维高斯:
-
公式:
-
协方差矩阵:
按照纹理分类图片任务:
-
给定图片n*m,对于每个点都进行了48个纹理卷积核的卷积,最终图片扩展为n*m*48
-
使用knn将该图片和其他图片比较,样本较少时也可以使用SVM
八,分割:
- 过分割:分割的太细碎。欠分割:不属于目标的内容也被划分入目标,导致分割结果太大。
- 超像素:将位置和语义相近的像素归为一块,和下文都属于自底向上的分割,从像素开始研究。
- 分割任务的特点:无监督。机器一般都是自底向上,而人类是自定向下 + 自底向上 且偶尔有监督偶尔无监督找规律。
基本分割法:
-
分割常见的依据:
-
认为RGB相似处是同一个内容 + k-means分类:不能很好的区分实例,属于欠分割
-
为RGB + 图中坐标:不同位置的背景也被分为了不同实例,属于过分割
K-means优缺:
-
优点:非常简单,总可以收敛到误差函数的局部最小值
-
缺点:!需要人为指定分类数k 2. 内存开销很大 3. 对初始情况很敏感 4.对离群值敏感 5.只能找到“球状星团”
对初始值敏感可以通过两种方法避免:密度法逐个找距离当前最远的最密集点 或 将空间等距离划分
对非球形分类可以通过GMM寻找
mean shift重心漂移法:
-
在单个特征点初始化窗口,
对每个窗口执行mean shift,直到收敛,出现接近相同“峰值”或模式的窗口
-
核心三步:
- 随机选择一个窗口
- 统计窗口内所有点的重心,将窗口向这个方向进行移动
- 直到移动停止时,所有窗口走过的区域都归同类
-
聚类:一个模式的吸引盆地中的所有数据点。
吸引盆地:所有轨迹都指向同一模式的区域
-
Mean shift算法是一种非参数的聚类算法,其主要用于数据聚类和密度估计。
步骤:
- 初始化:选择一个初始种子点,作为每个聚类的中心点,并确定一个窗口大小。
- 密度估计:对于每个种子点,计算在窗口内的数据点的密度估计。可以使用核函数来衡量数据点在窗口内的密度,通常使用高斯核函数。
- 平移向量计算:计算每个数据点相对于种子点的平移向量。平移向量的计算方式是通过计算数据点在窗口内的质心(mean)和当前种子点的差异。
- 平移:将种子点沿着平移向量进行平移,更新种子点的位置
- 收敛判断:重复步骤3和步骤4,直到种子点收敛于局部最大值(即平移向量接近于零)。这表示种子点已经找到了局部密度最大的聚类中心。
- 聚类:将收敛的种子点作为聚类的中心点,并将其他数据点分配到最近的聚类中心。
- 重复步骤1到步骤6,直到所有数据点都被分配到聚类中心。
Mean shift算法的核心思想是通过不断迭代调整种子点的位置,使其向高密度区域移动,直到收敛于局部最大值。这样可以找到数据中的聚类中心,并将数据点分配到对应的聚类中心。
-
优缺点:
优:不假设分类一定是球形,只需要一个参数(窗口大小),分类数目不需要预先指定,噪点干扰很小
缺点:计算复杂且量大(但可以不对圈内走过的点进行计算),非常依赖窗口大小设置(窗口太大则分类数少,太小则分类数过多),维度太高时点很稀疏很难算重心
Normalization Cut方法:
-
图论:图片中每个点都作为顶点,不同顶点的边权值为点的相似度。
找图片中所有点构成的网络的最小割,分开后也完成了图片的分割。
将图分割成段,删除段之间交叉的链接,最容易断开具有低亲和力的链接。分割之后相似的像素应该在相同的段中,不相似的像素应该在不同的段中。
-
点的相似度:
假设我们用一个特征向量x来表示每个像素,并定义一个适合于这个特征表示的距离函数,然后我们可以借助广义高斯核将两个特征向量之间的距离转化为相似度:
小σ:仅和附近的点相似; 大σ:可以和远处的点相似。
-
普通切割的缺点:最小切割倾向于切断非常小的,造成很多独立的细小区域,这可以通过归一化切割的所有边的权重来固定。
-
归一化切割前的权重:
考虑到两点多边,w(A, B) = A和B之间所有边的权值之和
-
数学证明:
-
步骤:
- 输入:图像(以像素矩阵表示),标准差σ1. 将像素转换为向量:将图像中的每个像素表示为一个向量。对于灰度图像,可以使用像素的灰度值作为向量的元素;对于彩色图像,可以使用像素的颜色通道值作为向量的元素。
- 计算两两像素的距离:对于每对像素向量,使用选定的距离函数(如欧氏距离或曼哈顿距离)计算它们之间的距离。得到一个距离矩阵,其中每个元素表示两个像素之间的距离。
- 将距离映射到[0, 1]范围内:将距离映射到[0, 1]的范围内,可以使用公式 d’ = (d - min_distance) / (max_distance - min_distance),其中 d 是原始距离,d’ 是映射后的距离,min_distance 和 max_distance 分别是所有像素对之间距离的最小值和最大值。
- 利用高斯核函数计算相似度:使用高斯核函数将距离转换为相似度。计算每对像素之间的相似度,可以使用公式 similarity = exp(-d’^2 / (2 * σ^2)),其中 d’ 是映射后的距离,σ 是标准差。
- 生成相似度矩阵W(邻接矩阵):将计算得到的相似度值填充到一个相似度矩阵中。矩阵的每个元素表示两个像素之间的相似度。注意,W是对称的。且对角线为0,因为相同点间距离为0。
- 构建拉普拉斯矩阵:根据相似度矩阵,构建拉普拉斯矩阵。拉普拉斯矩阵可以有多种形式,例如对称归一化拉普拉斯矩阵或非对称拉普拉斯矩阵。定义对角矩阵D,D的第n行不为0的元素为W第n行数值之和。
- 对拉普拉斯矩阵进行特征值分解:对构建的拉普拉斯矩阵进行特征值分解,得到特征值和对应的特征向量。(D-W)y = λDy;取第二小的特征值对应的y向量。
- 利用特征向量进行聚类或分割:根据特征向量的特定特征值,进行聚类或分割操作。可以使用聚类算法(如谱聚类)或基于特征向量的阈值操作来实现。设置门限值,假设为1,低于1的为一类,高于1的为另一类。
- 输出分割结果:根据聚类或分割的结果,将图像中的像素分为不同的区域或类别。可以根据特征向量的某个阈值或聚类算法的结果将像素分配到不同的分割区域或类别。
- 可选的后处理:根据需要,可以进行一些后处理步骤来进一步优化分割结果。例如,可以应用边缘平滑技术来消除分割边界上的噪声或不连续性。
- 输出最终结果:将最终的图像分割结果作为算法的输出,可以是标记每个像素所属区域或类别的图像。
-
优点:是普遍性框架,可用于许多不同的特征和亲和公式。缺点:高存储要求和时间复杂性。倾向划分的块都等大
九,识别(分类+检测):
-
各种任务:
- 检测任务:先找到,再识别或分类
- 分割任务:先找到,再识别或分类,再分割
- 检测基础上添加语义信息
-
能够对图像或视频进行分类的算法设计:检测和定位对象;估计语义和几何属性;对人类活动和事件进行分类
-
加剧识别难度:1. 种类巨多,人类可以识别1W到3W个物体。2. 不同视角下的同一对象的照片像素差异很大。3. 光照使得同一对象像素差异很大。4. 图像的先验不是很准。5. 形变。6. 遮挡。7. 背景杂波。8. 内部类的变化。
-
三大问题:
表示——如何表示对象类别?密集,随机、特征点、多重特征点。哪种分类方案?
学习-如何在给定训练数据的情况下学习分类器;
认知-如何在新数据上使用分类器
-
表示:直接密集分割为小图装入词袋?或者也考虑小图之间的相对位置拓扑关系。
先验后验:
-
为了处理类内的可变性,使用概率模型来描述对象类别是很方便的。对象模型:生成型、判别型和混合型
-
判别模型:最近邻、神经网络、支持向量机、Boosting
-
生成模型:朴素贝叶斯(最优似然函数)、潜在迪利克雷分布,LDA,2D部件模型、3D信息模型。
识别:
- 几种识别方法:分类(一张图一个类别,支持向量机)、检测(一张图内多个类别,需要窗口)
- 检测:滑动窗口,判断每一个窗口内是不是含有目标对象。
- 检测的缺点:1. 目标对象往往不是方形 2. 最后效果倾向于把假的判断为真的 3. 很多含有一部分目标对象的框也被认为正确的。(需要非最大化抑制)
词袋模型:
-
起源于纹理识别中看到简单纹理可以区别物体,统计物体中不同纹理出现次数。
-
原理:抽取所有图片中的特征,之后的图片向相关特征中投票,统计最后得票最多的特征,这个特征初始来源于哪个图片,则这张图片应该也属于这类图片
-
文章的向量表示:常见的母词有1W维,一篇文章为这一万个词投票,形成一个自己特点的直方图。
-
步骤:
- 特征提取:准备包含正确标签的图像数据集。把图像切成一个个的片,每片为该图像的局部特征。常用的特征提取方法有SIFT、LBP、SURF等,但是此时的特征重复太多,不能直接构建词典。
- 生成字典/词袋(codebook):将所有的局部特征点汇总,形成一个特征点集合。然后使用聚类算法(如K-means)对特征点集合进行聚类,将特征点划分为不同的聚类簇。每个聚类簇即为一个词,构建起精简的词典。构建直方图。
- 特征表示:对于每个图像样本,根据其局部特征点的分布情况,将其表示为一个特征向量。特征向量的维度为词典的大小,每个维度表示对应词在图像中出现的频率或权重。
- 分类器训练:使用构建好的特征向量作为输入,将图像样本和对应的标签输入到分类器中进行训练。常用的分类器包括支持向量机(SVM)、随机森林、神经网络等。
- 图像分类:对于新的待识别图像,提取其局部特征并表示为特征向量。然后,将特征向量输入已训练好的分类器中进行分类。分类器将输出该图像属于各个类别的概率或直接给出预测的类别。
-
好处:丢几个小图也不影响,遮挡、平移、旋转造成的干扰很小。
坏处:没有考虑图片中各个小图片的位置关系。
空间金字塔:
-
空间金字塔算法(Spatial Pyramid)可以有效地处理不同尺度和大小的图像内容。
-
原理:一张图片由很多层特征投票构成
-
步骤:
- 提取特征:首先,对输入图像进行特征提取。常用的特征提取方法包括SIFT(尺度不变特征变换)、HOG(方向梯度直方图)和LBP(局部二值模式)等。
- 划分金字塔:接下来,将图像划分为不同层级的金字塔结构。每个金字塔层级对应着不同的尺度和大小。通常,金字塔层级的数量和大小是预先定义好的,例如2层、3层或更多。
- 分块统计:对于每个金字塔层级,将图像分割为固定大小的块。这些块可以是正方形或矩形的区域。然后,在每个块内计算特征的统计信息。这可以包括直方图、均值、方差等。通过这种方式,可以捕捉到图像在不同空间位置的局部特征。
- 特征融合:将每个金字塔层级中的特征统计信息进行融合。一种常见的方法是将不同层级的特征串联起来,形成一个综合的特征向量。这样可以保留不同尺度和大小的信息,从而更好地描述图像的内容。
- 分类器训练:使用融合后的特征向量来训练分类器,例如支持向量机(SVM)、随机森林(Random Forest)或神经网络等。分类器可以根据提供的训练数据学习图像类别的模式,并用于对新图像进行分类和识别。6. 图像分类:对于待分类的新图像,首先进行与训练图像相同的特征提取和金字塔分块过程。然后,将提取到的特征输入训练好的分类器中进行预测。分类器会输出图像所属的类别标签。
后记:
- 看计算机视觉的发展历程,对于计算机科研工作内容有了进一步了解,一个个算法其实都出自一篇篇论文。