1、相关概念
总结AI的回答
1.1 实际需求
在现实世界,获取的图像往往受到各种因素干扰:
- 光线不足
- 相机抖动
- 传感器精度不足
- 数据压缩带来失真
- 环境复杂影响成像清晰度
典型应用场景
| 应用场景 | 需求 |
|---|---|
| 医学影像 | 提高CT/MRI图像质量,帮助医生看清病灶 |
| 自动驾驶 | 检测车道线、行人边缘 |
| 手机拍照 | 自动美颜、夜景模式去噪 |
| 安防监控 | 清晰识别车牌、人脸 |
| 工业质检 | 发现产品表面裂纹、缺陷 |
需要通过"滤波"这个工具修复缺陷、突出重点、提取特征。
1.2 什么是图像滤波
图像滤波(Image Filtering)是数字图像处理中的一项技术,通过对图像像素及其邻域像素进行数学运算,起到图像去噪、边缘检测、增强、平滑的作用。
处理过程:用一个"滤波器"在图像上滑动,计算每个位置的新像素值。
- 滤波器/卷积核 :一个小的矩阵
1.3 什么是"噪声"
在图像处理中,"噪声"是指图像中错误的像素值。这些错误的像素值并非原始场景的一部分,而是在图像捕获、传输或处理过程中产生,它导致像素的亮度、颜色信息发生了非预期的改变。
不同噪声需要不同算法
噪声类型
- 高斯噪声
- 最常见的一种
- 每个像素的噪声值服从正态分布(高斯分布)
- 表现为图像中"雪花",整体均匀的、细密的颗粒感
- 椒盐噪声
- 图像中随机出现的纯黑(0)或纯白(255)像素点
- 表现为像撒了胡椒和盐
- 泊松噪声
- 常见于低光成像
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]
])
对图像进行滤波是通过将核与图像进行卷积来实现的,步骤如下:
- 假设核的中心位于图像中的某个特定像素(p)处。
- 将核中的每个元素的值与源图像中对应像素元素(即其像素强度)相乘
- 将这些乘法运算的结果相加,并计算出平均值
- 最后,将像素点(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):
- 将 kernel 在图像上从左到右、从上到下滑动
- 在每个位置,将 kernel 的每个元素与对应区域的像素值相乘
- 所有乘积累加,得到一个新的像素值
函数定义
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() | 保边去噪,但较慢 |