ubuntu22.04@laptop OpenCV Get Started: 008_image_filtering_using_convolution

ubuntu22.04@laptop OpenCV Get Started: 008_image_filtering_using_convolution

  • 1. 源由
  • 2. convolution应用Demo
    • 2.1 C++应用Demo
    • 2.2 Python应用Demo
  • 3. 重点分析
    • 3.1 identity矩阵
    • 3.2 all ones 5x5矩阵
    • 3.3 blur 5x5矩阵
    • 3.4 GaussianBlur 5x5矩阵
    • 3.5 medianBlur 5x5矩阵
    • 3.6 Sharpening 3x3矩阵
    • 3.7 bilateralFilter矩阵
  • 4. 总结
  • 5. 参考资料
  • 6. 补充

1. 源由

卷积过滤也是OpenCV图像最基本的操作之一。

可能有人会问,这么复杂,什么是卷积?还矩阵,线性代数?

千万不要这么想,记住一点,计算机编程不是学数学,学物理,学化学,学辩证哲学这种逻辑复杂的学科。凡事我们应该尽量简化,不用想得这么复杂。因为,这些复杂的专业知识,深层次领域知识是OpenCV模块、架构师需要搞明白的。作为入门学习的计算机编程人员来说,只要知道概念,学会API使用即可。

那么,为了更好的了解概念,这里做个补充一些类似的知识点或者说日常生活常识:

  • 一个未知数的方程 ==》 对应一个变量:x ==》一维空间
  • 二个未知数的方程 ==》 对应二个变量:x,y ==》 二维空间
  • 三个未知数的方程 ==》 对应三个变量:x,y,z ==》三维空间
  • 四个未知数的方程 ==》 对应四个变量:x,y,z,t ==》四维空间

通常来说,人能够比较直观感受、认识,以及理解的大体上是这四类空间。

x,y,z,t可以看做四个未知数(变量),当只有一个变量变化的时候,从空间维度的角度看就是一维空间。

好了,到这里我们实际上就从多因素分析问题直接跳跃到单一因素分析问题了。

例如:传感器采样,数据采样进行算术平均

  1. 在某 t 1 t_1 t1时刻,采集ADC数据值348;
  2. 在某 t 2 = t 1 + Δ t t_2=t_1+\Delta t t2=t1+Δt时刻,采集ADC数据值344;
  3. 在某 t 3 = t 2 + Δ t t_3=t_2+\Delta t t3=t2+Δt时刻,采集ADC数据值346;
  4. 在某 t 4 = t 3 + Δ t t_4=t_3+\Delta t t4=t3+Δt时刻,采集ADC数据值350;
  5. 在某 t 5 = t 4 + Δ t t_5=t_4+\Delta t t5=t4+Δt时刻,采集ADC数据值352;
  6. 假设 Δ t \Delta t Δt非常短,因此我们认为上述4个ADC采样数据是同一时刻 t 3 t_3 t3的采样值,由于干扰,误差等导致数据存在偏差;
  7. 假设算术平均能够对上述ADC数据进行去噪处理(或者说噪声符合算术平均规律); //请注意,这里是业务领域,不同的业务模型会不一样,可能是算术平均,可能是加权,可能是一阶滤波,也可能是二阶滤波等等
  8. 因此,使用算术平均值模型,进行如下计算 2 n + 1 2n+1 2n+1个采样值分析,得出平均值 A D C t 3 ‾ = 348 \overline{ADC_{t_{3}}}=348 ADCt3=348

A D C t n + 1 ‾ = ∑ 1 ≤ i ≤ 2 n + 1 A D C t i n + 1 = 348 + 344 + 346 + 350 + 352 5 = 348 \overline{ADC_{t_{n+1}}}=\dfrac{\sum_{\mathclap{1\le i\le 2n+1}} ADC_{t_i}}{n+1}=\dfrac{348+344+346+350+352}{5}=348 ADCtn+1=n+11i2n+1ADCti=5348+344+346+350+352=348

上面这个例子是一维空间的算术平滑过滤,因为传感器的x,y,z三维空间的位置并未发生任何位移,仅仅时间上略有变化。

当我们假设这个采样时间间隔不是采样值变化的主要因素时,就需要解决时间维度变量下,噪声该如何去除,建立过滤模型。

理解了上面这个概念,那么就可以理解照片我们是在某个时刻t拍摄(采样)的数据,但是由于像素曝光空间上可能存在衍射,电子噪声干扰等问题,我们假设的模型是周边像素采样值可能影响到采样数据,因此就会产生去噪的模型。

一维空间通常是方程式,二维空间我们用行列式(矩阵),这样说,相信就可以理解了。

注:当遇到多维度空间问题时,复杂程度就远超常人能够理解的维度,此时,业务建模,数据分析就凸显重要性。当然现在也有AI算法(深度学习,神经网络)。这些底层的算术逻辑可能需要更高层面的深入分析和理解,以及公理去证明。也超出现在个人的理解能力,不做讨论。对这些感兴趣的朋友不妨了解下《一种部件生命期监测方法》。

2. convolution应用Demo

008_image_filtering_using_convolution是OpenCV图像过滤的示例程序。

2.1 C++应用Demo

C++应用Demo工程结构:

008_image_filtering_using_convolution/CPP$ tree .
.
├── CMakeLists.txt
├── image_convolution.cpp
└── test.jpg0 directories, 3 files

确认OpenCV安装路径:

$ find /home/daniel/ -name "OpenCVConfig.cmake"
/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/
/home/daniel/OpenCV/opencv/build/OpenCVConfig.cmake
/home/daniel/OpenCV/opencv/build/unix-install/OpenCVConfig.cmake$ export OpenCV_DIR=/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/

C++应用Demo工程编译执行:

$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
$ cd ..
$ ./build/convolution

2.2 Python应用Demo

Python应用Demo工程结构:

008_image_filtering_using_convolution/Python$ tree .
.
├── image_convolution.py
├── requirements.txt
└── test.jpg0 directories, 3 files

Python应用Demo工程执行:

$ workoncv-4.9.0
$ python image_convolution.py

3. 重点分析

在这里插入图片描述

3.1 identity矩阵

根据线性代数,行列式计算方法,很容易看出该3x3矩阵就是将周边像素影响降为权值为0。

在这里插入图片描述

C++:

// Apply identity filter using kernel
Mat kernel1 = (Mat_<double>(3,3) << 0, 0, 0, 0, 1, 0, 0, 0, 0);
Mat identity; 
filter2D(image, identity, -1 , kernel1, Point(-1, -1), 0, 4);

Python:

# Apply identity kernel
kernel1 = np.array([[0, 0, 0],[0, 1, 0],[0, 0, 0]])identity = cv2.filter2D(src=image, ddepth=-1, kernel=kernel1)

3.2 all ones 5x5矩阵

5行x5列,全1矩阵,并做一个归一化。

根据线性代数,行列式计算方法,很容易看出该3x3矩阵就是将周边像素影响权值为1,做算术平均。

C++:

// Blurred using kernel
// Initialize matrix with all ones
Mat kernel2 = Mat::ones(5,5, CV_64F);
// Normalize the elements
kernel2 = kernel2 / 25;
Mat img;
filter2D(image, img, -1 , kernel2, Point(-1, -1), 0, 4);

Python:

# Apply blurring kernel
kernel2 = np.ones((5, 5), np.float32) / 25
img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel2)

3.3 blur 5x5矩阵

5x5的OpenCV内置blur矩阵模糊化过滤。

C++:

// Blurred using OpenCV C++ blur() function
Mat img_blur;
blur(image, img_blur, Size(5,5));

Python:

# Apply blur using `blur()` function
img_blur = cv2.blur(src=image, ksize=(5,5)) 

3.4 GaussianBlur 5x5矩阵

5x5的OpenCV内置Gaussian Blur矩阵模糊化过滤。

C++:

// Performing Gaussian Blur
Mat gaussian_blur;
GaussianBlur(image, gaussian_blur, Size(5,5), 0);

Python:

# Apply Gaussian blur
gaussian_blur = cv2.GaussianBlur(src=image, ksize=(5,5), sigmaX=0)

3.5 medianBlur 5x5矩阵

5x5的OpenCV内置median Blur矩阵模糊化过滤。

C++:

// Apply Median Blur
Mat median_blurred;
medianBlur(image, median_blurred, (5,5));

Python:

# Apply Median blur
median_blurred = cv2.medianBlur(src=image, ksize=5)

3.6 Sharpening 3x3矩阵

5x5的定制了一个Kernel3矩阵进行凸显(锐化)中间像素。

C++:

// Apply Sharpening using kernel
Mat sharp_img;
Mat kernel3 = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1 ,0);
filter2D(image, sharp_img, -1 , kernel3, Point(-1, -1), 0, BORDER_DEFAULT);

Python:

# Apply sharpening using kernel
kernel3 = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]])
sharp_img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel3)

3.7 bilateralFilter矩阵

对区域内的像素进行数据过滤。

C++:

// Apply bilateral filtering
Mat bilateral_filter;
bilateralFilter(image, bilateral_filter, 9, 75, 75);

Python:

# Apply Bilateral Filtering
bilateral_filter = cv2.bilateralFilter(src=image, d=9, sigmaColor=75, sigmaSpace=75)

4. 总结

通过以下矩阵,对图像进行卷积的计算机操作,从而对数据进行有效性过滤。

其实计算机编程就是这么简单,当然要深入理解为什么要过滤,怎么有效过滤,这个就是深入的课程,需要了解API参数的含义,以及各参数背后业务的具体意义。

  • filter2D(src, ddepth, kernel)
  • blur(src, dst, ksize)
  • GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
  • medianBlur(src, ksize)
  • bilateralFilter(src, d, sigmaColor, sigmaSpace)

5. 参考资料

【1】ubuntu22.04@laptop OpenCV Get Started
【2】ubuntu22.04@laptop OpenCV安装
【3】ubuntu22.04@laptop OpenCV定制化安装

6. 补充

学习是一种过程,这里关于《ubuntu22.04@laptop OpenCV Get Started》的记录也是过程。因此,很多重复的代码或者注释,就不会展开讨论,甚至提及。

有兴趣了解更多的朋友,请从[《ubuntu22.04@laptop OpenCV Get Started》](ubuntu22.04@laptop OpenCV Get Started)开始,一个章节一个章节的了解,循序渐进。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 用法学习总结(一)之基于 XML 注入属性

百度网盘&#xff1a; &#x1f449; Spring学习书籍链接 Spring学习 1 Spring框架概述2 Spring容器3 基于XML方式创建对象4 基于XML方式注入属性4.1 通过set方法注入属性4.2 通过构造器注入属性4.3 使用p命名空间注入属性4.4 注入bean与自动装配4.5 注入集合4.6 注入外部属性…

C# Winform .net6自绘的圆形进度条

using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;namespace Net6_GeneralUiWinFrm {public class CircularProgressBar : Control{private int progress 0;private int borderWidth 20; // 增加的边框宽度public int Progr…

CTFshow web(php文件上传155-158)

web155 老样子&#xff0c;还是那个后端检测。 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&…

探索IDE的世界:什么是IDE?以及适合新手的IDE推荐

引言 在编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者&#xff0c;一个好的IDE都能极大地提高我们的编程效率。那么&#xff0c;什么是IDE呢&#xff1f;对于新手来说&#xff0c;又应该选择哪…

OpenGL-ES 学习(2)---- DepthTest

深度测试 OpenGL-ES 深度测试是指在片段着色器执行之后&#xff0c;利用深度缓冲区所保存的深度值决定当前片段是否被丢弃的过程 深度缓冲区通常和颜色缓冲区有着相同的宽度和高度&#xff0c;一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。(注意只保存…

红队笔记Day3-->隧道上线不出网机器

昨天讲了通过代理的形式&#xff08;端口转发&#xff09;实现了上线不出网的机器&#xff0c;那么今天就来讲一下如何通过隧道上线不出网机器 目录 1.网络拓扑 2.开始做隧道&#xff1f;No&#xff01;&#xff01;&#xff01; 3.icmp隧道 4.HTTP隧道 5.SSH隧道 1.什么…

HarmonyOS鸿蒙学习基础篇 - 自定义组件(一)

前言 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与UI分离&#…

【Linux】yum软件包管理器

目录 Linux 软件包管理器 yum 什么是软件包 Linux安装软件 查看软件包 关于rzsz Linux卸载软件 查看yum源 扩展yum源下载 Linux开发工具 vim编辑器 上述vim三种模式之间的切换总结&#xff1a; 命令模式下&#xff0c;一些命令&#xff1a; vim配置 Linux 软件包管理…

项目访问量激增该如何应对

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 引言 一. 优化数据库 1.1 索引优化 1.2 查询优化 1.3 数据库设计优化 1.4 事务优化 1.5 硬件优化 1.6 数据库配置优化 二. 增加服务器资源…

JVM(4)原理篇

1 栈上的数据存储 在Java中有8大基本数据类型&#xff1a; 这里的内存占用&#xff0c;指的是堆上或者数组中内存分配的空间大小&#xff0c;栈上的实现更加复杂。 以基础篇的这段代码为例&#xff1a; Java中的8大数据类型在虚拟机中的实现&#xff1a; boolean、byte、char…

【AI视野·今日CV 计算机视觉论文速览 第300期】Tue, 30 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Tue, 30 Jan 2024 Totally 146 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Computer Vision for Primate Behavior Analysis in the Wild Authors Richard Vogg, Timo L ddecke, Jonathan Henrich, …

应用进程跨越网络的通信

目录 1 系统调用和应用编程接口 应用编程接口 API 几种应用编程接口 API 套接字的作用 几种常用的系统调用 1. 连接建立阶段 2. 传送阶段 3. 连接释放阶段 1 系统调用和应用编程接口 大多数操作系统使用系统调用 (system call ) 的机制在应用程序和操作系统之间传递控制…

Java基于SpringBoot+vue的租房网站,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【学网攻】 第(27)节 -- HSRP(热备份路由器协议)

系列文章目录 目录 系列文章目录 文章目录 前言 一、HSRP(热备份路由器协议)是什么&#xff1f; 二、实验 1.引入 实验目标 实验背景 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交…

OpenAI ChatGPT 记忆功能怎么实现?

你的聊天助手现在能“记住”你的对话了&#xff01; 2月14日凌晨&#xff0c;OpenAI宣布正在测试ChatGPT的新功能——记住用户提问内容&#xff0c;并自由控制内存。这意味着&#xff0c;ChatGPT能帮你记住那些重要的聊天内容&#xff0c;让你的对话更流畅、更自然。 想象一下…

HMI(人机界面设计)大扫盲了,UI设计的重要领域,附案例。

Hello&#xff0c;我是大千UI工场&#xff0c;开始分享HMI设计了&#xff0c;这个可是除了手机和电脑外的&#xff0c;最重要的设计领域哦&#xff0c;可能你觉的它很陌生&#xff0c;其实生活中处处可见。关注我们&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c…

Python算法探索:从经典到现代(二)

一、引言 Python作为一种高级编程语言&#xff0c;其简洁明了的语法和丰富的库资源&#xff0c;使得它成为算法实现的理想选择。本文将带您从经典算法出发&#xff0c;逐步探索到现代算法&#xff0c;感受Python在算法领域的魅力。 二、经典算法&#xff1a;贪心算法 贪心算法…

Web基础01-HTML+CSS

目录 一、HTML 1.概述 2.html结构解析 3.HTML标签分类 4.HTML标签关系 5.HTML空元素 6.HTML属性 7.常用标签 &#xff08;1&#xff09;HTML标签 &#xff08;2&#xff09;标题标签 &#xff08;3&#xff09;换/折行标签 &#xff08;4&#xff09;段落标签 &am…

华为机考入门python3--(14)牛客14-字符串排序

分类&#xff1a;列表、排序 知识点&#xff1a; 字典序排序 sorted(my_list) 题目来自【牛客】 def sort_strings_by_lex_order(strings): # 使用内置的sorted函数进行排序&#xff0c;默认是按照字典序排序 sorted_strings sorted(strings) # 返回排序后的字符串列…

php基础学习之运算符(重点在连接符和错误抑制符)

运算符总结 在各种编程语言中&#xff0c;常用的运算符号有这三大类&#xff1a; 算术运算符&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%位运算符&#xff1a;&&#xff0c;|&#xff0c;^&#xff0c;<<&#xff0c;>>赋值运算符&…