摘要 Hough变换相比于其他的拟合方法,它可以检测多个图形(当然RANSAC采用TOPK也可以实现多图形检测)。具体来说,Hough变换是将图像空间的像素点向参数空间投影并投票,通过投票最大值得到最优参数。 直线拟合 二维空间的直线有两个参数$m,b$。那么Hough变换投影的参数空间也是二维。 对于图像中的一条线,对应参数空间中的一个点,该点的票数加一。 对于图像中的一个点,对应参数空间中的一条线,线上的票数加一。 那么对于图像中的多个点,如果这些点有较好的线性关系,那么参数空间投票时,会有一个点票数最高,而这个点则是拟合直线的参数。 上述参数空间有个问题,就是$m,b$的范围无法确定,如果直线垂直x轴,m会趋于无限大,参数空间也趋于无限大。因此需要换一种参数表示,这里使用极坐标表示直线。 更换坐标系后,投票策略转换为下图。对于图像上的每个点(这里说图像一般是指边缘图像,可以是canny算法得到的结果),根据已知$x,y$,遍历$\theta$值,得到对应$\rho$,参数空间中的网格加一票。最后选择票数最高的作为拟合结果。 直线拟合效果如下,右侧为参数空间,亮度代表票
RANSAC指Random sample consensus,随机采样一致性。算法流程如下: 随机选择数据点的一个子集 通过数据子集优化模型 在模型拟合结果附近的数据点将为该模型参数投票 重复以上操作,直到找到一个最优模型,有最多的数据点为他投票 迭代示意图如下。 拟合直线的流程如下图。其中s,d是超参数。拟合直线的流程如下图。其中s,d是超参数。在最后得到票数最高对应的直线时,一般会用该直线和周围的d个点再做一次最小二乘,使拟合更精确。 关于N的选择也是一个重要问题,需要兼顾准确率和效率。通过以下公式可以对给定准确率的情况下预估次数N。其中e是外点率,需要给定,s是每次循环的采样点个数,N是循环个数,p是准确率。 $$ (1-(1-e)^s)^N = 1-p $$ 当然N也可以使用自适应的方法确定。算法流程如下图。N初始化为无穷大,当拟合到一个更好的曲线时,重新估计N的大小(N会越来越小),作为循环的终止条件。内点率外点率可以通过设定一个阈值t来计算。 下图是RANSAC的总结。 补充:指纹配对 RANSAC也可以做指纹的配对,通过拟合两个指纹之间的仿射变换,最后通过
摘要 如果说边缘检测只是将给定图像的边缘提取出来,那么拟合就是对这些边缘进行数学建模,得到形式化的数学表示。接下来以最简单的拟合直线为例。 最小二乘法 损失函数是所有数据点拟合直线的预测值与真实值的差的平方和。 可以通过偏导或线代的向量投影得到最优参数,下图为偏导过程与结果。 全最小二乘 最小二乘有两个问题:首先是无法表示垂直x轴的直线,二是损失函数不能很好表示直线与数据点之间的距离。全最小二乘对此进行了改善,首先修改了直线的表示方式,其次损失函数从纵向距离改为了直线到数据点的垂直距离。 求解步骤是:首先通过E对d偏导,得到d的a,b参数表示;再找到$U^TU$矩阵的最小特征值,对应的特征向量就是参数a,b的值(最好情况就是找到特征值0的特征向量,但是矩阵特征值不一定有0,所以退而求其次求最小) 全最小二乘的物理意义如下图,就是使所有数据点在直线的垂直方向上的投影最小。 鲁棒估计 最小二乘容易受到极端数据点的影响。 通过变换损失函数,当数据点距离直线越远时,损失会稳定到一个常数,从而减轻极端数据点的影响。$\sigma$是超参数,可以调整拟合对于外点的敏感性,具体见下图。 鲁
摘要 边缘检测是视觉中比较基础任务。通过边缘可以更容易的对图像中的事物进行认知,或者说边缘是图像语义的压缩表示。 检测方法 对于图像边缘,边缘两侧的像素值相差较大。那么可以通过导数来确定边缘位置。 导数定义如下,对于离散的像素点,$\delta x$可以简单表示为1个像素。 进一步可以使用卷积操作来实现横向/纵向边缘的提取,如下图所示。 关于边缘检测算子,有prewitt、sobel、roberts.prewitt比较经典,sobel算子其实是高斯模糊与边缘检测的叠加操作($[1 2 1]^T[-1 0 1]$),roberts算子则检查斜向的边缘。 我们得到了横向、纵向的偏导,其实就可以确定某个像素点的实际梯度方向。这个梯度方向和边缘线保持垂直,所以也可以得到边缘线的方向,这在之后的拟合hough变换会用到。对梯度取模,可以使边缘现象更加明显。 高斯偏导模板 刚刚提到的sobel算子可以拆解成高斯模糊和边缘检测(偏导)的操作,高斯模糊可以去除一部分噪声,从而使边缘检测更准确。根据求导法则,可以先对高斯核求导,再使用求导后的高斯核进行卷积。求导后的高斯核叫做高斯偏导模板。
摘要 滤波作为计算机视觉中常见的一种操作,一般用于降噪、边缘提取等操作。滤波一般通过卷积操作完成,根据需要可以定制卷积核,实现均值/高斯/中值滤波。 卷积操作 卷积操作的示意图如下,给定卷积核g和图像f,卷积后的图像表示为 $$ (f*g)[m,n] = \sum_{k,l}f[m-k,n-l]g[k,l] $$ 根据上述公式中的负号,卷积核实际使用时,是将核上下左右翻转后再作用在图像f上。当然这个操作在实际编程时已经被淡化,只不过卷积定义要求了负号(翻转) 卷积具有两个特性: Linearity,即$filter(f_1+f_2) = filter(f_1)+filter(f_2)$ Shift invariance,即$filter(shift(f)) = shift(filter(f))$ 以上两个性质说明任何具有平移不变性的线性操作都可以用卷积操作表示。除此之外,卷积操作还满足交换律、结合律、分配律、数乘等操作。 卷积操作会改变图像的大小(联想deep learning中卷积层的padding),那么如何填充原始图像,保证结果图像和原图保持大小一致就是一个值得思考的问题。
Axuanz
Updating as per fate.