图像卷积

Posted 编号1993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像卷积相关的知识,希望对你有一定的参考价值。

这几天在进行其它运算时突然发觉自己对于卷积的概念和运算有一些陌生,重新复习一下。


目录

  1. 图像卷积概念
  2. 图像卷积数学公式
  3. 图像卷积注意事项
  4. 图像卷积算法实现

图像卷积概念

参考:

Convolution

Kernel (image processing)

图像卷积操作(convolution),或称为核操作(kernel),是进行图像处理的一种常用手段,

图像卷积操作的目的是利用像素点和其邻域像素之前的空间关系,通过加权求和的操作,实现模糊(blurring),锐化(sharpening),边缘检测(edge detection)等功能。

图像卷积的计算过程就是卷积核按步长对图像局部像素块进行加权求和的过程。

卷积核实质上是一个固定大小的权重数组,该数组中的锚点通常位于中心。

卷积核大小

通常情况下,选取卷积核大小为1x1,3x3,5x5,7x7

取奇数大小的目的是为了设置卷积核中心为锚点,方便卷积核和图像的对齐处理

设置卷积核大小对称的目的是为了在空间域中充分利用像素点和其领域像素间的关系。当然这不是必须的,如果需要针对某一轴进行处理,可以设置1x33x1大小。


图像卷积数学公式

二维离散卷积公式如下:

h [ x , y ] = f [ x , y ] ∗ g [ x , y ] = ∑ n 1 = − ∞ ∞ ∑ n 2 = − ∞ ∞ f ( n 1 , n 2 ) ⋅ g ( x − n 1 , y − n 2 ) h[x,y]=f[x,y]\\ast g[x,y]=\\sum_n_1=-\\infty^\\infty\\sum_n_2=-\\infty^\\inftyf(n_1, n_2)\\cdot g(x-n_1,y-n_2) h[x,y]=f[x,y]g[x,y]=n1=n2=f(n1,n2)g(xn1,yn2)

图像卷积通常使用这个公式,其中 g [ x , y ] g[x,y] g[x,y]为卷积核,符号 ∗ \\ast 表示卷积操作

图形化表示

以一维离散卷积公式为例:

y ( t ) = ( f ∗ g ) ( t ) = ∑ τ = − ∞ ∞ f ( τ ) g ( t − τ ) d τ y(t)=(f\\ast g)(t)=\\sum_\\tau =-\\infty^\\inftyf(\\tau )g(t-\\tau )d\\tau y(t)=(fg)(t)=τ=f(τ)g(tτ)dτ

其图形化公式如下:

  • 首先将函数 g ( τ ) g(\\tau) g(τ)反射为 g ( − τ ) g(-\\tau) g(τ),相当于 g ( τ ) g(\\tau) g(τ)沿 y y y轴翻转
  • 再对函数 g ( − τ ) g(-\\tau) g(τ)添加一个时间偏移量 t t t,它允许函数 g ( t − τ ) g(t-\\tau) g(tτ)沿着 τ \\tau τ轴移动
  • 变量 t t t每增加1,表示函数 g ( t − τ ) g(t-\\tau) g(tτ)向左移动一步
  • 计算t遍历 − ∞ -\\infty ∞ \\infty 的过程中,函数 f ( τ ) f(\\tau) f(τ) g ( t − τ ) g(t-\\tau) g(tτ)的重叠面积

举例

函数 f = [ 1 , 2 , 3 , 4 ] f=[1, 2, 3, 4] f=[1,2,3,4],函数 g = [ 1 , 3 , 2 ] g=[1, 3, 2] g=[1,3,2]

将函数 g g g逆转: g ( τ ) ⇒ g ( − τ ) g(\\tau)\\Rightarrow g(-\\tau) g(τ)g(τ),值变为 [ 2 , 3 , 1 ] [2, 3, 1] [2,3,1]

计算过程如下:

h ( 0 ) = [ 1 ] ⋅ [ 1 ] = 1 ⋅ 1 = 1 h(0)=[1]\\cdot [1]=1\\cdot 1=1 h(0)=[1][1]=11=1
h ( 1 ) = [ 1 , 2 ] ⋅ [ 3 , 1 ] = 1 ⋅ 3 + 2 ⋅ 1 = 3 + 2 = 5 h(1)=[1,2]\\cdot [3,1]=1\\cdot 3+2\\cdot 1=3+2=5 h(1)=[1,2][3,1]=13+21=3+2=5
h ( 2 ) = [ 1 , 2 , 3 ] ⋅ [ 2 , 3 , 1 ] = 1 ⋅ 2 + 2 ⋅ 3 + 3 ⋅ 1 = 2 + 6 + 3 = 11 h(2)=[1,2,3]\\cdot [2,3,1]=1\\cdot 2 +2\\cdot 3+3\\cdot 1=2+6+3=11 h(2)=[1,2,3][2,3,1]=12+23+31=2+6+3=11
h ( 3 ) = [ 2 , 3 , 4 ] ⋅ [ 2 , 3 , 1 ] = 2 ⋅ 2 + 3 ⋅ 3 + 4 ⋅ 1 = 4 + 9 + 4 = 17 h(3)=[2,3,4]\\cdot [2,3,1]=2\\cdot 2+3\\cdot 3+4\\cdot 1=4+9+4=17 h(3)=[2,3,4][2,3,1]=22+33+41=4+9+4=17
h ( 4 ) = [ 3 , 4 ] ⋅ [ 2 , 3 ] = 3 ⋅ 2 + 4 ⋅ 3 = 6 + 12 = 18 h(4)=[3,4]\\cdot [2,3]=3\\cdot 2+4\\cdot 3=6+12=18 h(4)=[3,4][2,3]=32+43=6+12=18
h ( 5 ) = [ 4 ] ⋅ [ 2 ] = 4 ⋅ 2 = 8 h(5)=[4]\\cdot [2]=4\\cdot 2=8 h(5)=[4][2]=42=8
h ( x ) = [ 1 , 5 , 11 , 17 , 18 , 8 ] h(x)=[1, 5, 11, 17, 18, 8] h(x)=[1,5,11,17,18,8]

以此类推可知二维离散卷积的计算过程,先对角翻转卷积核,在逐步向两个正方向移动,计算重叠面积

  • flip the mask (horizontally and vertically) only once(水平和垂直翻转掩模一次)
  • slide the mask onto the image(在图像上滑动掩模)
  • multiply the corresponding elements and then add them(将相应的元素相乘,然后求和)
  • repeat this procedure until all values of the image has been calculated(重复这一过程,直到所有图像值均已被计算)

多说一句,关于信号与系统中的LTIlinear time-invariant systems,线性时不变系统)和LSIlinear shift invariant system,线性位移不变系统)的不变性一直没太理解,图形化理解就是信号(函数)可以随着时间/空间移动而不改变它的原先的形状,就像卷积核一样。

卷积核为啥要翻转?

参考:

在定义卷积时为什么要对其中一个函数进行翻转?

如何通俗易懂地解释卷积?

LTILSI中,信号在时间和空间中移动不改变其特性,不断有信号随时间移动和系统产生响应,某一时刻的输出(即卷积输出)不仅包括当前信号的响应,还有之前信号的残留,所以是累加的,转换卷积核是为了计算这一过程。

如何翻转?

参考:卷积核翻转方法

在计算之前需要对卷积核进行 18 0 ∘ 180^^\\circ 180翻转

[ 1 2 3 4 5 6 7 8 9 ] 18 0 ∘ ⇒ [ 9 8 7 6 5 4 3 3 1

以上是关于图像卷积的主要内容,如果未能解决你的问题,请参考以下文章

卷积核与特征提取

空域图卷积模型

图像的锐化

OpenCV 完整例程53. Scipy 实现图像二维卷积

OpenCV 完整例程54. OpenCV 实现图像二维卷积

python——对图像进行卷积操作,使用多个滤波器