ubuntu22.04@laptop OpenCV Get Started: 008_image_filtering_using_convolution

news2024/11/26 16:21:41

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

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

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

相关文章

「数据结构」MapSet

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; Map&Set &#x1f349;概念&#x1f349;模型&#x1f349;Map&#x1f34c;TreeMap和HashMap的区别&#x1f34c;Map常用方…

儿童护眼台灯哪个值得推荐?推荐专业的儿童护眼台灯

现在的孩子很多都存在视力问题&#xff0c;而且年龄也越来越早&#xff0c;不少还为上学的孩子都早已戴上小眼镜。虽说这可能存在家族近视遗传的可能性&#xff0c;不过更多的还是后天导致的。长时间玩耍电子产品、缺乏运动、不良用眼习惯、不合适的光线等等都是导致孩子近视的…

【知识图谱--第四讲知识图谱的抽取与构建】

知识图谱的抽取与构建 实体识别与分类关系抽取与属性补全概念抽取事件识别与抽取 实体识别与分类 关系抽取与属性补全 概念抽取 事件识别与抽取

面试经典150题——最小覆盖子串(困难)

"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela​ 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 还是和之前讲的一样&#xff0c;看见题目没思路&#xff0c;先试试普通情况下人的解法…

ng : 无法加载文件 C:\Program Files\nodejs\node_global\ng.ps1, 因为在此系统上禁止运行脚本

ng : 无法加载文件 C:\Program Files\nodejs\node_global\ng.ps1&#xff0c;因为在此系统上禁止运行脚本 今天在VSCode中运行ng serve --port 8081运行基于Angular的项目时&#xff0c;报错了&#xff0c;错误如下图所示&#xff1a; 解决方法&#xff1a; 按照下图的5步即…

智能汽车行业产业研究报告:4D成像毫米波雷达—自动驾驶最佳辅助

今天分享的是智能汽车系列深度研究报告&#xff1a;《智能汽车行业产业研究报告&#xff1a;4D成像毫米波雷达—自动驾驶最佳辅助》。 &#xff08;报告出品方&#xff1a;开源证券&#xff09; 报告共计&#xff1a;43页 视觉感知最佳辅助——4D 成像毫米波雷达 感知是自动…

解决‘vue‘ 不是内部或外部命令,也不是可运行的程序(设置全局变量)

发现是没有执行&#xff1a; npm install -g vue/cli 但是发现还是不行 此时&#xff0c;我们安装了 Vue CLI&#xff0c;但是在运行 vue ui 命令时出现了问题。这通常是因为全局安装的 Vue CLI 的路径没有被正确地添加到系统的环境变量中。 可以尝试以下几种方法来解决这个问…

如何把华为手机上的数据转移到荣耀手机上?

方法/步骤 点击并进入华为手机&#xff08;旧手机&#xff09;的【手机克隆】应用&#xff0c;选择【这是旧设备】&#xff1b; 点击并进入荣耀手机&#xff08;新手机&#xff09;的【换机克隆】应用&#xff0c;选择【这是新设备】&#xff1b; 荣耀手机&#xff08;新…

《VulnStack》ATTCK-1

title: 《VulnStack》ATT&CK-1 date: 2024-01-29 14:53:49 updated: 2024-02-14 18:55:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、端口扫描&#xff0c;服务探测&#xff0c;操作系统探测、nmap 漏洞库扫描、网站首页信息泄露、msf 渗透与信息收集…

源码推荐:hello-algo @ github

github https://github.com/krahets/hello-algo 本项目旨在创建一本开源、免费、对新手友好的数据结构与算法入门教程。全书采用动画图解&#xff0c;结构化地讲解数据结构与算法知识&#xff0c;内容清晰易懂&#xff0c;学习曲线平滑。算法源代码皆可一键运行&#xff0c;支…

【IDEA】新建Spring Initializr项目,选择java版本只有是17和21问题的解决方法

新建Spring Initializr项目时&#xff0c;选择java版本只有是17和21 2. 将https://start.spring.io修改为阿里云的服务器路径&#xff1a;https://start.aliyun.com 能够选择Java8、11等版本

【Linux笔记】动静态库的封装和加载

一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段&#xff0c;而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的&#xff0c;或者库是怎么形成的&…

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

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

监督学习:从数据中挖掘模式的引导

目录 前言1 定义2 举例说明3 回归问题4 分类问题结论 前言 监督学习是机器学习领域中的一种重要方法&#xff0c;通过给模型提供带有标签的训练数据&#xff0c;使其能够学习输入与输出之间的关系。这种学习方式在各个领域都有广泛的应用&#xff0c;从垃圾邮件过滤到医学诊断…

ClickHouse--08--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…

【AI视野·今日CV 计算机视觉论文速览 第298期】Fri, 26 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 26 Jan 2024 Totally 71 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities Authors Yiyuan Zhang, Xiaohan …

ARP请求的构造过程

ARP请求的构造过程&#xff1a; ARP请求的构造&#xff1a; 当设备A&#xff08;发起者&#xff09;想要与设备B&#xff08;目标&#xff09;通信&#xff0c;但它只知道设备B的IP地址&#xff08;例如&#xff0c;192.168.1.2&#xff09;&#xff0c;而不知道其MAC地址。设备…

OpenGL-ES 学习(4)---- OpenGL-ES 坐标体系

坐标体系 我们知道 OpenGL -ES 坐标系中每个顶点的 x&#xff0c;y&#xff0c;z 坐标都应该在 -1.0 到 1.0 之间&#xff0c;超出这个坐标范围的顶点都将不可见。 将一个物体&#xff08;图像&#xff09;渲染到屏幕上&#xff0c;通常经过将物体坐标转换为标准化设备坐标&am…

顺序表(上)

1.顺序表的概念 顺序表&#xff08;Sequential List&#xff09;是一种基本的数据结构&#xff0c;它是一种线性表的存储结构。线性表是一种数据元素的有限序列&#xff0c;元素之间存在顺序关系。 线性表&#xff1a;线性表&#xff08; linearlist &#xff09;是n个具有相…

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…