卷积用于许多事情, 例如计算导数, 检测边缘, 应用模糊等, 而所有这些操作都是使用“卷积内核”完成的。卷积核是一个很小的矩阵, 在这个矩阵中, 每个单元都有一个数字以及一个锚点。
锚点用于了解内核相对于图像的位置。它从图像的左上角开始, 并在每个像素上顺序移动。内核在图像上的每个位置重叠几个像素。重叠的每个像素相乘然后相加。并将总和设置为当前位置的值。
卷积是将图像的每个元素添加到其本地邻居中, 然后由内核对其进行加权的过程。它与一种数学卷积形式有关。
在卷积中, 矩阵不执行传统的矩阵乘法, 但用*表示。
假设有两个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循环会导致大量重复计算, 并且图像和内核的大小也会增加。使用离散傅里叶变换技术可以快速完成卷积运算。在这种技术中, 整个卷积运算被转换为简单的乘法。
在卷积中, 由于内核是二维的, 因此当内核靠近边缘或拐角时会出现问题。
为了克服这些问题, 可以做以下事情:
- 一个人可以忽略
- 可以在边缘附近创建额外的像素。
可以通过以下方式创建额外的像素:
- 边缘像素重复。
- 反射边缘
- 可以从另一端复制像素。
评论前必须登录!
注册