📅  最后修改于: 2020-12-30 10:43:53             🧑  作者: Mango
卷积用于许多事情,例如计算导数,检测边缘,应用模糊等,所有这些操作都使用“卷积内核”完成。卷积核是一个很小的矩阵,在这个矩阵中,每个单元都有一个数字以及一个锚点。
锚点用于了解内核相对于图像的位置。它从图像的左上角开始,并在每个像素上顺序移动。内核在图像上的每个位置重叠几个像素。每个重叠的像素相乘然后相加。并将总和设置为当前位置的值。
卷积是将图像的每个元素添加到其本地邻居中,然后由内核对其进行加权的过程。它与一种数学卷积形式有关。
在卷积中,矩阵不执行传统的矩阵乘法,但用*表示。
假设有两个3×3矩阵,一个是内核,另一个是图像。在卷积中,内核的行和列被翻转,然后相乘,然后进行求和。出现在矩阵中心即图像[2,2]中的元素将被加权为图像矩阵的组合,权重将由内核给出。同样,矩阵的所有其他元素将被加权,然后将计算权重。
以下是描述卷积过程的伪代码:
For each image row in input image:
For each pixel in image row:
Set accumulator to zero
For each kernel row in kernel:
For each element in kernel row:
If element position corresponding* to pixel position then
Multiply element value corresponding*to pixelvalue
Add result to accumulator
Endif
Set output image pixel to accumulator
可以使用多个for循环来计算卷积。但是使用for循环会导致大量重复计算,并且图像和内核的大小也会增加。使用离散傅立叶变换技术可以快速完成卷积运算。在这种技术中,整个卷积运算被转换为简单的乘法。
在卷积中,由于内核是二维的,因此当内核靠近边缘或拐角时会出现问题。
为了克服这些问题,可以做以下事情:
可以通过以下方式创建额外的像素: