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.jpg

0 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.jpg

0 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)开始,一个章节一个章节的了解,循序渐进。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在极低成本硬件上落地人工智能算法 —— 分布式AI

一、背景 分布式AI的发展前景非常广阔&#xff0c;随着5G、6G等高速网络通信技术的普及和边缘计算能力的提升&#xff0c;以及AI算法和硬件的不断优化进步&#xff0c;分布式AI将在多个领域展现出强大的应用潜力和市场价值&#xff1a; 1. **物联网&#xff08;IoT&#xff0…

JVM(1)基础篇

1 初始JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。 使用…

Swift Combine 使用 flatMap 和 catch错误处理 从入门到精通十三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

什么是 Flet?

什么是 Flet&#xff1f; Flet 是一个框架&#xff0c;允许使用您喜欢的语言构建交互式多用户 Web、桌面和移动应用程序&#xff0c;而无需前端开发经验。 您可以使用基于 Google 的 Flutter 的 Flet 控件为程序构建 UI。Flet 不只是“包装”Flutter 小部件&#xff0c;而是…

为什么说技术进步很慢? —— 技术的先进性与其当下价值的不匹配

一、背景 技术进步是否缓慢是一个相对的概念&#xff0c;需要在不同的领域和时间段内进行分析。以下是一些不同领域中可能造成技术进步看似缓慢的原因&#xff1a; 1. **基础研究瓶颈**&#xff1a;许多先进技术的发展依赖于基础科学的突破&#xff0c;而这些突破往往需要长时…

MySQL-----函数篇

目录 ▶ 字符串函数 ▶ 数值函数 ▶ 日期函数 ▶ 流程函数 ▶ 简介 函数是指一段可以直接被另一段程序调用的程序或代码。 ▶ 字符串函数 函数描述实例ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。 返回 CustomerName 字段第一个字母的 ASCII 码&#xff1a; S…

vuex中Actions详解,代码示例

Vuex 中的 Actions 是用于触发mutations 的一种方式&#xff0c;它可以包含异步操作&#xff0c;并通过提交(commit)mutations 来改变 store 的状态。以下是 Actions 的详细介绍、使用步骤和示例代码&#xff1a; Actions 的介绍&#xff1a; Actions 是 Vuex 中的一个重要概…

第一篇【传奇开心果系列】Python的pyttsx3库技术点案例示例:文本转换语言

传奇开心果短博文系列 系列短博文目录Python的pyttsx3库技术点案例示例系列 短博文目录前言一、pyttsx3主要特点和功能介绍二、pyttsx3文字转语音操作步骤介绍三、多平台支持介绍和示例代码四、多语言支持介绍和示例代码五、自定义语言引擎介绍和示例代码六、调整语速和音量介绍…

JavaWeb学习|i18n

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 i18n 国际化&#xff08;Internationalization&#xff09;指的是同一个网站可以支持多种不同的语言&…

文心一言4.0 VS ChatGPT4.0哪家强?!每月60块的文心一言4.0值得开吗?

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据

对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统&#xff08;1&#xff09;-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统&#xff08;2&#xff09;折线图显示-CSDN博客继续优化&#xff0c;增加一个保存按钮&#xff0c;用于保存成绩数据…

【Java记】数据类型与变量

一、数据类型 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。基本数据类型有四类八种&#xff1a; 四类&#xff1a;整型、浮点型、字符型以及布尔型八种&#xff1a; 数据类型 关键字 内存占用 范围 字节型 byte 1 字节 -128~ 127 短整型 …

基于GPT-4一键完成数据分析全流程的AI Agent: Streamline Analyst

大型语言模型&#xff08;LLM&#xff09;的兴起不仅为获取知识和解决问题开辟了新的可能性&#xff0c;而且催生了一些新型智能系统&#xff0c;例如旨在辅助用户完成特定任务的AI Copilot以及旨在自动化和自主执行复杂任务的AI Agent&#xff0c;使得编程、创作等任务变得高效…

AndroidStdio修改安卓模拟器的安装位置

AndroidStdio修改安卓模拟器的安装位置 1.删除原有的虚拟机 可以直接删除这个avd文件&#xff0c;放心大胆删除 在这个目录下可以看到.avd文件和.ini文件。.avd占了我10G.上图是我转移.avd后截的。发现这个.ini文件&#xff0c;.ini文件就是配置文件&#xff0c;就像mysql安装…

ElasticSearch快速开始

目录 全文检索 全文检索的原理 什么是倒排索引 ElasticSearch介绍 ElasticSearch应用场景 ElasticSearch下载安装&#xff08;windows&#xff09; 客户端Kibana安装 Elasticsearch安装分词插件 ElasticSearch快速开始 ElasticSearch索引操作 创建索引 查询索引 删…

蓝桥杯电子类单片机提升二——串口发送与接收

目录 单片机资源数据包_2023 一、串口收发数据的介绍 1.波特率&#xff08;Baud Rate&#xff09; 2.帧格式 3.SBUF寄存器&#xff08;Serial Buffer&#xff09; 4.中断处理 二、如何从stc-isp获取串口收发数据的代码 1.代码的获取 2.代码的修改 1&#xff09;第一步…

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

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

SpringIOC之support模块ResourceBundleMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Java微服务学习Day1

文章目录 认识微服务服务拆分及远程调用服务拆分服务远程调用提供者与消费者 Eureka注册中心介绍构建EurekaServer注册user-serviceorder-service完成服务拉取 Ribbon负载均衡介绍原理策略饥饿加载 Nacos注册中心介绍配置分级存储负载均衡环境隔离nacos注册中心原理 认识微服务…

论文阅读-面向机器学习的云工作负载预测模型的性能分析

论文名称&#xff1a;Performance Analysis of Machine Learning Centered Workload Prediction Models for Cloud 摘要 由于异构服务类型和动态工作负载的高变异性和维度&#xff0c;资源使用的精确估计是一个复杂而具有挑战性的问题。在过去几年中&#xff0c;资源使用和流…