【学习笔记】计算机视觉与深度学习(3.卷积与图像去噪/边缘提取/纹理表示)

学习视频:
鲁鹏-计算机视觉与深度学习

同系列往期笔记:
【学习笔记】计算机视觉与深度学习(1.线性分类器)
【学习笔记】计算机视觉与深度学习(2.全连接神经网络)

1 卷积

在这里插入图片描述
噪声点:该点的像素和周围像素点的差异很大,如图中左图的253。
通过以该点为中心的9个点的像素值取均值来替代该点原本的像素值。
在这里插入图片描述
加权的权值 1 9 \frac{1}{9} 91,我们通常存储在一个上面这样的模板当中,我们称这个模板为卷积核,也称滤波核
在这里插入图片描述
下面的蓝色是输入的图像,上面的绿色是卷积后得到的输出图像。每一个像素点都有一个卷积核,通过卷积核得到输出的像素值。

F F F为图像, H H H为卷积核, F F F H H H的卷积即为 R = F ∗ H R=F*H R=FH
R i j = ∑ u , v H i − u , j − v F u , v R_{ij}=\displaystyle\sum\limits_{u,v} H_{i-u,j-v}F_{u,v} Rij=u,vHiu,jvFu,v

进行卷积操作前,我们要先对卷积核进行180°翻转。不过通常我们使用卷积时,卷积核都是对称的,所以后续不会强调翻转操作。

公式略抽象,举例说明。令:
F = [ a 0 , 0 a 0 , 1 a 0 , 2 a 1 , 0 a 1 , 1 a 1 , 2 a 2 , 0 a 2 , 1 a 2 , 2 ]     H = [ b − 1 , − 1 b − 1 , 0 b − 1 , 1 b 0 , − 1 b 0 , 0 b 0 , 1 b 1 , − 1 b 1 , 0 b 1 , 1 ] F= \begin{bmatrix} a_{0,0} & a_{0,1} & a_{0,2} \\ a_{1,0} & a_{1,1} & a_{1,2} \\ a_{2,0} & a_{2,1} & a_{2,2} \end{bmatrix} \ \ \ H= \begin{bmatrix} b_{-1,-1} & b_{-1,0} & b_{-1,1} \\ b_{0,-1} & b_{0,0} & b_{0,1} \\ b_{1,-1} & b_{1,0} & b_{1,1} \end{bmatrix} F= a0,0a1,0a2,0a0,1a1,1a2,1a0,2a1,2a2,2    H= b1,1b0,1b1,1b1,0b0,0b1,0b1,1b0,1b1,1
卷积后可以得到:

R i j = a 0 , 0 b 1 , 1 + a 0 , 1 b 1 , 0 + a 0 , 2 b 1 , − 1 + a 1 , 0 b 0 , 1 + a 1 , 1 b 0 , 0 + a 1 , 2 b 0 , − 1 + a 2 , 0 b − 1 , 1 + a 2 , 1 b − 1 , 0 + a 2 , 2 b − 1 , − 1 \begin{aligned} R_{ij}&=a_{0,0}b_{1,1}+a_{0,1}b_{1,0}+a_{0,2}b_{1,-1} \\ &+a_{1,0}b_{0,1}+a_{1,1}b_{0,0}+a_{1,2}b_{0,-1} \\ &+a_{2,0}b_{-1,1}+a_{2,1}b_{-1,0}+a_{2,2}b_{-1,-1} \end{aligned} Rij=a0,0b1,1+a0,1b1,0+a0,2b1,1+a1,0b0,1+a1,1b0,0+a1,2b0,1+a2,0b1,1+a2,1b1,0+a2,2b1,1

综上,通过这个公式,我们就可以使用 H H H F F F卷积到 R R R域上去。

卷积示例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
锐化原理见下图
在这里插入图片描述
在这里插入图片描述

更好地理解卷积所起到的滤波器的效果,可以参考这个网站:
Image-Kernels

卷积的性质

f i f_i fi为卷积前的图像, f i l t e r ( f i ) filter(f_i) filter(fi)为卷积后的图像, s h i f t ( f i ) shift(f_i) shift(fi)为平移后的图像。
①叠加性
f i l t e r ( f 1 + f 2 ) = f i l t e r ( f 1 ) + f i l t e r ( f 2 ) filter(f_1+f_2)=filter(f_1)+filter(f_2) filter(f1+f2)=filter(f1)+filter(f2)
②平移不变性(平移以后卷积和卷积以后平移结果不变)
f i l t e r ( s h i f t ( f 1 ) ) = s h i f t ( f i l t e r ( f 1 ) ) filter(shift(f_1))=shift(filter(f_1)) filter(shift(f1))=shift(filter(f1))

2 边界填充

在这里插入图片描述
求边界位置的卷积时可以发现我们缺少像素信息,于是我们需要在周围补上一些像素。
在这里插入图片描述
有多种填充方式:
①常数填充(最常用,如zero padding)
在这里插入图片描述
②拉伸(把边界的值填到边界)
③镜像(把原图边界作为对称面,根据原图数据对称填充)
在这里插入图片描述

3 高斯卷积核

平均卷积核存在的问题

在这里插入图片描述
会发现,卷积后的图像产生了一些水平和竖直方向的条状,称为振铃

解决方法:根据邻域像素与中心的远近程度分配权重。
在这里插入图片描述
G σ = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 G_{\sigma}=\frac{1}{2\pi \sigma^2}e^{-\frac{(x^2+y^2)}{2\sigma^2}} Gσ=2πσ21e2σ2(x2+y2)
在这里插入图片描述

生成步骤

  1. 确定卷积核的尺寸,比如 5 × 5 5\times 5 5×5
  2. 设置高斯函数的标准差,比如 σ = 1 \sigma =1 σ=1
  3. 计算卷积核各个位置的权重值;
  4. 对权重值进行归一化(使所有权值相加为 1 1 1 G σ ( x , y ) ∑ G σ ( x , y ) \frac{G_{\sigma}(x,y)}{\sum G_{\sigma}(x,y)} Gσ(x,y)Gσ(x,y)

如何设置下述参数

  1. 卷积核的尺寸
  2. 高斯函数的标准差

方差变化

在这里插入图片描述
标准差小→信号集中→中间值大→不平滑
方差越大,平滑效果越明显。

在这里插入图片描述
方差相同,则归一化前对应格子权值相同。归一化时每个小格的权值受到总格数的影响,导致格数多的归一化后权值小,平滑能力强;格数少的归一化后权值大,平滑能力弱。
模板尺寸越大,平滑能力越强。

总结

  1. 大方差或者大尺寸卷积核平滑能力强;
  2. 小方差或者小尺寸卷积核平滑能力弱;
  3. 经验法则:将卷积核的半窗宽度设置为 3 σ 3\sigma 3σ,最终卷积模板尺寸为 2 × 3 σ + 1 2\times 3\sigma + 1 2×3σ+1

平均卷积核vs高斯卷积核

在这里插入图片描述
可以看出,高斯卷积核有效去除了振铃的效果。

高斯卷积核结论

  1. 去除图像中的“高频”部分(低通滤波器)
  2. 两个高斯卷积核卷积得到的还是高斯卷积核
    ①使用多次小方差卷积核连续卷积,可以得到与大方差卷积核相同的结果
    ②使用标准差为 σ \sigma σ的高斯核进行两次卷积与使用标准差为 2 σ \sqrt{2}\sigma 2 σ的高斯核进行一次卷积相同。
  3. 可分离(可分解为两个一维高斯的乘积)

卷积操作运算量

用尺寸为 m × m m\times m m×m的卷积核卷积一个尺寸为 n × n n\times n n×n的图像,其计算复杂度是多少?
O ( m 2 n 2 ) O(m^2n^2) O(m2n2)

此处鲁鹏老师引用的例子我没有太懂,希望有看懂的朋友指教:
例子中第一种计算方法 σ = 1 \sigma=1 σ=1,一次运算是 O ( 49 n 2 ) O(49n^2) O(49n2),要计算两次;第二种计算方法是 σ = 2 \sigma=\sqrt{2} σ=2 ,一次运算是 O ( 81 n 2 ) O(81n^2) O(81n2),只计算一次。从时间复杂度的角度来看,两种计算方法都是 n 2 n^2 n2级别的,那么应当比较常数。如果讨论每次计算的时间复杂度,那 σ = 1 \sigma=1 σ=1的确每一次计算需要的时间复杂度小,但从实现最终目的的角度来看,这个例子里使用 σ = 2 \sigma=\sqrt{2} σ=2 应该是更加理想的?

如果核可分离呢?
O ( m 2 n ) O(m^2n) O(m2n)

小结

高斯卷积核可以有效抑制噪声(振铃)、实现图像平滑,通过分解卷积核可以降低计算复杂度。

4 图像噪声

椒盐噪声:黑色像素和白色像素随机出现。
在这里插入图片描述
脉冲噪声:白色像素随机出现。
在这里插入图片描述
高斯噪声:噪声强度变化服从高斯分布(正态分布)

在这里插入图片描述

高斯噪声

在这里插入图片描述
f ^ ( x , y ) = f ( x , y ) + η ( x , y ) \hat{f}(x,y)=f(x,y)+\eta(x,y) f^(x,y)=f(x,y)+η(x,y)

其中 f ( x , y ) f(x,y) f(x,y)理想图像 η ( x , y ) \eta(x,y) η(x,y)为随机噪声,有 η ( x , y ) ∼ N ( μ , σ ) \eta(x,y)\sim\mathcal{N}(\mu,\sigma) η(x,y)N(μ,σ),通常 μ = 0 \mu=0 μ=0 σ \sigma σ很小。

取其中的一行画出:
在这里插入图片描述

高斯去噪

在这里插入图片描述
横轴是高斯噪声中的 σ \sigma σ,纵轴是使用的高斯卷积核中的 σ \sigma σ,不难看出,高斯噪声中的 σ \sigma σ越大,使用的去噪的高斯卷积核中的 σ \sigma σ就越大。

高斯去噪处理椒盐噪声/脉冲噪声

在这里插入图片描述
发现高斯去噪不能很好地解决图像中的随机黑白像素点。

中值滤波

在这里插入图片描述
在这里插入图片描述

总结

椒盐噪声与脉冲噪声应当使用中值滤波去噪;
高斯噪声应当使用高斯卷积核去噪。

5 边缘提取

边缘:图像中亮度明显而急剧变化的点

为什么要研究边缘?

  1. 编码图像中的语义与形状信息
  2. 相对于像素表示,边缘表示显然更加紧凑

5.1 边缘的种类

在这里插入图片描述
表面法向不连续:两个交界面的法方向不同
深度不连续:瓶身的两条侧线,实际不存在,但把物体分成了能否在图像中被表示的两个的部分
表面颜色不连续:边界两侧的颜色有突变
光照不连续:出现遮挡等情况导致相同的光照下出现的光强差异

不同的识别任务关注的边缘种类不同。如判别当前图像表征的物体,则表面颜色不连续的边界是没有用的;判别这个瓶子里装的是什么,则表面颜色不连续的边界是有用的。

5.2 边缘检测

在这里插入图片描述

图像求导

2D函数 f ( x , y ) f(x,y) f(x,y)的偏导为:
∂ f ( x , y ) ∂ x = lim ⁡ ε → 0 f ( x + ε , y ) − f ( x , y ) ε \frac{\partial f(x,y)}{\partial x}=\displaystyle\lim\limits_{\varepsilon\rightarrow 0}\frac{f(x+\varepsilon,y)-f(x,y)}{\varepsilon} xf(x,y)=ε0limεf(x+ε,y)f(x,y)
图像求导公式:
∂ f ( x , y ) ∂ x ≈ f ( x + 1 , y ) − f ( x , y ) 1 \frac{\partial f(x,y)}{\partial x}\approx \frac{f(x+1,y)-f(x,y)}{1} xf(x,y)1f(x+1,y)f(x,y)
通过这个公式得到以下两种卷积核:
在这里插入图片描述
使用这两个卷积核对图像进行卷积即可实现对 x , y x,y x,y的偏导。
在这里插入图片描述
如图,左边是对 x x x求导得到的边界图,得到竖直方向的边界;右边是对 y y y求导得到的边界图,得到水平方向的边界。之所以是 x x x对应竖直、 y y y对应水平,是因为我们通过对 x x x求导得到的是水平方向的像素值差异,将水平方向差异分开的只能是竖直方向的边界,对 y y y求导同理。

5.3 图像梯度

在这里插入图片描述
可得梯度方向:
θ = tan ⁡ − 1 ( ∂ f ∂ x / ∂ f ∂ y ) \theta=\tan^{-1}(\frac{\partial f}{\partial x} / \frac{\partial f}{\partial y}) θ=tan1(xf/yf)
可得梯度的模:
∣ ∇ f ∣ = ( ∂ f ∂ x ) 2 + ( ∂ f ∂ y ) 2 |\nabla f|=\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2} ∣∇f=(xf)2+(yf)2
梯度的模值越大,说明这个点所在的边是边界的可能性越大。

在这里插入图片描述
使用模值的效果很好,所以我们通常使用梯度的模值来反应图像的边缘信息。

噪声的影响

噪声图像的某一行或列的灰度值随位置变换得情况。
在这里插入图片描述
看似平滑的位置却有微小波动。我们期待这些位置的导数为0,但是当我们求导时却得到:
在这里插入图片描述
此时无法确定边缘位置,因此应当先使曲线平滑。这个是每个点都有噪声,是高斯噪声,因此我们要做高斯平滑。
在这里插入图片描述
微分是卷积,而卷积具有结合性:
d d x ( f ∗ g ) = f ∗ d d x g \frac{d}{dx}(f*g)=f*\frac{d}{dx}g dxd(fg)=fdxdg
在这里插入图片描述
我们通过变换后,仅需要一次卷积计科完成求导。
在这里插入图片描述
这个就被称为高斯偏导模板
在这里插入图片描述
高斯偏导模板的方差变化为图像处理的影响:
在这里插入图片描述
通过图像可以看出,可以通过调节方差来关注不同的细节。方差较小时,我们关注细粒度的边缘细节;方差较大时,我们关注粗粒度的边缘细节。

高斯核vs高斯一阶偏导核

高斯核:

  1. 消除高频部分(低通滤波器)
  2. 卷积核中的权值不能为负数
  3. 权值总和为 1 1 1(恒定区域不受卷积影响,即图像光照总强度不会改变)

高斯一阶偏导核

  1. 是高斯的导数
  2. 卷积核中的权值可能为负数
  3. 权值总和为 0 0 0(恒定区域无响应)
  4. 高对比度点的响应值大

6 边缘检测

6.1 非最大值抑制

在这里插入图片描述
Canny边缘检测器:
在这里插入图片描述
放大结果图:

产生该现象的原因:在该处颜色变化较为平缓,不是突变,使得存在变化的宽度较大,从而出现粗条。

在这里插入图片描述
如上图中右侧所示,如果 p p p点的梯度强度比 q q q r r r都强,则保留 p p p点,否则删去 p p p点。
q q q点和 r r r点的坐标通常不是整数,其对应的梯度强度需要通过插值获得,插值方法如加权求和插值等)
在这里插入图片描述

6.2 双阈值

在这里插入图片描述
为了找到恰当的边缘,先使用高阈值提取梯度强度较高的边,然后使用低阈值提取梯度强度较低的边,但只保留与高阈值提取到的边有连接的边,其余的边舍弃。

6.3 总结

  1. 用高阶一阶偏导核卷积图像
  2. 计算每个点的梯度幅值和方向
  3. 非最大化抑制:将宽的“边缘”细化至单个像素的宽度
  4. 连接与阈值(滞后)
    ①定义两个阈值:低和高
    ②使用高阈值开始边缘曲线,使用低阈值继续边缘曲线

7 纹理表示

7.1 纹理

在这里插入图片描述

7.2 基于卷积核组的纹理表示方法

思路:利用卷积核组提取图像中的纹理基;利用基元的统计信息来表示图像中的纹理。

下面是一个卷积核组的例子:
在这里插入图片描述
前六个卷积核(高斯偏导核)用来检测不同方向的边缘,最后一个卷积核用来检测是否有圆形/斑状的图案。

给定一个图像,用卷积核卷积核会得到:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 设计卷积核组
  2. 利用卷积核组对图像进行卷积操作获得对应的特征响应图组
  3. 利用特征响应图的某种统计信息来表示图像中的纹理。

图中 r 1 \mathbf{r}_1 r1表示第一个特征图展开的向量
r 1 × n r_{1\times n} r1×n表示第 1 1 1个特征图上第 n n n个位置的响应值

这样送入神经网络学习时,假设图像是 n × m n\times m n×m,那么我们通过纹理表示一张图像时,可以变成 7 × n × m 7\times n\times m 7×n×m维的向量,但是这样的计算量过于庞大。

对于纹理分类任务,每个图像中相同的纹理出现的位置与我们的任务是无关的。在刚刚的存储方法中,我们将所有像素点变向展开成一个向量,无形之中,也存储了图像中各个纹理的位置信息。在进行学习和比较时,难免会产生相同位置的纹理对比,这是我们在纹理分类任务中所不需要的。

所以我们通常忽略基元位置,关注出现了哪种基元对应的纹理以及基元出现的频率
在这里插入图片描述
图中, r ˉ i \bar{r}_i rˉi表示第 i i i个特征响应图的均值。这种方法用基元信息的均值来表示图像,有效减少了维数。

尝试匹配下图中图像与纹理表示!

在这里插入图片描述
对应的基元均值越大,那么对应的灰度越大,就越偏向白色。
通过均值为白色的基元,不难看出——图像1对应纹理表示C(圆斑点居多),图像2对应纹理表示A(竖直边缘居多),图像3对应纹理表示B(右上至左下倾斜边缘居多)。

卷积核组设计

  1. 卷积核类型(边缘、条形以及点状)
  2. 卷积核尺度(3-6个尺度,修正卷积核的方差来调节边缘粗细颗粒程度)
  3. 卷积核方向(6个角度)
    在这里插入图片描述
    上图中,尺寸越大,意味着方差越大,考虑的边缘或条状的颗粒越粗。
    “边缘”和“条状”的区别:
    在这里插入图片描述

实际例子

在这里插入图片描述

总结

  1. 设计卷积核组
  2. 利用卷积核组对图像进行卷积操作获得对应的特征相应图组
  3. 利用特征响应图的某种统计信息来表示图像中的纹理

思考

我们对于每一个位置,如上图所示,用48维向量表示特征的话,那么我们得到的一定是一个稀疏矩阵,因为一个点它符合的核组中特征并不多,比如说他该是竖直的就不会是水平的,他该是从右上到左下的,就不会是从左上到右下的。一旦是稀疏矩阵,就有充分的机会去压缩内容。

猜你喜欢

转载自blog.csdn.net/xhyu61/article/details/129707364