图像处理之卷积矩阵

简介

卷积矩阵(Convolution Matrix)数字图像处理当中很重要的一个技术,想必大家都使用过图像处理软件上面的平滑、模糊、锐化、浮雕,斜面、去燥和边缘提取等效果,其基本原理都是通过卷积矩阵运算对每个像素进行变换后得到,本文主要讲述原理,不涉及具体语言实现。

卷积核

卷积矩阵运算是一个二维图像和一个二维的滤波器矩阵对于图像的每一个像素点以及邻近的像素点根据公式完成运算并得到最终像素的过程。这个用来处理图像的二维滤波器矩阵就叫卷积核,我们用$ N \times M $来表示矩阵的行和列,例如一个 $ 3 \times 3 $ 的卷积核如下:

$$
\left[\begin{array}{ccc}
4 & 0 & 0 \\
0 & 0 & 0 \\
0 & 0 & -4
\end{array}\right]
$$

如何运算我们先来看一张图

用卷积核的中心对应要处理的像素值(1),然后像素和相邻的像素根据卷积核的权重运算得到最终的像素(-8);
那么我们知道图像有 RGBA 四个通道可以得到四个像素值,每个通道的像素值分别做一次运算就得到最终的像素结果了,现在是不是很清晰了。如何运算,就是根据下面公式

运算公式

下面卷积矩阵运算公式,$source_{i, j}$ 表示图像某个像素值,$K_{i,j}$ 表示卷积核某个值;

$$
result = \frac{\sum_{i=0}^{i < N}\sum_{j=0}^{j < M} source_{i, j} \times K_{i,j}}{divisor + bias}
$$

我们发现$source_{i, j}$ 和 $K_{i,j}$ 下标都是 i 和 j 表示图像和卷积核一样大小来处理的,也就是在图像挖一块和卷积核一样大小的局部处理,然后处理很多块再组成一幅新图像;实际上如果图像矩阵和卷积核是不一样大小的,那么处理公式的 $source_{i, j}$ 下标和 $K_{i,j}$ 下标要做处理就可以了;

以上面像素值从1计算得到-8为例,代入公式就可以知道结果,其中 divisor = 4+0+0+0+0+0+0+0+0-4=0,当 divisor = 0 时候由于除数不能为0,所以默认是1;bias 是偏移量用来调节图像的灰度透明等效果,默认是0

$$
result = \frac{4 \times 0 + 0 \times 0 + 0 \times 0 + 0 \times 0 + 0 \times 1 + 0 \times 1 + 0 \times 0 + 0 \times 1 + (-4 \times 2)}{1 + 0} = -8
$$

边界补充问题

疑问来了,我们发现这样处理一个$7 \times 7$ 的像素矩阵4边都会留有一个像素无办法处理,也就是上面的例子运算出来是以个 $5 \times 5$ 的图像,这显然不是我们想要的结果,为了避免这种情况,需要先对原始图片做边界填充处理。在上面的情况中,我们需要先把原始图像填充为 $9 \times 9$ 的尺寸再做运算那就和原来的尺寸一样了。填充方法有下面几种,简单用下面一个$3 \times 3$图像矩阵举例,如果要满足要求要填充为 $5 \times 5$的图像矩阵:

$$
\left[\begin{array}{ccc}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9
\end{array}\right]
$$

补零填充
在边缘用0来填充
补零填充

复制填充
复制边界像素来填充
复制填充

镜像填充
图像镜像像素复制后截取
镜像填充

块填充
整块图像像素复制后截取
块填充

讨论

留下评论

电子邮件地址不会被公开。 必填项已用*标注