欢迎光临
我们一直在努力

人工智能之视觉领域 计算机视觉 第六章 图像平滑处理

人工智能之视觉领域 计算机视觉

第六章 图像平滑处理


文章目录

  • 人工智能之视觉领域 计算机视觉
  • 前言:图像平滑处理(去噪)
    • 1. 通俗理解:什么是图像平滑?
    • 2. 常见噪声类型与对应策略
    • 3. 三大平滑滤波方法详解
      • 3.1 均值滤波(Mean / Box Filter)
        • 🔧 函数:`cv2.blur(src, ksize)`
      • 3.2 高斯滤波(Gaussian Blur)
        • 🔧 函数:`cv2.GaussianBlur(src, ksize, sigmaX)`
      • 3.3 中值滤波(Median Blur)
        • 🔧 函数:`cv2.medianBlur(src, ksize)`
    • 4. 三种滤波效果对比(Mermaid 流程图)
    • 5. 完整代码实战:去噪效果对比
    • 6. 补充:何时使用哪种滤波?
    • 7. 高级技巧:自适应高斯滤波(按区域调整强度)
    • 8. 常见误区提醒
    • ✅ 本章总结
  • 资料关注

前言:图像平滑处理(去噪)

学习目标:理解“图像噪声”的来源与类型,掌握三种主流平滑滤波方法(均值、高斯、中值),能根据噪声特点选择合适的去噪策略,为后续边缘检测、特征提取等任务提供干净图像。


1. 通俗理解:什么是图像平滑?

想象你用手机拍了一张夜景照片,放大后发现有很多 彩色小点(噪点); 或者扫描一张老报纸,纸上出现很多 黑白杂点。

✅ 图像平滑 = 给图像“磨皮”或“柔化” 目的:抑制噪声、模糊细节、使图像更平滑

但注意:平滑 ≠ 越模糊越好! 我们要在“去噪”和“保留细节”之间找平衡。


2. 常见噪声类型与对应策略

噪声类型视觉表现成因推荐滤波方法
高斯噪声 随机分布的微小亮度变化(像雾) 传感器热噪声、电子干扰 高斯滤波
椒盐噪声 随机出现的纯黑/纯白像素点 信号传输错误、坏像素 中值滤波
均匀噪声 像素值在固定范围内随机波动 量化误差 均值或高斯滤波

🎯 核心思想: 滤波器通过 邻域像素加权平均 来替代中心像素,从而“平均掉”异常值。


3. 三大平滑滤波方法详解

3.1 均值滤波(Mean / Box Filter)

原理:用一个方形窗口(如 5×5),对窗口内所有像素取算术平均值,替换中心像素。

  • 简单粗暴,计算快
  • 缺点:严重模糊边缘和细节
🔧 函数:cv2.blur(src, ksize)

blurred = cv2.blur(img, (5, 5)) # 5×5 均值核

ksize:核大小(必须是正奇数,如 3, 5, 7)


3.2 高斯滤波(Gaussian Blur)

原理:使用高斯函数作为权重,中心像素权重最大,越远权重越小。 👉 既能去噪,又能较好保留边缘!

  • 最常用、最推荐的通用去噪方法
  • 参数少,效果稳定
🔧 函数:cv2.GaussianBlur(src, ksize, sigmaX)

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)

median = cv2.medianBlur(img, 5) # ksize 是整数(如 3, 5, 7)

⚠️ 注意:ksize 是单个整数(因为核是正方形),且必须 ≥ 3


4. 三种滤波效果对比(Mermaid 流程图)

#mermaid-svg-zO2VgjlNA1BuBXGv{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zO2VgjlNA1BuBXGv .error-icon{fill:#552222;}#mermaid-svg-zO2VgjlNA1BuBXGv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zO2VgjlNA1BuBXGv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zO2VgjlNA1BuBXGv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zO2VgjlNA1BuBXGv .marker.cross{stroke:#333333;}#mermaid-svg-zO2VgjlNA1BuBXGv svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zO2VgjlNA1BuBXGv p{margin:0;}#mermaid-svg-zO2VgjlNA1BuBXGv .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv .cluster-label text{fill:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv .cluster-label span{color:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv .cluster-label span p{background-color:transparent;}#mermaid-svg-zO2VgjlNA1BuBXGv .label text,#mermaid-svg-zO2VgjlNA1BuBXGv span{fill:#333;color:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv .node rect,#mermaid-svg-zO2VgjlNA1BuBXGv .node circle,#mermaid-svg-zO2VgjlNA1BuBXGv .node ellipse,#mermaid-svg-zO2VgjlNA1BuBXGv .node polygon,#mermaid-svg-zO2VgjlNA1BuBXGv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zO2VgjlNA1BuBXGv .rough-node .label text,#mermaid-svg-zO2VgjlNA1BuBXGv .node .label text,#mermaid-svg-zO2VgjlNA1BuBXGv .image-shape .label,#mermaid-svg-zO2VgjlNA1BuBXGv .icon-shape .label{text-anchor:middle;}#mermaid-svg-zO2VgjlNA1BuBXGv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zO2VgjlNA1BuBXGv .rough-node .label,#mermaid-svg-zO2VgjlNA1BuBXGv .node .label,#mermaid-svg-zO2VgjlNA1BuBXGv .image-shape .label,#mermaid-svg-zO2VgjlNA1BuBXGv .icon-shape .label{text-align:center;}#mermaid-svg-zO2VgjlNA1BuBXGv .node.clickable{cursor:pointer;}#mermaid-svg-zO2VgjlNA1BuBXGv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zO2VgjlNA1BuBXGv .arrowheadPath{fill:#333333;}#mermaid-svg-zO2VgjlNA1BuBXGv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zO2VgjlNA1BuBXGv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zO2VgjlNA1BuBXGv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zO2VgjlNA1BuBXGv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zO2VgjlNA1BuBXGv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zO2VgjlNA1BuBXGv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zO2VgjlNA1BuBXGv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zO2VgjlNA1BuBXGv .cluster text{fill:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv .cluster span{color:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zO2VgjlNA1BuBXGv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zO2VgjlNA1BuBXGv rect.text{fill:none;stroke-width:0;}#mermaid-svg-zO2VgjlNA1BuBXGv .icon-shape,#mermaid-svg-zO2VgjlNA1BuBXGv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zO2VgjlNA1BuBXGv .icon-shape p,#mermaid-svg-zO2VgjlNA1BuBXGv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zO2VgjlNA1BuBXGv .icon-shape rect,#mermaid-svg-zO2VgjlNA1BuBXGv .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zO2VgjlNA1BuBXGv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zO2VgjlNA1BuBXGv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zO2VgjlNA1BuBXGv :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

椒盐噪声

高斯/均匀噪声

含噪声图像

噪声类型?

中值滤波 cv2.medianBlur

是否需保留边缘?

高斯滤波 cv2.GaussianBlur

均值滤波 cv2.blur

输出平滑图像


5. 完整代码实战:去噪效果对比

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. 高级技巧:自适应高斯滤波(按区域调整强度)

对于复杂图像,可结合边缘检测,只在平滑区域强滤波,边缘区域弱滤波:

# 简易自适应思路:边缘处用小核,非边缘用大核
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》

赞(0)
未经允许不得转载:171主机测评 » 人工智能之视觉领域 计算机视觉 第六章 图像平滑处理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址