(6-3)采样、变换和卷积处理:卷积

6.3 卷积

卷积是一种数学运算,用于信号处理、图像处理和其他领域中。在信号和图像处理中,卷积常用于信号的滤波、特征提取和图像处理等任务。

6.3.1 为什么需要卷积图像

卷积在图像处理中起着重要的作用,可以用于多种图像处理任务。卷积在图像处理中的常见功能如下:

  1. 模糊和平滑:通过应用卷积核,可以对图像进行模糊和平滑处理。常见的卷积核包括均值滤波器和高斯滤波器,可以降低图像中的噪声,并使图像变得更加平滑。
  2. 锐化和边缘检测:卷积核可以用于提取图像中的边缘和细节信息。通过应用一些特定的卷积核,如Sobel、Prewitt和Laplacian卷积核,可以增强图像中的边缘,并使其更加清晰和突出。
  3. 图像增强:卷积可以用于增强图像的特定特征。例如,可以使用卷积核来增强图像的纹理、对比度或颜色饱和度,以改善图像的视觉效果。
  4. 特征提取:卷积在图像识别和计算机视觉中被广泛用于特征提取。通过将图像与一组预定义的卷积核进行卷积运算,可以提取出图像中的各种特征,如边缘、角点、纹理等。这些特征可以用于对象检测、图像分类和图像分割等任务。
  5. 图像重建和去噪:通过卷积运算,可以将模糊、噪声或低分辨率图像恢复为更清晰、更高质量的图像。例如,可以使用反卷积技术对模糊图像进行逆滤波,或使用卷积核进行图像超分辨率重建。

上述功能仅是卷积在图像处理中的一些常见应用,卷积还有很多其他的用途,具体取决于所使用的卷积核和处理目标。通过调整卷积核的参数和选择不同的卷积核,可以实现不同的图像处理效果。

6.3.2 使用SciPy进行卷积

Python程序中,可以使用SciPy中的函数convolve2d()对二维图像实现卷积操作。函数convolve2d()的语法格式如下:

scipy.signal.convolve2d(in1, in2, mode='full', boundary='fill', fillvalue=0)
  1. in1:输入数组,表示要进行卷积操作的第一个输入。
  2. in2:卷积核,表示要进行卷积操作的第二个输入。
  3. mode:卷积模式,默认为'full',表示输出的大小与输入数组的大小相同。其他可选值为'valid'和'same',分别表示输出大小将根据输入数组和卷积核的大小进行调整。
  4. boundary:边界处理方式,默认为'fill',表示使用填充值进行边界处理。其他可选值为'wrap'和'symm',分别表示使用循环填充和对称填充进行边界处理。
  5. fillvalue:填充值,在boundary='fill'时使用,用于指定边界填充的数值。
  6. 返回值:返回卷积操作的结果数组。

在使用函数convolve2d()时,in1和in2可以是二维数组、二维图像或多通道图像。在进行卷积操作时,输入数组和卷积核进行逐元素相乘,并将乘积结果求和得到卷积结果。卷积操作可以用于信号处理、图像处理、卷积神经网络等领域。例如下面是一个使用函数convolve2d()进行卷积操作的例子,对库skimage中的内置素材图像camera进行了卷积操作。

实例6-13:对库skimage中的内置素材图像camera进行了卷积操作

源码路径:daima\6\con1.py

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from skimage import data
# 设置中文字体
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
# 读取图像
image = data.camera()
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],
                   [0, -1, 0]])

# 执行卷积操作
result = signal.convolve2d(image, kernel, mode='same')

# 可视化输入图像和卷积结果
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('输入图像')

axes[1].imshow(result, cmap='gray')
axes[1].set_title('卷积结果')

plt.tight_layout()
plt.show()

在本实例中,卷积核采用了一个简单的边缘检测算子。执行卷积操作后,通过Matplotlib库将输入图像和卷积结果进行可视化展示。执行效果如图6-5所示。

图6-5  执行效果

6.3.3 使用SciPy 中的函数ndimage.convolve()进行卷积

Python程序中,还可以使用SciPy 中的函数ndimage.convolve()进行卷积。使用函数ndimage.convolve()的语法格式如下:

scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)
  1. input:输入数组,表示要进行卷积操作的数组。
  2. weights:卷积核,表示要进行卷积操作的权重数组。
  3. output:输出数组,可选参数,用于存储卷积结果。如果未提供,则会创建一个新的数组来存储结果。
  4. mode:边界处理模式,默认为'reflect',表示使用镜像反射模式进行边界处理。其他可选值包括'constant'、'nearest'、'mirror'和'wrap',分别表示常数扩展、最近邻扩展、镜像反射扩展和循环扩展。
  5. cval:当mode='constant'时,用于指定常数扩展模式下的填充值。
  6. origin:卷积核的原点位置,默认为(0, 0),表示卷积核的中心位置。
  7. 返回值:返回卷积操作的结果数组。

函数ndimage.convolve()可以用于对任意维度的数组进行卷积操作,可以应用于图像处理、信号处理等领域。例如下面是一个使用函数scipy.ndimage.convolve()进行图像卷积的例子,使用了一张具体的图像111.jpg作为输入,并采用边界模式为'mirror'。

实例6-14:对指定的图像进行卷积操作

源码路径:daima\6\ndi.py

import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage

# 读取图像
image = plt.imread('111.jpg')

# 将图像转换为灰度图
image_gray = np.mean(image, axis=2)

# 定义卷积核
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],
                   [0, -1, 0]])

# 执行卷积操作
result = ndimage.convolve(image_gray, kernel, mode='mirror')

# 显示原始图像和卷积结果
plt.subplot(1, 2, 1)
plt.imshow(image_gray, cmap='gray')
plt.title('Original Image')

plt.subplot(1, 2, 2)
plt.imshow(result, cmap='gray')
plt.title('Convolved Image')

plt.show()

在上述代码中,首先使用函数np.mean()将彩色图像转换为灰度图像,以便与定义的卷积核进行匹配。然后,使用函数ndimage.convolve()对灰度图像进行卷积操作,并将结果存储在 result 变量中。最后,我们使用函数plt.imshow()显示原始图像和卷积结果。执行效果如图6-6所示。

图6-6  执行效果

未完待续

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值