图像处理——卷积

文章目录[x]
  1. 1:卷积简介
  2. 2:卷积实战与效果展示
  3. 2.1:卷积核数值和
  4. 3:总结

大家好,我是Ace,这篇文章通过实例讲解图像处理中的卷积的定义和作用。

卷积简介

我们先来看两个一维信号的卷积,公式如下:

$$\int^{\infty}_{-\infty}{f(t)g(x-t)dt}$$

将其中一个信号先关于原点对称,进行一定平移,再与另一个信号积分,这就完成了卷积。

我们再看看互相关运算,公式如下:

$$\int^{\infty}_{-\infty}{f(t)g(t-x)dt}$$

将其中一个信号进行一定平移,再与另一个信号积分,我们一般使用互相关计算两个信号在平移一定程度时变化趋势是否相似,是否具有相似的变化特征。

我们再将两个一维信号的卷积推广至二维,公式如下:

$$\int^{\infty}_{-\infty}\int^{\infty}_{-\infty}{f(n,m)g(x-n,y-m)dndm}$$

这时候它做的就是先对一个二维信号关于原点对称,之后在自变量的方向上做一定平移,再与另一个二维信号做积分。

现在将互相关运算推广至二维,公式如下:

$$\int^{\infty}_{-\infty}\int^{\infty}_{-\infty}{f(n,m)g(n-x,m-y)dndm}$$

它同样能够计算出两个信号在平移一定程度时变化趋势是否相似,是否具有相似的变化特征。

我们如果把二维互相关的运算的f(n,m)指定为一幅灰度图像的亮度强度幅值,而将g(n,m)指定为以下3x3核:

$$\left[ \begin{matrix} -1 & 0 & 1 \\ -1 & 0 & 1  \\ -1 & 0 & 1 \end{matrix} \right]$$

它输出的结果则为灰度图像与该核的相似程度,特征相似程度,输出值越大的地方,该局部区域与核越相似。

卷积实战与效果展示

让我们使用Python调用OpenCV实际模拟该过程:

import cv2 as cv
import numpy as np
import os

from cv_static_resource import test_image_filepath, test_image_output_dir


def edge_conv_1(img):
    kernel = np.array(
        [
            [-1, 0, 1],
            # 数字从左向右增大
            [-1, 0, 1],
            # 上下数字没有变化
            [-1, 0, 1],
        ]
    )
    img = cv.filter2D(
        img,
        # 表示图像位深不变
        ddepth=-1,
        kernel=kernel,
    )
    return img


def edge_conv_2(img):
    kernel = np.array(
        [
            [-1, 0, 2],
            # 数字从左向右增大
            [-1, 0, 2],
            # 上下数字没有变化
            [-1, 0, 2],
        ]
    )
    # print(kernel)
    kernel = kernel / np.sum(kernel)
    img = cv.filter2D(
        img,
        # 表示图像位深不变
        ddepth=-1,
        kernel=kernel,
    )
    return img


if __name__ == "__main__":
    gray = cv.imread(test_image_filepath, flags=cv.IMREAD_GRAYSCALE)

    output_filename = "gray.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, gray)

    edge_1 = edge_conv_1(gray)

    output_filename = "output_edge_1.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, edge_1)

    edge_2 = edge_conv_2(gray)

    output_filename = "output_edge_2.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, edge_2)

 

我们用于进行二维互相关的函数f(n,m)就为如下灰度图:

通过与3x3核做互相关之后,获得如下结果:

我们可以发现,在原图中的一部分边缘亮度较高,其他部分亮度较低,边缘越接近竖直的位置,亮度就越大,这说明这些区域与核越相似,该核为一个简单的竖向边缘检测器,当与其相乘的3x3区域具有从左向右亮度值增大的趋势,那它们的结果就越大,因此得到的结果的图像该区域的亮度值就越大。

那你说了这么多,这明明是互相关运算,和卷积有什么关系呢?

实际上,通常在图像处理领域所说的卷积,其实就是信号处理领域的互相关运算,而且不是信号处理领域的卷积运算,这一点请诸位仔细区分。

卷积核数值和

上图为edge_conv_2的输出结果,为什么和edge_conv_1差别那么大呢?

edge_conv_2其实和原图差不多。

如果我们的卷积核的所有数值的之和为1,我们会发现处理后的图片和原图差不多,很相似,但是如果和不为一,就会产生较大的差别。这是因为图像的亮度范围在位深确定的情况下是一定的,例如8bit的灰度图亮度范围就是0~255,如果超过或小于该范围的值那就会被截断,没有意义了,信息量就会损失。

但是如果卷积核的所有数值的之和为1,那么输出的结果的亮度范围并没有改变,所以图像和原图差别并没有edge_conv_1的结果差别大。

总结

1.卷积可以检测出原图像的某个局部区域与卷积核的特征相似程度。

2.若卷积核数值和为1,图像的亮度的范围不会改变。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

16 − 1 =