【CV】机器视觉学习笔记

北邮鲁鹏资源

分辨率是 1024 x 768 则图像有 1024 x 768 个像素点

二进制图像:每个点用一个bit表示
灰度图:每个点用一个Byte表示,范围 0-255
RGB图像:每个点由R\G\B三个信息表示,三个Byte,范围 0-255

卷积核/滤波核:filter kernel
卷积运算:对应点相乘再相加(对核内数据进行加权,然后赋给中心点)

在利用均值核对图像进行平滑处理的时候,考虑到距离中心点越远的点 对中心值影响越小。所以考虑使用高斯分布设置核内权重。

高斯核
CSDN 文字讲解
B站高斯分布复习
标准差σ越大,高斯分布的图像越扁平。对应高斯核可取值的范围就会增大。若在这同时增大高斯核的大小,则被用于计算的均值的范围变大,则得到的图像就会越模糊。
当使用高斯滤波器进行图像处理时,W代表窗口的大小(也称为卷积核的尺寸),σ代表高斯函数的标准差(方差的平方根)。经验上,有一个常见的规则是W/2=3σ,它表示窗口的一半尺寸大约等于3倍的标准差。
这个经验规则可以用于选择适当的窗口大小和标准差,以确保高斯滤波器在平滑图像的同时保持图像细节。具体而言,较大的窗口尺寸和较大的标准差可以产生更强烈的平滑效果,但可能会导致图像细节的丢失。相反,较小的窗口尺寸和较小的标准差可以保留更多的细节,但平滑效果会较弱。
根据经验,W/2=3σ提供了一种简单的方法来选择窗口大小和标准差的相对关系,以获得平衡的结果。但需要注意的是,这只是一个经验规则,具体的选择还取决于特定的应用和图像处理的需求。在实际应用中,可能需要进行实验和调整以找到最适合的参数。

cv2中的滤波,均值,高斯,中值,高通,低通,傅里叶变换

Canny算法——边缘检测

鲁鹏讲解
CSDN文字讲解

算法原理概述

OpenCV——Canny边缘检测(cv2.Canny())

edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
# threshold1为低阈值,threshold2为高阈值

图像拟合 fitting

最小二乘法拟合
假设需要拟合一条线,通过最小二乘法可以求得这条线的方程,从而将像素点拟合成一条平滑的曲线。这样的应用场景很多,比如图像的边缘检测、图像的灰度平滑和曲线的修正等
一文让你彻底搞懂最小二乘法(超详细推导)

鲁棒性最小二乘法

RANSAC——随机一致性采样
文字讲解
在使用RANSAC找到内点之后,再利用找到的点,使用最小二乘法找到直线

RANSAC的利弊
优点
简单、适用于许多不同的问题,经常在实践中效果很好
缺点
有很多参数需要调整,对于较低的初始比率不能很好地工作(要迭代太多次,或者可能完全失败)
在较小的样本数上不能总是得到一个良好的初始化模型

霍夫变换 Hough transform
CSDN 文字讲解
鲁鹏讲解
软投票法:给相邻的也投一票

Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)

特征提取

OpenCV中的几种角点检测方法

Harris corner detection(角点检测)
B站讲解
典型的数学建模过程,将实际问题用数学模型来表示,从而量化,让计算机理解。
适用于:光照情况、位置、旋转、平移等变化ss
不适用于:大小的变化

Blob detection

SIFT(Scale Invariant Feature Transform)尺度不变特征变换
B站讲解

高斯金字塔:图像的尺度空间,用于模拟观察者距离物体的远近程度及模糊程度
参数
层数 octave:O = [log2(min(M,N))]-3 M、N:原图片的宽和高
每层的图片数:S = n + 3 n:能找到的特征图数
n的解释:
假如每层用了五个不同的高斯核进行卷积,那么每层得到五个高斯后的图片(S)。
相邻两个做差,得到四张差分后的图片。差分后的图片需要求梯度来找特征点,但是最上和最下两张找不到。所以n为S-3 = 2。也可以理解为,三个差分图为一组,对中间的那张进行计算,所以四张图片能找到上下两个组。

SIFT 和 CNN 在图像检索任务上的比较
SIFT(尺度不变特征转换)和CNN(卷积神经网络)在图像检索任务中具有不同的特点和应用场景。下面是它们之间的一些比较:

  1. 特征表示:

    • SIFT:SIFT算法提取的特征是局部特征,主要关注图像中的关键点和它们的描述子。这些特征具有旋转不变性和尺度不变性,适用于处理图像中的局部变化和几何变换。
    • CNN:卷积神经网络通过多层卷积和池化操作,从整个图像中学习到的特征表示。这些特征是全局的,能够捕捉到图像中的语义信息和高层次的抽象特征。
  2. 训练需求:

    • SIFT:SIFT算法不需要大规模标注的训练数据,因为它是一种手工设计的特征提取算法。
    • CNN:卷积神经网络需要大规模的标注数据进行训练,以便通过反向传播算法学习到适合任务的特征表示。这需要大量的计算资源和训练时间。
  3. 鲁棒性:

    • SIFT:SIFT算法在旋转、缩放和仿射变换等情况下具有较强的鲁棒性。它对于图像中的局部变化和几何变换能够提取稳定的特征。
    • CNN:卷积神经网络在大规模训练的情况下可以具有一定的鲁棒性,但对于缩放和旋转等变换相对较敏感。
  4. 性能:

    • SIFT:SIFT算法在传统的图像检索任务中表现良好,并且在计算机视觉领域经过多年的研究和验证。它在小规模图像数据库上具有较高的检索准确性。
    • CNN:卷积神经网络在大规模图像数据集上进行端到端的训练,能够学习到更复杂的特征表示,并在一些特定的图像检索任务中达到更好的性能。例如,对于基于图像分类的图像检索任务,CNN通常能够获得更好的结果。

综上所述,SIFT适用于小规模图像数据库和对局部特征关注较多的场景,而CNN在大规模图像数据集和需要全局语义信息的任务中具有优势。实际应用中,可以根据具体任务的需求和数据的特点选择适合的方法或结合两者的优势进行

纹理

常见任务:
·从图像纹理估计表面方向或形状
·根据纹理线索进行分割/分类 分析,表示纹理
·将纹理一致的图像区域分组
·生成新的纹理/图像

用不同方向的卷积核卷积图像,每个核为输出向量的一维,向量中的最大值对应的卷积核方向,就是该纹理的方向。

分割 Segmentation

Mean shift
简单易学的机器学习算法——Mean Shift聚类算法
找局部密度最高的点

Mean shift算法是一种非参数的聚类算法,其主要用于数据聚类和密度估计。以下是Mean shift算法的基本流程:

  1. 初始化:选择一个初始种子点,作为每个聚类的中心点,并确定一个窗口大小。
  2. 密度估计:对于每个种子点,计算在窗口内的数据点的密度估计。可以使用核函数来衡量数据点在窗口内的密度,通常使用高斯核函数。
  3. 平移向量计算:计算每个数据点相对于种子点的平移向量。平移向量的计算方式是通过计算数据点在窗口内的质心(mean)和当前种子点的差异。
  4. 平移:将种子点沿着平移向量进行平移,更新种子点的位置。
  5. 收敛判断:重复步骤3和步骤4,直到种子点收敛于局部最大值(即平移向量接近于零)。这表示种子点已经找到了局部密度最大的聚类中心。
  6. 聚类:将收敛的种子点作为聚类的中心点,并将其他数据点分配到最近的聚类中心。
  7. 重复步骤1到步骤6,直到所有数据点都被分配到聚类中心。

Mean shift算法的核心思想是通过不断迭代调整种子点的位置,使其向高密度区域移动,直到收敛于局部最大值。这样可以找到数据中的聚类中心,并将数据点分配到对应的聚类中心。

归一化图割 Normalized cut
图像处理--归一化切割--(normalized cut)--Python实现

以下是Normalization Cut算法的完整详细步骤:

输入:图像(以像素矩阵表示),标准差σ

  1. 将像素转换为向量:将图像中的每个像素表示为一个向量。对于灰度图像,可以使用像素的灰度值作为向量的元素;对于彩色图像,可以使用像素的颜色通道值作为向量的元素。
  2. 计算两两像素的距离:对于每对像素向量,使用选定的距离函数(如欧氏距离或曼哈顿距离)计算它们之间的距离。得到一个距离矩阵,其中每个元素表示两个像素之间的距离。
  3. 将距离映射到[0, 1]范围内:将距离映射到[0, 1]的范围内,可以使用公式 d' = (d - min_distance) / (max_distance - min_distance),其中 d 是原始距离,d' 是映射后的距离,min_distance 和 max_distance 分别是所有像素对之间距离的最小值和最大值。
  4. 利用高斯核函数计算相似度:使用高斯核函数将距离转换为相似度。计算每对像素之间的相似度,可以使用公式 similarity = exp(-d'^2 / (2 * σ^2)),其中 d' 是映射后的距离,σ 是标准差。
  5. 生成相似度矩阵W(邻接矩阵):将计算得到的相似度值填充到一个相似度矩阵中。矩阵的每个元素表示两个像素之间的相似度。注意,W是对称的。且对角线为0,因为相同点间距离为0。
  6. 构建拉普拉斯矩阵:根据相似度矩阵,构建拉普拉斯矩阵。拉普拉斯矩阵可以有多种形式,例如对称归一化拉普拉斯矩阵或非对称拉普拉斯矩阵。定义对角矩阵D,D的第n行不为0的元素为W第n行数值之和。
  7. 对拉普拉斯矩阵进行特征值分解:对构建的拉普拉斯矩阵进行特征值分解,得到特征值和对应的特征向量。(D-W)y = λDy;取第二小的特征值对应的y向量。
  8. 利用特征向量进行聚类或分割:根据特征向量的特定特征值,进行聚类或分割操作。可以使用聚类算法(如谱聚类)或基于特征向量的阈值操作来实现。设置门限值,假设为1,低于1的为一类,高于1的为另一类。
  9. 输出分割结果:根据聚类或分割的结果,将图像中的像素分为不同的区域或类别。可以根据特征向量的某个阈值或聚类算法的结果将像素分配到不同的分割区域或类别。
  10. 可选的后处理:根据需要,可以进行一些后处理步骤来进一步优化分割结果。例如,可以应用边缘平滑技术来消除分割边界上的噪声或不连续性。
  11. 输出最终结果:将最终的图像分割结果作为算法的输出,可以是标记每个像素所属区域或类别的图像。

Minimum Cut
图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)
去除图中权重最小的边

识别 Recognition

BOW词袋模型应用于图像识别分类
词袋模型将图片分成小块,从而一定程度上解决了遮挡等问题
一般步骤:

  • 特征提取
    类比一下上面文本特征的提取,把文本1这句话切成一个个单词,这个过程就是在提取这个文本的特征,那么在图像中提取特征也类似,就是把图像切成一个个的片(patch),每片当成该图像的特征。常用的特征提取方法有SIFT、LBP、SURF等。

  • 生成字典/词袋(codebook)
    在上一步特征提取中我们得到了很多的特征点,我们不能把每个点都放进词袋吧,那么就需要想一个招找到这些点中具有代表性的几类点,这一般需要聚类方法来完成的。对全部特征点进行聚类,得到了几个聚类中心,这些聚类中心就是这些点的特征向量。这一步之后就得到了词袋。(不理解的可以类比一下上面文本形成词袋的过程,上面文本形成词袋是把所有单词都放进去了,但是对图像来说特征点太多不可能全部放进去,所以使用聚类把聚类中心就当成词袋中的点)。

  • 根据词袋生成特征直方图
    对于每张图片都有大量的特征点,那么就把这些点对照着上面得到的词袋统计出来,这样每张图片都会得到一个特征直方图,可以参考一下上面文本直方图。

空间金字塔算法(Spatial Pyramid)
一种用于图像分类和目标识别的传统机器视觉算法,可以有效地处理不同尺度和大小的图像内容。下面是Spatial Pyramid算法的实现过程:

  1. 提取特征:首先,对输入图像进行特征提取。常用的特征提取方法包括SIFT(尺度不变特征变换)、HOG(方向梯度直方图)和LBP(局部二值模式)等。这些方法可以提取图像中的局部特征,用于后续的分析和处理。

  2. 划分金字塔:接下来,将图像划分为不同层级的金字塔结构。每个金字塔层级对应着不同的尺度和大小。通常,金字塔层级的数量和大小是预先定义好的,例如2层、3层或更多。

  3. 分块统计:对于每个金字塔层级,将图像分割为固定大小的块。这些块可以是正方形或矩形的区域。然后,在每个块内计算特征的统计信息。这可以包括直方图、均值、方差等。通过这种方式,可以捕捉到图像在不同空间位置的局部特征。

  4. 特征融合:将每个金字塔层级中的特征统计信息进行融合。一种常见的方法是将不同层级的特征串联起来,形成一个综合的特征向量。这样可以保留不同尺度和大小的信息,从而更好地描述图像的内容。

  5. 分类器训练:使用融合后的特征向量来训练分类器,例如支持向量机(SVM)、随机森林(Random Forest)或神经网络等。分类器可以根据提供的训练数据学习图像类别的模式,并用于对新图像进行分类和识别。

  6. 图像分类:对于待分类的新图像,首先进行与训练图像相同的特征提取和金字塔分块过程。然后,将提取到的特征输入训练好的分类器中进行预测。分类器会输出图像所属的类别标签。

Spatial Pyramid算法通过在不同层级和块上进行特征统计和融合,可以有效地捕捉到图像的局部和全局信息。这种方法在处理尺度变化和多尺度目标时具有优势,并且对于不同大小的图像也具有较好的鲁棒性。

Boosting(增强学习算法)
一种集成学习方法,旨在通过组合多个弱分类器来构建一个更强大的分类器。Boosting算法通过迭代的方式逐步改进分类器的准确性,将先前分类器的错误样本权重增加,并对分类错误的样本进行重点关注。

以下是Boosting算法的简要实现过程:

  1. 初始化权重:对于包含N个训练样本的训练集,初始化每个样本的权重为相等值(1/N)。

  2. 迭代训练:进行T轮迭代,每一轮迭代中都训练一个弱分类器。

  3. 弱分类器训练:在每一轮迭代中,根据当前样本权重,使用训练集训练一个弱分类器。弱分类器通常是一个性能较差的分类器,如决策树桩(仅有一层决策树)或者简单的线性分类器。

  4. 分类器权重:根据弱分类器的错误率(分类错误的样本比例)计算其权重。错误率越低的弱分类器获得的权重越高,能够对分类结果做出更大的贡献。

  5. 更新样本权重:根据弱分类器的权重调整训练样本的权重。被错误分类的样本权重会增加,而被正确分类的样本权重会减少。这样,下一轮迭代时,错误分类的样本会受到更多关注。

  6. 结合弱分类器:将每个弱分类器按照其权重进行加权组合,得到最终的强分类器。强分类器通过累加弱分类器的预测结果,以投票或加权平均的方式进行最终分类。

  7. 重复迭代:重复步骤3至步骤6,直到达到预定的迭代次数T或者满足某个停止条件(如达到预期准确率)。

Boosting算法通过多次迭代,逐步改进分类器的性能,重点关注那些难以分类的样本。它的优点在于能够构建出具有较高准确性的分类器,并且对于噪声和复杂数据集有一定的鲁棒性。著名的Boosting算法包括AdaBoost(自适应Boosting)和Gradient Boosting(梯度提升)。

Viola-Jones算法
一种用于实时目标检测的传统机器视觉算法。它由Paul Viola和Michael Jones于2001年提出,被广泛应用于人脸检测。Viola-Jones算法基于Haar特征和级联分类器的概念,其实现过程如下:

  1. Haar特征:Haar特征是一种基于图像局部区域的特征描述符。它可以用于描述图像中的边缘、线段、角等特征。Haar特征可以通过在图像上滑动不同大小和位置的滑窗,并计算窗口内不同区域的像素和来表示。

  2. 积分图像:为了加速特征计算,Viola-Jones算法使用积分图像(Integral Image)进行快速计算。积分图像可以在常数时间内计算出任意矩形区域的像素和,使得特征计算的复杂度降低。

  3. Adaboost训练:使用Adaboost算法,Viola-Jones算法训练了一个级联分类器。级联分类器由多个弱分类器组成,每个弱分类器都是一个基于Haar特征的简单二分类器。Adaboost算法通过迭代训练,在每一轮迭代中调整样本的权重,使得错误分类的样本得到更多关注。

  4. 特征选择:在每一轮迭代中,Viola-Jones算法通过选择具有最小错误率的特征来构建弱分类器。这样可以选择最具区分性的特征,以便有效地区分目标和非目标区域。

  5. 级联结构:为了提高检测速度,Viola-Jones算法采用了级联的结构。级联分类器将所有弱分类器按顺序组织成级联的多个阶段。每个阶段都具有不同的分类器数量和阈值,以逐步过滤出非目标区域,减少检测的计算量。

  6. 移动窗口检测:在测试阶段,Viola-Jones算法使用移动窗口技术在图像上滑动不同大小的窗口,对每个窗口进行分类器的评估。通过级联结构和快速特征计算,可以高效地排除大多数非目标窗口,并快速识别出目标窗口。

Viola-Jones算法具有高速和高准确性的特点,尤其在人脸检测方面表现出色。它被广泛应用于实时的图像和视频处理应用中,如人脸识别、表情分析和眼部追踪等。然而

三维重建

摄像机模型
通过多张图片重构三维场景。无人驾驶车、地图等。
摄像机几何

相机标定
找到二维和三维点之间的对应关系,用于计算相机的内参数

计算摄影学

计算摄影学及本专栏介绍
计算成像(computational photography)方向的就业前景如何?
iPhone 13系列解读之二——让我们聊聊计算摄影

AlexNet

AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现

手撕 CNN 经典网络之 AlexNet(理论篇)

ResNet

Swin

VGG