图像处理中的卷积应用

计算机视觉领域,卷积神经网络(CNN)是一个热门话题。卷积作为一种基本的数学操作,在图像处理中扮演着重要角色。卷积操作涉及两个整数数组的乘法,这两个数组可以大小不同,但必须具有相同的维度,从而产生第三个相同维度的数组。卷积的应用非常广泛,包括信号处理、统计学、概率论、工程学、物理学、计算机视觉、图像处理、声学等多个领域。在图像处理中,卷积被用于图像滤波、去噪、图像识别、图像分割等任务。

图像滤波是一种通过改变特定图像的像素值来实现模糊、锐化、浮雕或增强边缘效果的技术。它改变了原始图像的外观。如今,许多图像滤镜在社交媒体应用中占据主导地位。例如,使用Instagram的用户可能对其中使用的图像滤镜有所了解。图像滤波是特定于应用的,有时需要模糊图像,有时希望图像更加清晰。

使用和查看图像上的滤镜非常简单。了解背后的数学和图像处理知识是非常吸引人的。图像滤镜使用各种卷积核来执行不同的图像滤镜效果。卷积核,有时也称为滤镜,与图像一起使用,以实现模糊、锐化、浮雕、边缘检测等效果。这是通过卷积核和图像的卷积来完成的。卷积核通常是3×3的矩阵,卷积过程的正式描述如下:

g(x,y) = w * f(x,y)

其中,g(x,y)代表过滤后的输出图像,f(x,y)代表原始图像,w代表滤镜核。下图展示了卷积的工作方式。

通过上述图像,可以清楚地看到,如果改变核,输出也会随之改变。有许多用于锐化、模糊或平滑图像的卷积核。下表显示了各种核及其效果。

不同图像滤波的卷积实现

盒式模糊是一种简单的模糊效果,其中每个像素被设置为其周围像素的平均值。它可以被描述为两个函数f[n]和g[n]的离散卷积,其中f[n]代表图像的离散像素值,g[n]是核,是一个矩阵。

实现步骤如下:

  1. 打开Google Colab笔记本
  2. 导入库
  3. 读取图像并绘制它
  4. 制作核并应用卷积

下面是实现盒式模糊的代码示例:

import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('/content/1.PNG') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) fig, ax = plt.subplots(1, figsize=(12,8)) plt.imshow(image) abc = np.ones((3,3)) kernel = np.ones((3, 3), np.float32) / 9 img = cv2.filter2D(image, -1, kernel) fig, ax = plt.subplots(1,2,figsize=(10,6)) ax[0].imshow(image) ax[1].imshow(img)

盒式模糊的输出结果如下:

图像锐化用于增强图像的清晰度。图像锐化的原因有三:一是克服相机引入的模糊;二是吸引人们对特定区域的注意;三是提高可读性。任何现代相机的原始数据总是略微不清晰。在图像捕获过程的每个阶段都会引入模糊。首先,光线通过镜头元件时会失去一些定义,无论镜头多么精细。其次,传感器处理落在其上的光子时,最清晰的过渡被平均并略微模糊。最后,当三个不同的颜色通道被插值以创建最终图像时,会引入适度的模糊。

其次,对比度吸引人类眼球。当看一张照片时,注意力会被最精细的元素吸引。因此,如果想引导观众的注意力,选择性锐化是实现这一目标的绝佳技术之一。

最后,增强图像可以提高重要元素的可见性。例如,文本变得更容易阅读,单独的叶子变得更明显,人群中的面孔变得更加清晰。锐化是使用以下核来完成的。

以下是实现图像锐化的代码示例:

import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('/content/1.PNG') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) img = cv2.filter2D(image, -1, kernel) fig, ax = plt.subplots(1,2,figsize=(10,6)) ax[0].imshow(image) ax[1].imshow(img)

图像锐化的输出结果如下:

浮雕意味着形成一个从表面突出的3D模具。当浮雕滤镜应用于图片时,得到的图像类似于浮雕——原始图像的纸张或金属浮雕,其中特征以高浮雕(更突出)或低浮雕(不太突出)的形式突出显示。以下是用于图像浮雕的卷积核。

以下是实现图像浮雕的代码示例:

import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('/content/1.PNG') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) kernel = np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]) img = cv2.filter2D(image, -1, kernel) fig, ax = plt.subplots(1,2,figsize=(10,6)) ax[0].imshow(image) ax[1].imshow(img)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485