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() 保边去噪,但较慢
相关推荐
没有不重的名么1 天前
Multiple Object Tracking as ID Prediction
深度学习·opencv·计算机视觉·目标跟踪
愚者游世1 天前
Opencv知识点大纲
人工智能·opencv·计算机视觉
格林威1 天前
Baumer相机电池极耳对齐度检测:提升叠片工艺精度的 5 个实用方案,附 OpenCV+Halcon 实战代码!
人工智能·opencv·机器学习·计算机视觉·视觉检测·工业相机·堡盟相机
403240731 天前
【Jetson开发避坑】虚拟环境(Conda/Venv)调用系统底层OpenCV与TensorRT的终极指南
人工智能·opencv·conda
格林威2 天前
Baumer相机电机转子偏心检测:实现动平衡预判的 5 个核心方法,附 OpenCV+Halcon 实战代码!
人工智能·深度学习·opencv·机器学习·计算机视觉·视觉检测·工业相机
侯孟禹2 天前
Gemini写的抠图工具
qt·opencv
qwy7152292581632 天前
17-像素点和ROI操作
人工智能·opencv·计算机视觉
茶栀(*´I`*)2 天前
OpenCV实战:从视频读写到高级目标追踪(MeanShift与CamShift详解)
图像处理·opencv·计算机视觉
Qt学视觉2 天前
3D3-PCL全面总结
c++·opencv·3d
智驱力人工智能2 天前
景区节假日车流实时预警平台 从拥堵治理到体验升级的工程实践 车流量检测 城市路口车流量信号优化方案 学校周边车流量安全分析方案
人工智能·opencv·算法·安全·yolo·边缘计算