人工智能之视觉领域 计算机视觉
第六章 图像平滑处理
文章目录
- [人工智能之视觉领域 计算机视觉](#人工智能之视觉领域 计算机视觉)
- 前言:图像平滑处理(去噪)
- [1. 通俗理解:什么是图像平滑?](#1. 通俗理解:什么是图像平滑?)
- [2. 常见噪声类型与对应策略](#2. 常见噪声类型与对应策略)
- [3. 三大平滑滤波方法详解](#3. 三大平滑滤波方法详解)
- [3.1 均值滤波(Mean / Box Filter)](#3.1 均值滤波(Mean / Box Filter))
- [🔧 函数:`cv2.blur(src, ksize)`](#🔧 函数:
cv2.blur(src, ksize))- [3.2 高斯滤波(Gaussian Blur)](#3.2 高斯滤波(Gaussian Blur))
- [🔧 函数:`cv2.GaussianBlur(src, ksize, sigmaX)`](#🔧 函数:
cv2.GaussianBlur(src, ksize, sigmaX))- [3.3 中值滤波(Median Blur)](#3.3 中值滤波(Median Blur))
- [🔧 函数:`cv2.medianBlur(src, ksize)`](#🔧 函数:
cv2.medianBlur(src, ksize))- [4. 三种滤波效果对比(Mermaid 流程图)](#4. 三种滤波效果对比(Mermaid 流程图))
- [5. 完整代码实战:去噪效果对比](#5. 完整代码实战:去噪效果对比)
- [6. 补充:何时使用哪种滤波?](#6. 补充:何时使用哪种滤波?)
- [7. 高级技巧:自适应高斯滤波(按区域调整强度)](#7. 高级技巧:自适应高斯滤波(按区域调整强度))
- [8. 常见误区提醒](#8. 常见误区提醒)
- [✅ 本章总结](#✅ 本章总结)
- 资料关注
前言:图像平滑处理(去噪)
学习目标:理解"图像噪声"的来源与类型,掌握三种主流平滑滤波方法(均值、高斯、中值),能根据噪声特点选择合适的去噪策略,为后续边缘检测、特征提取等任务提供干净图像。
1. 通俗理解:什么是图像平滑?
想象你用手机拍了一张夜景照片,放大后发现有很多 彩色小点 (噪点);
或者扫描一张老报纸,纸上出现很多 黑白杂点。
✅ 图像平滑 = 给图像"磨皮"或"柔化"
目的:抑制噪声、模糊细节、使图像更平滑
但注意:平滑 ≠ 越模糊越好 !
我们要在"去噪"和"保留细节"之间找平衡。
2. 常见噪声类型与对应策略
| 噪声类型 | 视觉表现 | 成因 | 推荐滤波方法 |
|---|---|---|---|
| 高斯噪声 | 随机分布的微小亮度变化(像雾) | 传感器热噪声、电子干扰 | 高斯滤波 |
| 椒盐噪声 | 随机出现的纯黑/纯白像素点 | 信号传输错误、坏像素 | 中值滤波 |
| 均匀噪声 | 像素值在固定范围内随机波动 | 量化误差 | 均值或高斯滤波 |
🎯 核心思想 :
滤波器通过 邻域像素加权平均 来替代中心像素,从而"平均掉"异常值。
3. 三大平滑滤波方法详解
3.1 均值滤波(Mean / Box Filter)
原理 :用一个方形窗口(如 5×5),对窗口内所有像素取算术平均值,替换中心像素。
- 简单粗暴,计算快
- 缺点:严重模糊边缘和细节
🔧 函数:cv2.blur(src, ksize)
python
blurred = cv2.blur(img, (5, 5)) # 5x5 均值核
ksize:核大小(必须是正奇数,如 3, 5, 7)
3.2 高斯滤波(Gaussian Blur)
原理 :使用高斯函数 作为权重,中心像素权重最大,越远权重越小。
👉 既能去噪,又能较好保留边缘!
- 最常用、最推荐的通用去噪方法
- 参数少,效果稳定
🔧 函数:cv2.GaussianBlur(src, ksize, sigmaX)
python
gaussian = cv2.GaussianBlur(img, (5, 5), 0)
| 参数 | 说明 |
|---|---|
ksize |
核大小(如 (5,5),必须为正奇数) |
sigmaX |
X 方向的标准差• 设为 0 → 自动根据 ksize 计算• 值越大 → 模糊越强 |
💡 经验法则:
- 轻微去噪:
ksize=(3,3)- 中等去噪:
ksize=(5,5)- 强去噪:
ksize=(7,7)或增大sigmaX
3.3 中值滤波(Median Blur)
原理 :将窗口内所有像素排序,取中位数 作为新值。
👉 对椒盐噪声(孤立的极亮/极暗点)效果极佳!
- 不产生新像素值(只从原图选)
- 能有效去除"斑点",同时保留边缘
🔧 函数:cv2.medianBlur(src, ksize)
python
median = cv2.medianBlur(img, 5) # ksize 是整数(如 3, 5, 7)
⚠️ 注意:
ksize是单个整数(因为核是正方形),且必须 ≥ 3
4. 三种滤波效果对比(Mermaid 流程图)
椒盐噪声
高斯/均匀噪声
是
否
含噪声图像
噪声类型?
中值滤波 cv2.medianBlur
是否需保留边缘?
高斯滤波 cv2.GaussianBlur
均值滤波 cv2.blur
输出平滑图像
5. 完整代码实战:去噪效果对比
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1. 创建或读取带噪声的图像
def add_salt_pepper_noise(image, prob=0.02):
"""添加椒盐噪声"""
output = image.copy()
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = np.random.rand()
if rdn < prob:
output[i][j] = 0 # 椒(黑)
elif rdn > thres:
output[i][j] = 255 # 盐(白)
return output
# 读取图像(或创建测试图)
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
if img is None:
# 若无图,创建一个渐变图
img = np.zeros((300, 300), dtype=np.uint8)
for i in range(300):
img[i, :] = i // 3 # 垂直渐变
# 添加椒盐噪声
noisy = add_salt_pepper_noise(img)
# 2. 应用三种滤波
blur_mean = cv2.blur(noisy, (5, 5))
blur_gauss = cv2.GaussianBlur(noisy, (5, 5), 0)
blur_median = cv2.medianBlur(noisy, 5)
# 3. 使用 matplotlib 显示(灰度图)
images = [img, noisy, blur_mean, blur_gauss, blur_median]
titles = ['Original', 'Noisy (Salt & Pepper)',
'Mean Blur', 'Gaussian Blur', 'Median Blur']
plt.figure(figsize=(15, 6))
for i in range(len(images)):
plt.subplot(2, 3, i+1)
plt.imshow(images[i], cmap='gray')
plt.title(titles[i])
plt.axis('off')
plt.tight_layout()
plt.show()
# 4. 保存结果
cv2.imwrite('denoised_mean.jpg', blur_mean)
cv2.imwrite('denoised_gauss.jpg', blur_gauss)
cv2.imwrite('denoised_median.jpg', blur_median)
✅ 运行效果预期:
- 均值滤波:整体模糊,噪点减少但边缘发虚
- 高斯滤波:较自然,噪点减弱,边缘尚可
- 中值滤波:椒盐点几乎消失,边缘清晰锐利!
6. 补充:何时使用哪种滤波?
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 人脸美颜(轻微磨皮) | 高斯滤波 (3,3) |
保留五官轮廓,柔化皮肤 |
| 去除扫描文档上的黑点 | 中值滤波 k=3 |
消除孤立噪点,文字不变形 |
| 预处理用于边缘检测 | 高斯滤波 (5,5) |
先去噪再检测,避免假边缘 |
| 快速实时视频去噪 | 均值滤波 (3,3) |
计算最快,适合性能受限场景 |
7. 高级技巧:自适应高斯滤波(按区域调整强度)
对于复杂图像,可结合边缘检测,只在平滑区域强滤波,边缘区域弱滤波:
python
# 简易自适应思路:边缘处用小核,非边缘用大核
edges = cv2.Canny(img, 50, 150)
smooth = cv2.GaussianBlur(img, (7, 7), 0)
# 边缘区域保留原图,非边缘用平滑图
result = np.where(edges == 255, img, smooth)
这是"双边滤波(Bilateral Filter)"的思想雏形,OpenCV 也提供
cv2.bilateralFilter(),但计算较慢。
8. 常见误区提醒
| 误区 | 正确认知 |
|---|---|
| "滤波核越大越好" | 过大会导致严重模糊,丢失关键信息 |
| "中值滤波能去所有噪声" | 对高斯噪声效果一般,仅擅长椒盐噪声 |
| "平滑后图像更'清晰'" | 平滑 = 模糊!清晰度下降,但信噪比提升 |
| "彩色图不能直接滤波" | 可以!OpenCV 会自动对每个通道分别处理 |
✅ 本章总结
| 滤波方法 | 核心思想 | 优点 | 缺点 | 适用噪声 |
|---|---|---|---|---|
| 均值滤波 | 邻域平均 | 快速简单 | 模糊严重 | 均匀噪声 |
| 高斯滤波 | 加权平均(中心权重高) | 保边去噪 | 对椒盐噪声弱 | 高斯噪声 |
| 中值滤波 | 取中位数 | 消除椒盐点、保边 | 计算稍慢 | 椒盐噪声 |
🌟 现在可以:
- 给一张噪点多的照片"一键磨皮"
- 为 OCR 或目标检测提供干净输入
- 根据噪声类型,选择最合适的"去噪武器"!
资料关注
咚咚王
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》