当前位置: 首页 > news >正文

OpenCV(二十四):图像滤波

滤波概述

在数字图像处理中,滤波(Filtering) 是最基本也是最常用的操作之一。滤波的核心思想是利用邻域像素的信息,对目标像素的灰度值或颜色进行加权平均或非线性变换,从而达到 去噪、平滑、增强或提取特征 的目的。

在 OpenCV 中,滤波功能非常完善,提供了线性滤波(如均值滤波、高斯滤波)、非线性滤波(如中值滤波、双边滤波)以及基于卷积核的自定义滤波接口。

滤波的基本原理

假设输入图像为 I(x,y),滤波器或卷积核(Kernel)为 K(i,j),则线性滤波可表示为:

在这里插入图片描述

其中:

  • I′(x,y):滤波后的输出像素;
  • K(i,j):卷积核的权重;
  • (2k+1)×(2k+1):核的尺寸。

根据卷积核权值分布的不同,滤波可分为平滑滤波锐化滤波

  • 平滑滤波:抑制噪声与细节变化,使图像变得更“平滑”;
  • 锐化滤波:增强边缘与细节,使图像更清晰。

卷积核

概念

在图像处理中,卷积核(Kernel) 是一个用于提取图像局部特征的矩阵。
它定义了如何将输入图像中每个像素与其邻域像素组合,从而生成新的输出图像。

数学上,卷积(Convolution)操作可表示为:

在这里插入图片描述

其中:

  • I(x,y):输入图像;
  • K(i,j):卷积核(权重矩阵);
  • G(x,y):输出图像;
  • k:卷积核的半径(若核大小为 3×3,则 k=1)。

卷积的本质是:

通过局部加权求和的方式,让图像在空间域上发生平滑、锐化、边缘增强、检测等变化。

分类

在 OpenCV 中,卷积核主要分为以下几类:

分类核心作用常见类型示例函数
平滑滤波核去噪与模糊图像均值核、高斯核cv2.blur, cv2.GaussianBlur
锐化核增强边缘与细节Laplacian、锐化核cv2.filter2D, cv2.Laplacian
边缘检测核提取梯度与轮廓Sobel、Prewitt、Cannycv2.Sobel, cv2.Canny
特殊效果核模拟浮雕、边缘光照等Emboss、Outline自定义卷积核

OpenCV 中的卷积函数

函数名功能示例
cv2.filter2D()通用卷积操作自定义核
cv2.blur()均值滤波平滑
cv2.GaussianBlur()高斯滤波去噪
cv2.medianBlur()中值滤波(非线性)去椒盐噪声
cv2.bilateralFilter()双边滤波平滑且保边
cv2.Sobel()一阶导边缘检测边缘检测
cv2.Laplacian()二阶导锐化边缘增强

平滑滤波(去噪滤波)

1. 均值滤波(Mean Filter)

原理:用邻域像素的平均值替代中心像素。该方法简单高效,但对边缘保留能力较差。

公式:

在这里插入图片描述

OpenCV 实现:

cv::blur(src, dst, cv::Size(5, 5));

特点:

  • 计算速度快;
  • 容易模糊边缘;
  • 适合去除高斯噪声。

2. 高斯滤波(Gaussian Filter)

原理: 使用高斯分布作为权重函数,对邻域像素加权平均。距离中心越近的像素权重越大。

高斯核定义:

在这里插入图片描述

OpenCV 实现:

cv::GaussianBlur(src, dst, cv::Size(5, 5), 1.5);

参数说明:

  • Size(5,5):核大小;
  • sigmaXsigmaY:高斯分布的标准差。

特点:

  • 平滑性优于均值滤波;
  • 对噪声的抑制更有效;
  • 能保持一定的边缘特征。

3. 中值滤波(Median Filter)

原理: 用邻域像素的中值替代中心像素值,属于非线性滤波。

OpenCV 实现:

cv::medianBlur(src, dst, 5);

特点:

  • 对椒盐噪声效果非常好;
  • 边缘保留能力强;
  • 运算速度略慢于均值滤波。

4. 双边滤波(Bilateral Filter)

原理: 同时考虑空间距离与像素相似性两个因素。即使在平滑噪声的同时,也能很好地保留边缘。

加权公式:

在这里插入图片描述

其中:

  • Gs:空间高斯权重;
  • Gr:像素值相似度权重。

OpenCV 实现:

cv::bilateralFilter(src, dst, 9, 75, 75);

参数含义:

  • 9:邻域直径;
  • 75:颜色与空间的高斯标准差。

特点:

  • 边缘保留能力最强;
  • 去噪效果好;
  • 计算复杂度高。

5. 非局部均值滤波(Non-Local Means)

原理: 通过在更大范围内寻找相似块进行加权平均,保留纹理和细节。

OpenCV 实现:

cv::fastNlMeansDenoising(src, dst, 10, 7, 21);

特点:

  • 能有效保留纹理;
  • 适合自然图像;
  • 计算量大。

锐化滤波(边缘增强)

锐化滤波的目的是增强图像的边缘,使轮廓更加清晰。常用方法包括 拉普拉斯滤波Sobel 滤波自定义卷积核锐化

1. 拉普拉斯滤波(Laplacian Filter)

原理: 计算像素的二阶导数,检测灰度突变区域。

公式:

在这里插入图片描述

OpenCV 实现:

cv::Laplacian(src, dst, CV_16S, 3);
cv::convertScaleAbs(dst, dst);

特点:

  • 对噪声敏感;
  • 常与高斯滤波配合使用(如 LoG 算法)。

2. Sobel 滤波(Sobel Filter)

原理: 一阶导数算子,用于检测边缘方向。

Sobel 核:

在这里插入图片描述

OpenCV 实现:

cv::Sobel(src, grad_x, CV_16S, 1, 0);
cv::Sobel(src, grad_y, CV_16S, 0, 1);
cv::convertScaleAbs(grad_x, grad_x);
cv::convertScaleAbs(grad_y, grad_y);
cv::addWeighted(grad_x, 0.5, grad_y, 0.5, 0, dst);

特点:

  • 对边缘方向敏感;
  • 可结合梯度幅值计算实现边缘检测。

3. 自定义卷积锐化

可以通过自定义卷积核实现更灵活的锐化效果。例如经典锐化核:

在这里插入图片描述

OpenCV 实现:

cv::Mat kernel = (cv::Mat_<float>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
cv::filter2D(src, dst, -1, kernel);

特点:

  • 可灵活调整锐化强度;
  • 可与平滑滤波结合使用。

自定义滤波与卷积

OpenCV 提供了 filter2D() 通用接口,可自定义任意卷积核,实现各种滤波器。

示例:

cv::Mat kernel = (cv::Mat_<float>(3,3) << 1,1,1,1,1,1,1,1,1);
kernel = kernel / 9.0;
cv::filter2D(src, dst, -1, kernel);

说明:

  • 第三个参数 -1 表示输出图像深度与输入相同;
  • 可通过改变核系数实现不同效果。

示例:

import cv2
import numpy as np# 读取原图(灰度)
src = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)# ----------------------------
# 1. 自定义均值滤波核
# ----------------------------
mean_kernel = np.ones((5, 5), np.float32) / 25
dst_mean = cv2.filter2D(src, -1, mean_kernel)# ----------------------------
# 2. 自定义锐化滤波核
# ----------------------------
sharpen_kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]], np.float32)
dst_sharp = cv2.filter2D(src, -1, sharpen_kernel)# ----------------------------
# 3. 自定义边缘检测核(Sobel X方向)
# ----------------------------
sobelx_kernel = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]], np.float32)
dst_sobelx = cv2.filter2D(src, -1, sobelx_kernel)# ----------------------------
# 4. 自定义拉普拉斯核(边缘增强)
# ----------------------------
laplacian_kernel = np.array([[0, 1, 0],[1, -4, 1],[0, 1, 0]], np.float32)
dst_lap = cv2.filter2D(src, -1, laplacian_kernel)# ----------------------------
# 5. 自定义浮雕滤波核
# ----------------------------
emboss_kernel = np.array([[-2, -1, 0],[-1, 1, 1],[0, 1, 2]], np.float32)
dst_emboss = cv2.filter2D(src, -1, emboss_kernel)
dst_emboss = cv2.normalize(dst_emboss, None, 0, 255, cv2.NORM_MINMAX)# ----------------------------
# 显示结果
# ----------------------------
cv2.imshow("Original", src)
cv2.imshow("Mean Blur", dst_mean)
cv2.imshow("Sharpen", dst_sharp)
cv2.imshow("Sobel X", dst_sobelx)
cv2.imshow("Laplacian", dst_lap)
cv2.imshow("Emboss", dst_emboss)cv2.waitKey(0)
cv2.destroyAllWindows()

总结

滤波类型是否线性主要优点主要缺点典型场景
均值滤波线性简单高效模糊边缘基础平滑
高斯滤波线性去噪效果好边缘损失图像预处理
中值滤波非线性去椒盐噪声运算慢工业视觉
双边滤波非线性保边去噪计算复杂美颜、HDR
非局部均值非线性保留纹理速度慢高质量去噪
Sobel/拉普拉斯线性边缘增强对噪声敏感边缘检测
http://www.dtcms.com/a/601969.html

相关文章:

  • 微信服务号菜单链接网站怎么做网站 通管局 报备
  • 网站模板 手机商丘市网站建设推广
  • 河北石家庄建设信息网深圳网站建设乐云seo
  • cod建站平台学生服务器租用
  • C语言编译器IDE使用方法|详细介绍如何配置与使用C语言编译器IDE
  • “后端服务+前端页面服务 + 后端数据库服务“如何部署到K8s集群
  • 网站开发会用到定时器功能长沙公司网络推广
  • LangGraph 中 State 状态模式详解
  • 8-Arm PEG-Acrylate,八臂聚乙二醇丙烯酸酯的溶解性
  • 企业网站设计建设服务器怎么能在网上卖货
  • K8s新手入门:从“Pod创建“到“服务暴露“,3个案例理解容器编排
  • 关于《大学物理》网站资源建设的思路vs2013做网站教程
  • WPF 、WebView2 、WebView2 、CoreWebView2 、HostObject 是什么?它们之间有什么关系?
  • 大连最好的做网站的公司wordpress国产网校
  • C语言编译器 | 如何高效使用和优化C语言编译器
  • C语言指针深度剖析(2):从“数组名陷阱”到“二级指针操控”的进阶指南
  • 中企动力做网站 知乎网站后台系统是用什么做的
  • Linux内核信号传递机制完全解析:从force_sig_info到kick_process的完整路径
  • 佛山新网站建设哪家好建筑方案设计流程步骤
  • 计算机工作原理
  • 北京做网站建设比较好的公司上海网站建设企业名录
  • AEC-Q100 stress实验详解#3——HTSL(高温储存寿命测试)
  • 洋洋点建站wordpress判断是否登录
  • 做的好的农产品网站怎样开通微商城平台
  • Python | 变量如何定义,数据类型介绍
  • 12. 2 雅可比法
  • 【OpenCV + VS】图像通道的均值和方差计算
  • (5)框架搭建:Qt实战项目之主窗体菜单栏
  • 网页C语言在线编译 | 快速、便捷的编程体验
  • 网站免费注册建站培训班