OpenCV 学习8-使用卷积进行图像滤波

1、相关概念

总结AI的回答

1.1 实际需求

在现实世界,获取的图像往往受到各种因素干扰:

  • 光线不足
  • 相机抖动
  • 传感器精度不足
  • 数据压缩带来失真
  • 环境复杂影响成像清晰度

典型应用场景

应用场景 需求
医学影像 提高CT/MRI图像质量,帮助医生看清病灶
自动驾驶 检测车道线、行人边缘
手机拍照 自动美颜、夜景模式去噪
安防监控 清晰识别车牌、人脸
工业质检 发现产品表面裂纹、缺陷

需要通过"滤波"这个工具修复缺陷、突出重点、提取特征。

1.2 什么是图像滤波

图像滤波(Image Filtering)是数字图像处理中的一项技术,通过对图像像素及其邻域像素进行数学运算,起到图像去噪、边缘检测、增强、平滑的作用。

处理过程:用一个"滤波器"在图像上滑动,计算每个位置的新像素值。

- 滤波器/卷积核 :一个小的矩阵

1.3 什么是"噪声"

在图像处理中,"噪声"是指图像中错误的像素值。这些错误的像素值并非原始场景的一部分,而是在图像捕获、传输或处理过程中产生,它导致像素的亮度、颜色信息发生了非预期的改变。

不同噪声需要不同算法

噪声类型

  1. 高斯噪声
  • 最常见的一种
  • 每个像素的噪声值服从正态分布(高斯分布)
  • 表现为图像中"雪花",整体均匀的、细密的颗粒感
  1. 椒盐噪声
  • 图像中随机出现的纯黑(0)或纯白(255)像素点
  • 表现为像撒了胡椒和盐
  1. 泊松噪声
  • 常见于低光成像

2、卷积核简介

在图像处理中,卷积核是一个二维矩阵,用于对图像进行滤波。它也被称为卷积矩阵,通常是一个正方形的 M×N 矩阵,其中 M 和 N 都是奇数(例如 3×3、5×5、7×7 等)。

卷积核可用于对图像中的每个像素进行数学运算,比如模糊或锐化图像。

2.1 使用核来锐化或模糊图像

假设有一个 3×3 的二维卷积核

python 复制代码
kernel = np.array([
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]
])

对图像进行滤波是通过将核与图像进行卷积来实现的,步骤如下:

  1. 假设核的中心位于图像中的某个特定像素(p)处。
  2. 将核中的每个元素的值与源图像中对应像素元素(即其像素强度)相乘
  3. 将这些乘法运算的结果相加,并计算出平均值
  4. 最后,将像素点(p)的值替换为您刚刚计算出的平均值

通过改变核元素的值就能实现模糊或锐化效果。

2.2 identity kernel(恒等卷积核)

恒等核是一个方形矩阵,其中中间的元素为 1,而其他所有元素均为 0。

python 复制代码
# 典型恒等核 3×3 的矩阵
kernel = np.array([
    [0, 0, 0],
    [0, 1, 0],
    [0, 0, 0]
])

当该核与图像进行卷积时,卷积后图像不变

  • 只有中心像素参与计算;
  • 权重为 1,其他邻域像素权重为 0;
  • 因此每个位置的输出就是原像素值本身。

主要用途

  • 调试卷积系统:验证 filter2D 是否正常工作:若输入=输出,则流程无误。
  • 作为基准模型:在设计新滤波器前,先用恒等核确认图像处理流程正确。
  • 组合滤波的基础

2.3 二维卷积核模糊图像

什么样的二维卷积核可以模糊图像?

模糊核的本质是"用邻域像素的加权平均代替当前像素",从而抹平局部差异,达到模糊效果。

能够模糊图像的卷积核具有以下共同特征:

特征 说明
所有元素为非负数 权重不能为负,否则可能增强边缘而非模糊
元素之和为 1 保证整体亮度不变(避免变亮或变暗)
尺寸通常为奇数方阵 3×3、5×5、7×7,便于定位中心

常见的模糊卷积核类型

均值滤波核

最简单的模糊核,所有元素相等。

python 复制代码
kernel = np.array([
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]
]) / 9  # 总和为 1
  • 效果:均匀地对每个像素取平均
  • 缺点:可能导致边缘"块状"失真(因为所有邻居权重相同)
  • 函数:cv2.blur(img, (3,3))
高斯滤波核

基于二维高斯分布设计,中心权重最大,向四周呈钟形衰减。

python 复制代码
kernel = np.array([
    [1, 2, 1],
    [2, 4, 2],
    [1, 2, 1]
]) / 16
  • 效果:自然平滑,保留更多结构信息
  • 优点:能有效去除高斯噪声,且边缘过渡更柔和
  • 函数:cv2.GaussianBlur(img, (3,3), 0)
自定义模糊核

可以自定义模糊核,只要满足条件即可。

python 复制代码
# 强调中心的模糊核
kernel = np.array([
    [0.05, 0.1, 0.05],
    [0.1,  0.4, 0.1 ],
    [0.05, 0.1, 0.05]
])
# 总和 ≈ 1.0
  • 函数: cv2.filter2D(image, -1, kernel)
模糊原理(局部加权平均)

假设有一个图像区域如下(灰度值):

python 复制代码
[100, 110, 105]
[108, 255, 102]   ← 中心是极端值(可能是噪声)
[103, 107, 106]

使用均值核处理后:

  • 新中心值 = 邻域平均 ≈ 120
  • 原来的"255"被"拉回"到正常范围
  • 突兀的像素被周围同化 → 视觉上变模糊了

3、相关函数

3.1 cv2.filter2D()函数

filter2D是实现自定义滤波器的核心工具,广泛应用于图像增强、边缘检测、模糊、锐化等任务。

filter2D 的核心是卷积(Convolution):

  1. 将 kernel 在图像上从左到右、从上到下滑动
  2. 在每个位置,将 kernel 的每个元素与对应区域的像素值相乘
  3. 所有乘积累加,得到一个新的像素值

函数定义

复制代码
dst = cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=0, borderType=cv2.BORDER_DEFAULT)
  • 参数说明
参数 类型 说明
src NumPy数组 图像
ddepth int 输出图像的深度,通常设置为 -1,表示与输入相同
kernel NumPy数组(核/掩模) 卷积核(滤波器),大小为奇数方阵(如 3×3, 5×5),类型为浮点型
dst 可选输出 输出图像,通常不传
anchor 元组 (x,y) 卷积核的锚点,默认为 (-1, -1),表示中心点。
delta float 可选偏移值,在卷积后加到结果上(可用于亮度调节)
borderType int 边界填充方式

3.2 其它函数

建议用测试代码查看效果

方法 函数 特点
均值模糊 cv2.blur() 所有像素权重相等,容易导致边缘模糊
高斯模糊 cv2.GaussianBlur() 中心权重高,边缘保留较好,最常用
中值模糊 cv2.medianBlur() 对椒盐噪声效果好,非线性滤波
双边滤波 cv2.bilateralFilter() 保边去噪,但较慢
相关推荐
柠檬07111 天前
opencv mat 统计小于0的个数
人工智能·opencv·计算机视觉
Jerryhut1 天前
背景建模实战:从帧差法到混合高斯模型的 OpenCV 实现
人工智能·opencv·计算机视觉
乞丐哥1 天前
乞丐哥的私房菜(Ubuntu OpenCV篇——Image Processing 节 之 Out-of-focus Deblur Filter 失焦去模糊滤波器 滤镜)
c++·图像处理·opencv·ubuntu·计算机视觉
厨 神1 天前
opencv学习
人工智能·opencv·学习
柠檬07112 天前
opencv 未知函数记录-detailEnhance
人工智能·opencv·计算机视觉
子夜江寒2 天前
OpenCV图像处理部分基础操作
图像处理·python·opencv
劈星斩月2 天前
OpenCV 学习11 读取和写入视频文件
opencv·读取视频·写入视频
柠檬07112 天前
opencv 未知函数记录-edgePreservingFilter
人工智能·opencv·计算机视觉
柠檬07112 天前
opencv 未知函数记录-findHomography
人工智能·opencv·计算机视觉
柠檬07112 天前
opencv 未知函数记录-estimateAffinePartial2D
人工智能·opencv·计算机视觉