常见线性滤波(第一篇博客)

2023-11-15

一、基本概念了解

1.什么是图像滤波?

官方解释:图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
个人理解:为图像滤波是通过设计合适的滤波器和阈值对平时工作和环境引起的噪声的减弱与抑制。

2.线性滤波

首先我们应该了解一下什么是平滑。平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑的一种作用就是用来减弱噪声。OpenCV中提供了两类常见的滤波器用来对图像进行平滑处理。一类是线性滤波,包括 方框滤波(boxFilter)、均值滤波(blur)、高斯滤波(GaussianBlur);另一类是非线性滤波器,包括中值滤波(medianBlur)和双边滤波(bilateralFilter)。而本篇博客主要是对线性滤波进行学习总结。

3.卷积

卷积是两个变量在某范围内相乘后求和的结果(g(x,y)蓝色部分)。卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。对于图像操作来说就是在每一个图像块(f(x,y)红色区域)与某个核(h(x,y))之间进行的运算。
在这里插入图片描述

4.算子(核)

核就是图像处理时,给定输入图像,在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均,其中权值由一个函数定义,这个函数称为卷积核。核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央。
示例

二、线性滤波器介绍

归一化块滤波器

官方解释是这样的:最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等),其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。包括方框滤波与均值滤波。
核如下:
核
函数原型如下:

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
  • src:输入图片。
  • dst:输出图像,应与原图像大小、类型一样。
  • ddepth:图像深度(图像深度是指存储每个像素所用的位数,也用于度量图像 的色彩分辨率。详细解释请自行搜索),-1表示与原图深度相同。
  • ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
  • anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
  • borderType:一般默认为BORDER_DEFAULT ,目前不去了解。

1.方框滤波------boxFilter

函数原型如下:

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
  • src:输入图片。

  • dst:输出图像。

  • ddepth:图像深度

  • ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。

  • anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。

  • boolnormalize:bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。

  • borderType:一般默认为BORDER_DEFAULT 。
    运用如下:

    #include<opencv2/core/core.hpp>
     #include<opencv2/highgui/highgui.hpp>
     #include<opencv2/imgproc/imgproc.hpp>
     #include<iostream>
     
     
     using namespace cv;
     using namespace std;
     
     int main() {
     
     		//导入图片
     	
     	Mat srcImage = imread("E:/image/test.jpg"); 
     	if (!srcImage.data) {
     		printf("导入srcImage错误");
     		return 0;
     	}
    
     		//创建输出图像
     	
     	Mat boxFilterImage;	
     		
     		//调用boxFilter函数
     	
     	boxFilter(srcImage, boxFilterImage, -1, Size(3, 3), Point(-1, -1), false);
    
     	namedWindow("boxFilter");
     	imshow("boxFilter", boxFilterImage);
     	waitKey(0);
    
     	return 0;  
     	}
    

    原图如下
    在这里插入图片描述
    经过方框滤波后的图片
    在这里插入图片描述

2.均值滤波

在方框滤波中,当normalize=true的时候,方框滤波就变成了均值滤波。均值滤波是方框滤波归一化(normalized)后的特殊情况
函数原型如下:

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
  • src:输入图片。
  • dst:输出图像。
  • ddepth:图像深度。
  • ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
  • anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
  • borderType:一般默认为BORDER_DEFAULT 。
    运用如下:

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main() {
	
	//导入图片
	Mat srcImage = imread("E:/image/test.jpg"); 
	if (!srcImage.data) {
		printf("导入srcImage错误");
		return 0;
	}

	//创建输出图像
	Mat blurImage;			
	//调用blur函数
	blur(srcImage, blurImage, Size(3, 3), Point(-1, -1));

	namedWindow("blur");
	imshow("blur", blurImage);
	imwrite("E:/image/test_2.jpg", blurImage);
	waitKey(0);

	return 0;
}

在这里插入图片描述

3.高斯滤波

高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。它是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程
函数如下

 void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
  • src: 输入图像
  • dst: 输出图像
  • kisize:可理解为Size(w, h) 定义内核的大小(需要考虑的邻域范围)。 w 和 h 必须是正奇数,否则将使用\sigma_x 和 sigma_y 参数来计算内核大小。
  • sigma_x: x 方向标准方差, 如果是 0 则 sigma_x 使用内核大小计算得到。
  • sigma_y: y 方向标准方差, 如果是 0 则 sigma_y 使用内核大小计算得到。.
  • borderType:一般默认为BORDER_DEFAULT 。

运用如下:


#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>


using namespace cv;
using namespace std;

int main() {
	
	//导入图片
	Mat srcImage = imread("E:/image/test.jpg"); 
	if (!srcImage.data) {
		printf("导入srcImage错误");
		return 0;
	}

	//创建输出图像
	Mat gussianblurImage;			
	//调用blur函数
	GaussianBlur(srcImage, gussianblurImage, Size(3, 3),0,0);

	namedWindow("gussianblur");
	imshow("gussianblur", gussianblurImage);
	imwrite("E:/image/test_3.jpg", gussianblurImage);
	waitKey(0);

	return 0;
}

在这里插入图片描述
参考:
https://blog.csdn.net/poem_qianmo/article/details/22745559

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html#id5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见线性滤波(第一篇博客) 的相关文章

  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何计算 cv::Mat 的步幅

    我想知道如何计算步幅cv Mat 我已经更新了代码 我需要计算步幅 我不知道计算投影变换有什么问题 我得到一个cv Mat然后将其复制到unsigned int数组 然后对其进行转换 然后返回一个cv Mat待展示 cv Mat3b src
  • IplImage 内的 IplImage

    是否可以使用 OpenCv JavaCv 将图像放置在图像内 例如我有一个 1000x1000 图像和一个 100x100 图像 在 600x600 的位置 我想将较小的图像放置在较大的图像内 假设蓝色框是 1000x1000 IplIma
  • 安装 gstreamer 对 opencv python 包的支持

    我已经从源代码构建了自己的 opencv python 包 import cv2 print cv2 version 打印 3 4 5 现在我面临的问题是关于 opencv 的 VideoCapture 类中的 gstreamer 的使用
  • 使用 OpenCV 绘制固定的网格线集

    是否可以根据 OpenCV 示例文件中颜色检测示例的输出 在所有交叉点处绘制具有定义点的用户定义网格线 基本上 网络摄像头需要从您上方检测人的头部和肩膀 然后 当检测到一个人时 我需要网格线在那里 以便我能够知道在 x 轴和 y 轴 前额和
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 使用 openCV 锐化视频图像

    我想使用 OpenCV 锐化我的图像 我在网上查看了一个示例 该示例正在对灰度图像执行锐化 我尝试了它 它工作得很好 然而 我现在尝试做同样的事情 但使用 RGB 颜色 所以我分别在三个通道上执行相同的功能 但它没有给我任何结果 图像与原始
  • 将 RGB 转换为黑色或白色

    我如何在Python中获取RGB图像并将其转换为黑白图像 不是灰度 我希望每个像素要么是全黑 0 0 0 要么是全白 255 255 255 流行的 Python 图像处理库中是否有任何内置功能可以完成此任务 如果不是 最好的方法是循环遍历
  • OpenCV非旋转图像拼接

    我正在 OpenCV 中进行图像拼接 从不同位置拍摄平面场景的照片并尝试构图全景图 我修改了缝合示例以满足我的需要 openCV 拼接管道的问题是 它假设相机纯粹旋转 但对我来说情况并非如此 当拍摄的照片与场景完全正交时 没有相机旋转 只是
  • OpenCV:视频录制太快

    我有一个简单的录像机 录制来自网络摄像头的视频 theVideoWriter open filename countAsString ext CV FOURCC X V I D 30 Size 1920 1080 true while re
  • OpenCV:使用 StereoCamera 系统对颜色标记进行 3D 姿态估计

    我有一个立体摄像系统并使用两者正确校准它 cv calibrateCamera and cv stereoCalibrate My reprojection error似乎没问题 凸轮0 0 401427 凸轮1 0 388200 立体声
  • `opencv.android.JavaCameraView` 和 `opencv.android.NativeCameraView` 有什么区别

    正如主题中所述 有什么区别opencv android JavaCameraView and opencv android NativeCameraView 与其他主要优点相比 有哪些优点可以提供更多选择 来自OpenCV 文档 http
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • 有人曾经在 MacOS 10.6 上使用过 OpenCV 和 Python 2.7 吗?

    在过去的 6 个月里 我一直断断续续地尝试让 OpenCV 在 MacOS 上与 Python 配合使用 每次有新版本发布时 我都会再次尝试并失败 我已经尝试过 64 位和 32 位 并且 xcode gcc 和 gcc 都是通过 macp
  • 如何在 opencv 3.0 Beta 中从文件读取 UMat?

    我想用UMat所以我的代码可以使用 OpenCL OpenCV 3 0 0 Beta 在 GPU 和 CPU 上运行 但我找不到将图像文件读入的方法UMat或转换一个Mat to UMat 如何将图像读入UMat 样品用于Mat to UM
  • Haar训练时正样本和负样本使用多少张图片?

    我已经阅读了大量有关 Haar 训练的内容 但我不清楚应该为正样本集和负样本集使用多少图像 我看到建议使用很多图像 有些人推荐数千张 我也不清楚正负样本图像的数量是否应该相同 这是关于 Haar 训练的最佳教程 你试过这个吗 http no
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https

随机推荐

  • SpringBoot集成Redis来实现缓存技术方案

    为什么80 的码农都做不了架构师 gt gt gt 概述 在我们的日常项目开发过程中缓存是无处不在的 因为它可以极大的提高系统的访问速度 关于缓存的框架也种类繁多 今天主要介绍的是使用现在非常流行的NoSQL数据库 Redis 来实现我们的
  • 【VS2010学习笔记】【异常处理】general error c1010070: Failed to load and parse the manifest.

    在VS2010编程中 有时编译会遇到这样的错误 general error c1010070 Failed to load and parse the manifest 解决方法就是在解决方案中将后缀名为manifest的文件删除 再编译即
  • css 第二行的元素设置margin-top间隔

    css 第二行的元素设置margin top间隔
  • Extjs的Form表单提交方式

    Extjs的Form表单提交方式 一 直接提交 url写在表单中 var addForm new Ext FormPanel frame true url insertProject eva doType insertProject lab
  • PCIe5.0的Add-in-Card(AIC)金手指layout建议(三)

    PCIe5 0的Add in Card AIC 金手指layout建议 一 PCIe5 0的Add in Card AIC 金手指layout建议 二 前面两篇文章介绍了第一种金手指的layout建议 适用速率在32 0 GT s 以下介绍
  • 关于爬虫技术

    1 什么是爬虫 爬虫是一种自动化程序 它能够模拟人类用户访问网站的行为 从网站上抓取数据并保存到本地或者进行进一步处理 爬虫是一种非常常用的网络数据采集工具 可以用于搜索引擎 电商数据采集 舆情监测等多个领域 通过使用爬虫 可以自动化地获取
  • springboot获取nacos的服务列表、实例列表及修改实例、发布配置等

    1 通过java sdk的方式发布配置 官方文档说明 https nacos io zh cn docs sdk html https nacos io zh cn docs open api html 1 1构造ConfigService
  • Linux系统中环境变量的设置

    目录 业务描述 设置环境变量的方法 系统环境变量 指定用户环境变量 临时有效的环境变量 系统常用环境变量应用分析 PATH 环境变量 HOME 环境变量 HISTSIZE 环境变量 LOGNAME环境变量 SHELL环境变量 业务描述 Li
  • 【JAVA进阶】File类、字节流

    个人主页 个人主页 系列专栏 JAVASE基础 前言 目前的编程中 数据存储方式有很多种 包括但不限于 文件存储 将数据以文件的形式存储在磁盘上 可以使用文件读写操作进行数据的存取 数据库存储 将数据以表格的形式存储在数据库中 可以使用SQ
  • 黑群晖docker安装人人影视_在云主机上手动安装腾讯PAI面板

    本文关键字 云主机上装管理面板 在前面 我们介绍过lnmp sandstorm paas 还有黑群晖 docker管理面板 这些都是云OS上的面板扩展和APPSTACK扩展 分散在不同级别被实现 像群晖这种是OS和面板一体的 包括这里要介绍
  • line-height的使用

    line height 26px 表示行高为26px line height 120 表示行高为当前字体大小的120 line height 2 6em 表示行高为当前字体的2 6倍 带单位的行高都有继承性 其子元素继承的是计算值 如父元素
  • 计算机盲打最快要多久,电脑打字怎样做到又快又准确

    除了熟悉26个字母 我们还要熟悉键盘 熟悉键盘是根本 可以下载个金山打字通练习下很快就上手了 而本文笔者着重给大家讲解下可以帮助自己快速输入的技巧 还是要利用工具的 我们聊天的时候 有的词语如果是你常用到的 而这个词又有点长 不是成语类的
  • ctfshow-网络迷踪-新手上路 ( 使用百度搜图收集景点信息)

    ctf show 网络迷踪模块第1关 只有一座桥的图片 拿到桥的名字即可 推荐使用百度搜图 先把图片下载到本地 使用百度搜图收集图片中的景点信息 根据搜图的结果可以发现 图片的来源均指向同一个地方 三亚蜈支洲岛 接下来 百度搜索 三亚蜈支洲
  • 死锁的讲解

    目录 1 死锁定义 2 死锁产生原因 3 如何解决死锁问题 1 死锁定义 死锁是指两个或两个以上的进程在执 过程中 由于竞争资源或者由于彼此通信 造成的 种阻塞的现象 若 外 作 它们都将 法推进下去 也就是两个线程拥有锁的情况下 在尝试获
  • 六、可解释性分析(Datawhale组队学习)

    文章目录 前言 理论简介 CAM算法 Lime算法 DFF算法 代码实战 torch cam工具包实战 pytorch gradcam工具包实战 captum工具包实战 shap工具包实战 lime工具包实战 总结 参考资料 本文内容为 同
  • alter table语法

    文档地址 http docs oracle com cd B19306 01 server 102 b14200 statements 3001 htm CIHCFDDJ ALTER TABLE Purpose Use the ALTER
  • shell脚本中的多行注释

    shell 中注释的使用方法 1 单行注释 单行注释最为常见 它是通过一个 来实现的 注意shell脚本的最开始部分 bin bash 的 号不是用来注释的 2 多行注释 在shell脚本中还有一种多行的注释方法 我们称之为 HERE DO
  • 机器视觉毕业设计 深度学习人体跌倒检测系统 - opencv python

    文章目录 0 前言 课题背景和意义 1 实现方法 传统机器视觉算法 基于机器学习的跌倒检测 SVM简介 SVM跌倒检测原理 算法流程 算法效果 深度学习跌倒检测 最终效果 网络原理 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不
  • 解决:报错cv2.error: OpenCV(4.1.2) error: (-215:Assertion failed) !_img.empty() in function ‘cv::imwrite‘

    cv2 error OpenCV 4 1 2 C projects opencv python opencv modules imgcodecs src l oadsave cpp 715 error 215 Assertion faile
  • 常见线性滤波(第一篇博客)

    一 基本概念了解 1 什么是图像滤波 官方解释 图像滤波 即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 是图像预处理中不可缺少的操作 其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性 个人理解 为图像滤波是通过设计