机器视觉学习(七)—— 卷积、边缘和滤波器

目录

一、卷积运算

1.1 卷积运算的公式

1.2 卷积操作

二、垂直边缘与水平边缘

2.1 cv2.filter2D()函数

2.2 Sobel算子

三、滤波器


一、卷积运算

1.1 卷积运算的公式

卷积运算是一种图像处理的基本操作,常用于图像滤波、边缘检测等应用中。

卷积运算的基本思想是将一个图像与一个称为卷积核(或滤波器)的小矩阵进行乘积运算,然后将所有乘积的结果相加,得到最终的输出图像。这个过程可以用以下公式表示:

1. 假设我们有一个3×3的图像:

1 2 3
4 5 6
7 8 9

2. 而我们有一个3×3的滤波器:

-1 0 1
-1 0 1
-1 0 1

卷积运算的过程如下:

将滤波器与图像的一个像素窗口进行对应元素的乘法操作:

(-1 × 1) + (0 × 2) + (1 × 3) = 2
(-1 × 4) + (0 × 5) + (1 × 6) = 2
(-1 × 7) + (0 × 8) + (1 × 9) = 2

对乘法结果进行求和以得到新的像素值:

2 + 2 + 2 = 6

将新的像素值放置在输出图像的相应位置。

重复以上过程,对图像的每个像素都进行卷积运算,最终得到输出图像。

如图所示:

1.2 卷积操作

在OpenCV中,可以通过使用cv2.filter2D()函数来进行卷积运算。该函数接受输入图像、输出图像、卷积核等参数,可以对图像进行卷积运算并得到结果。

以下是一个使用OpenCV进行卷积运算的示例代码:

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg')# 定义卷积核
kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]])# 进行卷积运算
result = cv2.filter2D(image, -1, kernel)# 显示结果图像
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们读取了一张图像,然后定义了一个卷积核。卷积核是一个3x3的矩阵,表示一个锐化效果。最后,我们使用cv2.filter2D()函数对图像进行卷积运算,并将结果显示出来。

二、垂直边缘与水平边缘

2.1 cv2.filter2D()函数

在OpenCV中,使用cv2.filter2D()进行垂直边缘和水平边缘检测,您可以使用以下内核:

垂直边缘:

kernel_vertical = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])

水平边缘:

kernel_horizontal = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])

下面是一个示例代码,展示如何使用cv2.filter2D()对图像进行垂直边缘和水平边缘检测:

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', 0)# 定义垂直边缘和水平边缘的内核
kernel_vertical = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
kernel_horizontal = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])# 使用cv2.filter2D()进行垂直边缘检测
vertical_edges = cv2.filter2D(image, -1, kernel_vertical)# 使用cv2.filter2D()进行水平边缘检测
horizontal_edges = cv2.filter2D(image, -1, kernel_horizontal)# 显示原始图像和边缘图像
cv2.imshow('Original Image', image)
cv2.imshow('Vertical Edges', vertical_edges)
cv2.imshow('Horizontal Edges', horizontal_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,我们首先使用cv2.imread()读取图像,再使用cv2.filter2D()分别应用这些内核来检测垂直边缘和水平边缘。最后,我们使用cv2.imshow()显示原始图像和边缘图像。

2.2 Sobel算子

在OpenCV中,也可以使用Sobel算子来检测图像中的垂直边缘和水平边缘。

垂直边缘检测:

import cv2# 读取图像
image = cv2.imread('image.jpg')# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Sobel算子检测垂直边缘
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)# 将结果取绝对值并转为无符号8位整型
sobelx = cv2.convertScaleAbs(sobelx)# 显示结果
cv2.imshow('Vertical Edges', sobelx)
cv2.waitKey(0)
cv2.destroyAllWindows()

水平边缘检测:

import cv2# 读取图像
image = cv2.imread('image.jpg')# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Sobel算子检测水平边缘
sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)# 将结果取绝对值并转为无符号8位整型
sobely = cv2.convertScaleAbs(sobely)# 显示结果
cv2.imshow('Horizontal Edges', sobely)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这两个例子中,cv2.Sobel()函数用来执行Sobel算子操作。它接受以下参数:

  • gray:灰度图像。
  • cv2.CV_64F:结果图像的数据类型。
  • 1, 0:在垂直方向上计算一阶导数。
  • 0, 1:在水平方向上计算一阶导数。
  • ksize=3:Sobel算子的大小。

所得到的结果是包含边缘强度的图像,通过取绝对值,并将其转换为无符号8位整型,我们可以得到可视化的边缘图像。最后,使用cv2.imshow()函数来显示结果。

三、滤波器

OpenCV是一个开源的计算机视觉库,提供了一些滤波器的实现。

  1. 均值滤波器(Mean Filter):通过计算像素周围邻域内像素的平均值来平滑图像。可以使用cv2.blur()函数实现。

  2. 高斯滤波器(Gaussian Filter):根据高斯分布来对图像进行平滑处理。可以使用cv2.GaussianBlur()函数实现。

  3. 中值滤波器(Median Filter):通过计算像素周围邻域内像素的中值来平滑图像。可以使用cv2.medianBlur()函数实现。

  4. 双边滤波器(Bilateral Filter):考虑了像素的空间距离和像素之间的灰度差异,以保持边缘的清晰度。可以使用cv2.bilateralFilter()函数实现。

  5. 自定义滤波器(Custom Filter):可以通过定义自己的卷积核来实现自定义的滤波效果。可以使用cv2.filter2D()函数实现。

import cv2 as cvimg = cv.imread("D:/Open_CV/OpenCV_demo/Pictures/1.1.png")
img = cv.resize(img,(300,300),interpolation = cv.INTER_AREA)       # 图像缩放 (长,宽)blur = cv.blur(img,(5,5))                               # 均值滤波
gaussian = cv.GaussianBlur(img,(7,7),10)                # 高斯滤波
median = cv.medianBlur(img,5)                           # 中值滤波
bila = cv.bilateralFilter(img,9,75,75)                  # 双边滤波cv.imshow("img",img)
cv.imshow("blur",blur)
cv.imshow("gaussian",gaussian)
cv.imshow("median",median)
cv.imshow("bila",bila)cv.waitKey(0)

运行结果:

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

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

相关文章

【Linux】 centos7安装卸载SQL server(2017、2019)

一、安装配置 准备一个基础Linux配置: 内存为20GB 运行内存为2GB的系统(数据库小于2GB安装不了) 1、网络配置 我们需要进行网络的连接 进入 cd /ect/sysconfig/network-script/ 编辑文件ifcfg-ens33 vi ifcfg-ens33 Insert键进行编辑 把ONBOO…

公平锁和非公平锁,为什么要“非公平”?

公平锁和非公平锁,为什么要“非公平”? 主要讲一讲公平锁和非公平锁,以及为什么要“非公平”? 什么是公平和非公平 首先,我们来看下什么是公平锁和非公平锁,公平锁指的是按照线程请求的顺序,…

后端常问面经之Java基础

基本数据类型 Java中有8种基本数据类型: 6种数字类型: 4种整数型:byte、short、int、long 2种浮点型:float、double 1种字符类型:char 1种布尔类型:boolean 数据类型的默认值以及所占空间如下&#x…

java智慧城管执法平台源码,现场移动执法APP源码

智慧城管执法平台源码 智慧城管综合执法办案系统,提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能,全面赋能执法队员,提高执法队员办案效率。 智慧城管综合执法办案系统在业务上能够支持所有行政处罚权力项目的网上…

一文整合工厂模式、模板模式、策略模式

为什么使用设计模式 今天终于有时间系统的整理一下这几个设计模式了, 这几个真是最常用的,用好了它们,你就在也不用一大堆的if else 了。能更好的处理大量的代码冗余问题。 在我们的实际开发中,肯定会有这样的场景:我…

High 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程(附链接)https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开靶场找到该漏洞页面 先右键检查输入框属性 还是和之前一样的,所以直接输入 HTML 标签提交…

Ruoyi若依框架下载流程详细解读(SpringBoot-Vue)

图解: 前端设计: 前端设计一个link文字连接或者按钮(ElementUI)Element - The worlds most popular Vue UI framework 前端请求设计: import request from /utils/request //下载示例模型定义语言的JSON export const…

文件编辑命令—vim

1.vim vim 是vi的升级版本.vi 文件名(vi方向键用不了) vim 的官方网站 (welcome home : vim online) 自己也说 vim 是一个程序开发工具而不是文字处理软件。 2.安装vim sudo apt install vim 如果出错了:apt update:刷新软件源; 出现"无法获得锁 之类的"sudo rm 文件…

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 书山有路勤为…

K8S Storage

概述 一般情况下,K8S中的Pod都不应该将数据持久化到Pod中,因为Pod可能被随时创建和删除(扩容或缩容),即便是StatefulSet或Operator的Pod,也都不建议在Pod里存放数据,可以将数据持久化到Host上。…

各种排序介绍

1.排序的概念 排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排…

Microsoft Excel 快捷键 (keyboard shortcut - hotkey)

Microsoft Excel 快捷键 [keyboard shortcut - hotkey] References 表格内部换行快捷键 Alt Enter 快速将光标移到表末 Ctrl End 快速将光标移到表首 Ctrl Home References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

学生宿舍智能控电柜安装调试技术

学生宿舍智能控电柜安装调试石家庄光大远通电器有限公司宿舍控电限电管理系统是一种用于管理学生宿舍用电的智能系统,主要功能包括: 1.实时监控和控制:该系统能够实时监测和记录宿舍的用电情况,包括电器使用情况、电量消耗等。管理人员可以通过电脑或手机…

【python】flask各种版本的项目,终端命令运行方式的实现

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

SpringBoot学习之ElasticSearch下载安装和启动(Mac版)(三十一)

本篇是接上一篇Windows版本,需要Windows版本的请看上一篇,这里我们继续把Elasticsearch简称为ES,以下都是这样。 一、下载 登录Elasticsearch官网,地址是:Download Elasticsearch | Elastic 进入以后,网页会自动识别系统给你提示Mac版本的下载链接按钮 二、安装 下载…

高效物联网连接技术创新:ECWAN边缘协同自组网的未来——基于ChirpLAN窄带扩频技术的无线混合组网

物联网是指将各种物理设备通过互联网进行连接和通信的技术。它是一个庞大的网络,由传感器、设备、网络和云服务组成,旨在实现对物体的远程监测、控制和数据采集。 基于ChirpLAN窄带扩频技术的无线混合组网协议ChirpLAN,ChirpLAN是基于其自有的…

面试知识汇总——垃圾回收器(分代收集算法)

分代收集算法 根据对象的存活周期,把内存分成多个区域,不同区域使用不同的回收算法回收对象。 对象在创建的时候,会先存放到伊甸园。当伊甸园满了之后,就会触发垃圾回收。 这个回收的过程是:把伊甸园中的对象拷贝到F…

无公网IP怎么办?

在当今互联网的发展中,公网IP地址成为了连接互联网的重要条件之一。并非所有设备或者网络都具备公网IP地址。本文将探讨无公网IP的局限性以及解决方案。 无公网IP的局限性 拥有公网IP地址的设备可以直接通过互联网进行通信,而无公网IP的设备则面临一些局…

软件设计师19--文件管理

软件设计师19--文件管理 考点1:文件相关概念例题: 考点2:树形目录结构(绝对路径与相对路径)例题: 考点3:位示图例题: 考点4:索引文件索引文件结构例题: 考点1…

Word邮件合并

Word邮件合并功能可以解决在Word中批量填写内容的需求,当需要大量格式相同,只修改少数相关内容时,例如利用Word制作工资条,通知函,奖状等等,同时操作也非常简单灵活。下面通过例子来说明邮件合并的使用方法…