OpenCV 卷积操作 均值,高斯,中值滤波 图片降噪

文章目录

  • 卷积概念
  • 卷积的作用
      • 1. 图像平滑与去噪
      • 2. 边缘检测
      • 3. 特征提取
      • 4. 图像增强
  • 常见的三种滤波
    • 均值滤波
      • 均值滤波的步骤
      • 优点和缺点
      • 使用示例
    • 高斯滤波
      • 示例代码
    • 中值滤波
      • 中值滤波的基本原理
      • 数学表达式
      • 中值滤波的步骤
      • 示例
      • 优点和缺点
      • 使用示例
    • 三种滤波 图片降噪 Python实现

卷积概念

图像处理中的卷积操作是一种数学操作,用于图像增强、平滑、锐化、边缘检测等多种处理。在执行卷积操作时,会使用一个小的矩阵,称为卷积核或滤波器,这个卷积核会与图像的局部区域进行元素乘积求和的运算。

具体步骤如下:

  1. 选择卷积核:卷积核的大小和值根据所要执行的操作而定。常见的卷积核有用于平滑的高斯核、用于锐化的拉普拉斯核、以及用于边缘检测的Sobel核等。
  2. 滑动卷积核:将卷积核中心对准图像的一个像素,卷积核的其他部分会覆盖这个像素周围的区域。
  3. 元素乘积求和:卷积核覆盖区域的每个像素值乘以卷积核对应位置的系数,然后将所有乘积求和,得到的结果作为新图像在该中心像素位置的像素值。
  4. 重复操作:移动卷积核,重复上述过程,直至覆盖整个图像。

卷积操作的效果取决于卷积核的选择。例如,平滑滤波器可以减少图像噪声。

卷积核是一个小矩阵,用于在图像上滑动,并在每个位置与图像的对应区域进行加权求和,产生新的像素值。 如下图例子

卷积核为
KaTeX parse error: Undefined control sequence: \matrix at position 9: \left[ \̲m̲a̲t̲r̲i̲x̲{ 1 & 1 & 1 \…
与第一个矩阵 进行卷积
KaTeX parse error: Undefined control sequence: \matrix at position 9: \left[ \̲m̲a̲t̲r̲i̲x̲{ 12 & 13 & 1…
具体操作: 乘积求和除以中间元素 结果向下取整 中间元素4 就变成了8 然后滑动卷积核 以此类推 ,直到覆盖整个图像

卷积核一般都是奇数行的矩阵,这样可以取最中间的元素进行替换
( 12 ∗ 1 + 13 ∗ 1 + 14 ∗ 1 + 2 ∗ 1 + 4 ∗ 1 + 6 ∗ 1 + 6 ∗ 1 + 8 ∗ 1 + 10 ∗ 1 ) / 4 (12*1+13*1+14*1+2*1+4*1+6*1+6*1+8*1+10*1)/4 (121+131+141+21+41+61+61+81+101)/4
在这里插入图片描述

卷积的作用

1. 图像平滑与去噪

卷积可以用来实现各种平滑滤波器(如均值滤波和高斯滤波),从而减少图像中的噪声和细节:

  • 均值滤波:通过平均邻域内的像素值来平滑图像。
  • 高斯滤波:使用高斯函数作为权重,对邻域内的像素进行加权平均,从而更平滑地去除噪声。

2. 边缘检测

卷积可以用来提取图像中的边缘和轮廓:

  • Sobel算子:通过卷积核提取水平方向和垂直方向的边缘。
  • Canny边缘检测器:使用多步卷积操作来检测图像中的强边缘。

3. 特征提取

卷积在图像特征提取中发挥着关键作用,特别是在计算机视觉和图像识别任务中:

  • 方向梯度直方图(HOG):通过卷积计算图像的梯度方向和幅值。
  • 尺度不变特征变换(SIFT):通过卷积检测图像中的关键点和描述符。

4. 图像增强

卷积可以用于图像的增强和锐化:

  • 拉普拉斯算子:用于检测图像中的细节和边缘,通过增强边缘来提高图像的清晰度。
  • 高提升滤波:通过添加原始图像和增强的图像来实现锐化效果。

常见的三种滤波

均值滤波

均值滤波的原理是使用一个固定大小的窗口(卷积核)在图像上滑动,并计算该窗口覆盖区域内所有像素值的平均值,然后用这个平均值替换窗口中心的像素值。就是一开始举的例子

数学表达式:

在这里插入图片描述

其中:

  • (x,y)是输出图像中的像素位置。
  • k是滤波器窗口的半径。

均值滤波的步骤

  1. 选择窗口大小:确定卷积核(窗口)的大小,常见的大小有 3×33 \times 33×3, 5×55 \times 55×5 等。
  2. 滑动窗口:在图像上滑动窗口,将窗口中心对准图像中的每一个像素。
  3. 计算平均值:计算窗口覆盖区域内所有像素的平均值。
  4. 替换像素值:用计算得到的平均值替换窗口中心的像素值。
  5. 重复操作:对图像中的每一个像素重复上述步骤,直到整个图像处理完毕。

优点和缺点

优点

  1. 简单实现:均值滤波算法简单,易于理解和实现。
  2. 平滑效果:对随机噪声有良好的平滑效果,可以有效减少图像中的高频噪声。

缺点

  1. 模糊边缘:均值滤波对图像的边缘也进行平滑处理,导致边缘变得模糊,不适用于需要保留边缘细节的场景。
  2. 处理非均匀噪声效果差:对椒盐噪声等非均匀噪声的处理效果不佳,容易被极值像素影响。

使用示例

OpenCV中均值滤波可以通过cv::blur函数实现

函数原型

void blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT);

参数说明

  • src: 输入图像,必须是一个多通道的图像(如灰度图或彩色图)。
  • dst: 输出图像,与输入图像具有相同的大小和类型。
  • ksize: 滤波器窗口的大小,格式为Size(width, height)。一般为奇数。
  • anchor: 锚点位置,默认值为Point(-1, -1),表示锚点位于窗口的中心。 一般这个不用动
  • borderType: 边界模式,用于指定边界像素的填充方式。常见的值有BORDER_CONSTANT, BORDER_REFLECT, BORDER_REPLICATE等。

上述演示卷积的过程中,可以看出最外边的一圈像素是没有被卷积的,OpenCV中可以指定把边界填充一下,这样的话,就可以把边界的像素也进行卷积处理。

示例代码

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {// 读取图像cv::Mat image = cv::imread("input.jpg");// 检查图像是否加载成功if (image.empty()) {std::cerr << "Error: Could not load image." << std::endl;return -1;}// 定义滤波器窗口的大小cv::Size ksize(5, 5);// 对图像应用均值滤波cv::Mat blurred_image;cv::blur(image, blurred_image, ksize);// 显示原始图像和处理后的图像cv::imshow("Original Image", image);cv::imshow("Blurred Image", blurred_image);// 等待键盘输入并关闭窗口cv::waitKey(0);return 0;
}

效果:PS:卷积窗口越大,模糊效果越强

在这里插入图片描述

高斯滤波

高斯模糊是使用高斯函数定义的卷积核与图像进行卷积来实现的。高斯函数的公式为:

在这里插入图片描述

其中:

  • σ 是标准差,控制模糊的程度,值越大模糊越强。
  • x和 y是相对于卷积核中心的坐标。

这个函数很有特点,

在这里插入图片描述

可以看出靠近中间的位置,数值越大,越在边缘数值越小,因此可以用在带权的卷积操作

在OpenCV的C++库中,高斯模糊(Gaussian Blur)可以通过cv::GaussianBlur函数来实现。这个函数使用高斯卷积核对图像进行卷积,从而实现平滑和降噪的效果。

cv::GaussianBlur 函数原型

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT);

参数说明

  • src: 输入图像,必须是一个多通道的图像(如灰度图或彩色图)。
  • dst: 输出图像,与输入图像具有相同的大小和类型。
  • ksize: 高斯滤波器窗口的大小,格式为Size(width, height)。必须是正数和奇数。如果您希望根据sigma自动计算窗口大小,可以设置为Size(0, 0)
  • sigmaX: X方向上的标准差。控制模糊的程度。
  • sigmaY: Y方向上的标准差。如果设置为0,则其值与sigmaX相同。
  • borderType: 边界模式,用于指定边界像素的填充方式。常见的值有BORDER_CONSTANT, BORDER_REFLECT, BORDER_REPLICATE等。

示例代码

以下是使用OpenCV的cv::GaussianBlur函数进行高斯模糊的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {// 读取图像cv::Mat image = cv::imread("input.jpg");// 检查图像是否加载成功if (image.empty()) {std::cerr << "Error: Could not load image." << std::endl;return -1;}// 定义滤波器窗口的大小cv::Size ksize(15, 15);// X方向上的标准差double sigmaX = 3.0;// 对图像应用高斯模糊cv::Mat blurred_image;cv::GaussianBlur(image, blurred_image, ksize, sigmaX);// 显示原始图像和处理后的图像cv::imshow("Original Image", image);cv::imshow("Blurred Image", blurred_image);// 等待键盘输入并关闭窗口cv::waitKey(0);return 0;
}

模糊效果:

在这里插入图片描述

中值滤波

中值滤波(Median Filtering)是一种常用的非线性滤波技术,用于去除图像中的噪声,特别是椒盐噪声(salt-and-pepper noise)。它通过将图像中每个像素值替换为其邻域像素值的中值,从而有效地保留边缘信息,同时平滑图像中的噪声。

中值滤波的基本原理

中值滤波的基本思想是对图像中的每个像素,用其邻域内所有像素值的中值来替换原像素值。中值滤波是一种非线性滤波技术,不会像均值滤波那样模糊图像中的边缘。

数学表达式

在这里插入图片描述

其中:

  • I(x,y) 是输入图像在 (x,y)位置的像素值。
  • I′(x,y)是输出图像在 (x,y) 位置的像素值。
  • median{⋅} 表示邻域像素值的中值。

中值滤波的步骤

  1. 选择窗口大小:确定滤波器窗口的大小,如 (3 \times 3), (5 \times 5) 等。
  2. 滑动窗口:在图像上滑动窗口,将窗口中心对准图像中的每一个像素。
  3. 提取邻域像素值:将窗口内所有像素值提取出来。
  4. 计算中值:计算提取的像素值的中值。
  5. 替换像素值:用计算得到的中值替换窗口中心的像素值。
  6. 重复操作:对图像中的每一个像素重复上述步骤,直到整个图像处理完毕。

示例

假设我们有一个 3 * 3 的图像窗口,原始图像窗口的像素值如下:

[ 10 20 30 40 50 60 70 80 90 ] \begin{bmatrix} 10 & 20 & 30 \\ 40 & 50 & 60 \\ 70 & 80 & 90 \end{bmatrix} 104070205080306090
使用3 * 3 的中值滤波器,计算其中值:

中值 = median { 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 } = 50 \text{中值} = \text{median}\{10, 20, 30, 40, 50, 60, 70, 80, 90\} = 50 中值=median{10,20,30,40,50,60,70,80,90}=50
然后,用这个中值替换窗口中心的像素值50。

优点和缺点

优点

  1. 有效去噪:中值滤波在去除椒盐噪声方面非常有效。
  2. 保留边缘:中值滤波能够很好地保留图像中的边缘信息。

缺点

  1. 计算量大:计算中值比计算平均值需要更多的计算资源。
  2. 对大面积噪声效果差:对于大面积的噪声或平滑变化的噪声,中值滤波效果不如其他滤波器。

使用示例

在OpenCV中,中值滤波可以通过cv::medianBlur函数来实现。下面是使用OpenCV进行中值滤波的C++示例代码:

示例代码

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv) {// 读取图像cv::Mat image = cv::imread("input.jpg");// 检查图像是否加载成功if (image.empty()) {std::cerr << "Error: Could not load image." << std::endl;return -1;}// 定义滤波器窗口的大小int ksize = 5; // 滤波器窗口大小必须是正奇数// 对图像应用中值滤波cv::Mat filtered_image;cv::medianBlur(image, filtered_image, ksize);// 显示原始图像和处理后的图像cv::imshow("Original Image", image);cv::imshow("Filtered Image", filtered_image);// 等待键盘输入并关闭窗口cv::waitKey(0);return 0;
}

三种滤波 图片降噪 Python实现

图像处理:Python使用OpenCV 减少图片噪音_opencv噪声过滤-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486645.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

redis高可用之主从复制、哨兵以及Cluster集群

目录 一、Redis主从复制 1&#xff09;主从复制的作用 2&#xff09;主从复制流程 3&#xff09;搭建Redis主从复制 1、部署redis服务器 2、修改Redis配置文件&#xff08;所有节点操作&#xff09; 3、验证主从复制结果 二、哨兵模式 1&#xff09;哨兵的作用 2&…

设计模式-领域逻辑模式-SQL的分离

尽管SQL已经在商业软件中广泛应用&#xff0c;但它在使用中还存在一定缺陷 许多应用程序开发者不能充分理解SQL&#xff0c;同时很多习惯用SQL的开发人员又可能组织不好程序代码。尽管现在有很多技术可以把SQL封装在程序里&#xff0c;但大多封装的还很牵强。 SQL分离的思路&…

谷粒商城实战笔记-46-商品服务-API-三级分类-配置网关路由与路径重写

文章目录 一&#xff0c;准备工作1&#xff0c;新增一级菜单2&#xff0c;新增二级菜单 二&#xff0c;前端树形界面开发1&#xff0c;开发分类展示组件 三&#xff0c;远程调用接口获取商品分类数据1&#xff0c;远程调用2&#xff0c;路由配置 错误记录 本节的主要内容&#…

Cisco ISR 2代路由器,1900,2900,3900系列RTU License使用方法

1 情况说明 客户处的2台Cisco 2911要开启ip sla ,但发现无法支持&#xff0c;查询得知需要有data license才可以。可以通过开启RTU license激活。开启RTU后正常. 2 操作方法 License种类如下&#xff1a;  ipbase ipbasek9 Permanent ipbasek9  security securityk9 Eva…

C++【new delete】【operator new operator delete】

目录 数据段存储位置的小复习 new 和 delete operator new 和 operator delete new和delete调用operator new和operator delete new [ ] 和 delete [ ]的原理 数据段存储位置的小复习 全局变量和静态变量都在静态区&#xff0c;也称数据段 全局变量int x 0 和 全局静态变…

全网最实用--神经网络各个组件以及效率指标 (含代码助理解,粘贴即用)

文章目录 一、神经网络相关组件0.前奏1.全连接层&#xff08;Fully Connected Layer, FC&#xff09;/密集层&#xff08;Dense Layer&#xff09;:2.卷积层&#xff08;Convolutional Layer, Conv&#xff09;:a.一维卷积b.二维卷积c.分组卷积 3.池化层&#xff08;Pooling La…

JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文件上传下载 基本介绍文件上传基本原理文件上传应用实例文件上传注意事项和细节 文件下载基本原理文件下载应用实例文件下载注意事项 ⬅️ 上一篇: JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal) &#x1f389; 欢迎来到 JavaWeb系列二十三: web 应用常用功能(文件上传…

数据结构:基础概念

一、相关概念 概念 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff1a;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff1a;数据和数据之间是一对一的关系 树&#xff1a; 一对多 图&#xff1a;多对多 物理结构(在内存当中的存储关系)…

堆的相关特点

一.建堆的两种方法 给定一个数组&#xff0c;其中数组里面的元素个数是n个如何能够把这个数组建立成为一个堆&#xff0c;今天探讨两种方法&#xff0c;分别是向上调整法和向下调整法&#xff0c;分别探讨他们的时间复杂度 向上调整法&#xff08;以小堆为例&#xff09; 回…

Spring系列-04-事件机制,监听器,模块/条件装配

事件机制&监听器 SpringFramework中设计的观察者模式-掌握 SpringFramework 中, 体现观察者模式的特性就是事件驱动和监听器。监听器充当订阅者, 监听特定的事件&#xff1b;事件源充当被观察的主题, 用来发布事件&#xff1b;IOC 容器本身也是事件广播器, 可以理解成观察…

create-vue源码学习之 gradient-string 渐变色打印

效果 在使用 create-vue 脚手架时&#xff0c;想实现如下的打印效果。 探究过程 翻到源码里看到这一行 没错&#xff0c;绿色部分就是告诉我们如何生成的。可以看到引入了 gradient-string 包 于是乎&#xff0c;我来试试 pnpm i gradient-string pnpm i --save-dev …

1.4、存储系统

目录 存储器的层次结构外存&#xff08;辅存&#xff09;内存CPU的寄存器Cache总结举例局部性原理 练习题 高速缓存Cache总结举例总结 练习题 Cache的地址映像方法直接相联映像全相联映像组相联映像练习题 Cache替换算法Cache页面淘汰算法Cache的读写过程练习题 磁盘总结固态硬…

人工智能(AI)在办公场所的广泛应用

人工智能&#xff08;AI&#xff09;在办公场所的广泛应用正逐步改变着我们的工作方式和效率。随着技术的进步&#xff0c;越来越多的公司和组织开始采用各种AI技术来优化工作流程、提升生产力&#xff0c;并提供更好的用户体验。以下是人工智能在办公方面的一些主要作用和影响…

Ecovadis评估的流程是什么

Ecovadis评估流程是一个全面、系统且注重细节的过程&#xff0c;旨在为企业提供关于其可持续性表现的深入洞察。这一评估不仅覆盖了企业在环境、社会和治理方面的多个方面&#xff0c;还强调了持续改进的重要性&#xff0c;确保企业能够不断提升其CSR&#xff08;企业社会责任&…

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…

Window系统下MySQL安装教程

1、MySQL各版本介绍 MySQL Community Edition MySQL Community Edition 是MySQL官方发布的免费版本&#xff0c;适用于个人用户和小型团队使用。它包含了基本的数据库功能&#xff0c;如创建表、插入数据、查询数据等。 MySQL Enterprise Edition MySQL Enterprise Edition 是…

【数据结构】AVL树(图文解析 + 代码实现)

目录 1、AVL树的概念 2、AVL树结点的定义 3、AVL树的插入 4、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 右左双旋 4.4 左右双旋 5、AVL树的验证 6、AVL树的性能 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;会大仙&#xff0c;这几个容器有个共同点是…

【AI大模型】程序员AI的未来——Copilot还是Claude3.5 Sonnet?

近期&#xff0c;Anthropic发布了Claude 3.5 的“大杯”模型 —— Claude 3.5 Sonnet&#xff01; 这次发布的 Sonnet 代表意大利的“十四行诗”&#xff0c;结构复杂&#xff0c;在智能水平、功能多样性和处理能力上都有所提升&#xff0c;能够应对更复杂的认知任务&#xff…

解决VS2019+Qt联合开发双击Resource Files弹不出资源编辑器问题

目录 一、右键Resource.qrc文件 二、选择打开方式 三、鼠标选择Qt Resource Editor&#xff0c;并设置为默认值 四、最后点击确定&#xff0c;再次双击qrc文件&#xff0c;成功打开 最近在开发中&#xff0c;遇见一个问题&#xff0c;在VS联合Qt开发时&#xff0c;需要添加…

前后端分离项目部署,vue--nagix发布部署,.net--API发布部署。

目录 Nginx免安装部署文件包准备一、vue前端部署1、修改http.js2、npm run build 编译项目3、解压Nginx免安装,修改nginx.conf二、.net后端发布部署1、编辑appsetting.json,配置跨域请求2、配置WebApi,点击发布3、配置文件发布到那个文件夹4、配置发布相关选项5、点击保存,…