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

news/发布时间2024/4/29 11:10:05

目录

一、卷积运算

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.bcls.cn/vGak/29695.shtml

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

相关文章

QT布局管理和空间提升为和空间间隔

QHBoxLayout:按照水平方向从左到右布局; QVBoxLayout:按照竖直方向从上到下布局; QGridLayout:在一个网格中进行布局,类似于HTML的table; 基本布局管理类包括:QBoxLayout、QGridL…

hbase启动错误-local host is“master:XXXX“ destination is:master

博主的安装前提: zookeeper安装完成,且启动成功 hdfs高可用安装,yarn高可用安装,且启动成功 报错原因:端口配置不对 解决方案: 输入:hdfs getconf -confKey fs.default.name 然后把相应的…

Redis命令-List命令

4.6 Redis命令-List命令 Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似: 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff…

Apache HBase(二)

目录 一、Apache HBase 1、HBase Shell操作 1.1、DDL创建修改表格 1、创建命名空间和表格 2、查看表格 3、修改表 4、删除表 1.2、DML写入读取数据 1、写入数据 2、读取数据 3、删除数据 2、大数据软件启动 一、Apache HBase 1、HBase Shell操作 先启动HBase。再…

SpringBoot项目启动成功,但是调用接口直接报NOT FOUND 404

问题描述 SpringBoot项目启动成功,但是调用接口直接报NOT FOUND 404 解决办法 启动类中ComponentScan(basePackages {“com.afclab”})中的扫包路径和项目路径不一样,导致扫不到Controller等组件,修改成和项目路径一样就可以解决&#xf…

解锁未知领域:探索Web3技术的无限可能性

随着数字化时代的持续发展,Web3技术作为下一代互联网的重要组成部分,正呈现出无限的创新可能性。本文将深入探索Web3技术所带来的无限可能性,揭示其在各个领域的应用前景和潜力。 1. 区块链技术的革命性 Web3的核心是区块链技术,…

Git版本管理使用手册 - 8 - 合并分支、解决冲突

合并整个开发分支 切换到本地test分支,选择右下角远程开发分支,选择Merge into Current。然后提交到远程test仓库。 合并某次提交的代码 当前工作区切换成test分支,选择远程仓库中的dev开发分支,选择需要合并的提交版本右击&a…

Leetcode146. LRU 缓存

Every day a Leetcode 题目来源&#xff1a;146. LRU 缓存 解法1&#xff1a;哈希表 链表 代码&#xff1a; /** lc appleetcode.cn id146 langcpp** [146] LRU 缓存*/// lc codestart class LRUCache { private:unordered_map<int, list<pair<int, int>>:…

【I.MX6ULL移植】Ubuntu-base根文件系统移植

1.下载Ubuntu16.04根文件系统 http://cdimage.ubuntu.com/ 1 2 3 4 5 2.解压ubuntu base 根文件系统 为了存放 ubuntu base 根文件系统&#xff0c;先在 PC 的 Ubuntu 系统中的 nfs 目录下创建一个名为 ubuntu_rootfs 的目录&#xff0c;命令如下&#xff1a; 【注意&…

Android应用程序的概念性描述

1.概述 Android 应用程序包含了工程文件、代码和各种资源&#xff0c;主要由 Java 语言编写&#xff0c;每一个应用程序将被编译成Android 的一个 Java 应用程序包&#xff08;*.apk&#xff09;。 由于 Android 系统本身是基于 Linux 操作系统运行的&#xff0c;因此 …

数据分析POWER BI之power query

1.导入数据 ctrla全选--数据--获取数据--其他来源--来自表格/区域 导入数据&#xff0c;进入编辑模式 2.整理与清除 清除&#xff1a;删除所选列的非打印字符 转换--格式--清除 修整&#xff1a;删除前面和后面的空格 转换---格式---修整&#xff08;修整后前面后面的空格没有了…

星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)

之前写了个1.0版本&#xff0c;由于太局限&#xff0c;需要用到笔记本才能操作&#xff0c;很多车友反馈不方便。特此出个手机版教程&#xff0c;简单easy&#xff0c;妈妈再也不用担心我搞不定啦 一、准备工作 先卸载车机上的autokit 或者 智能互联 app&#xff0c;这步很关…

单片机之串口通信

目录 串口介绍 通信的基本概念 并行通信和串行通信 同步通信和异步通信 串行异步通信方式 串行同步通信方式 通信协议 单片机常见通信接口 串行通信三种模式 串口参数 传输速度 ​串口的连接 电平标准 串行口的组成 串口数据缓冲寄存器 串行口控制寄存器 串口…

STM32G473之flash存储结构汇总

STM32G4系列单片机&#xff0c;为32位的微控制器&#xff0c;理论上其内部寄存器地址最多支持4GB的命名及查找&#xff08;2的32次方&#xff0c;地址命名为0x00000000至0xFFFFFFFF&#xff09;。STM32官方对4GB的地址存储进行编号时&#xff0c;又分割成了8个block区域&#x…

《论文阅读》因果情绪蕴含的知识桥因果交互网络 AAAI 2023

《论文阅读》因果情绪蕴含的知识桥因果交互网络 AAAI 2023 前言简介任务定义特征提取并行知识桥接因果互动实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Knowledge-Bridged Causal Interac…

(免费分享)基于springboot,vue付费自习室系统带论文

在当今数字化时代&#xff0c;高效、便捷的管理系统成为了各行各业不可或缺的工具。特别是在教育服务领域&#xff0c;自习室作为学生和在职人员重要的学习场所&#xff0c;其预约和管理需求日益增长。为了满足这一市场需求&#xff0c;本文开发了这款基于微信小程序的付费自习…

游戏推广的新篇章:Xinstall助力实现全渠道效果统计与提升

随着游戏市场的日益繁荣&#xff0c;游戏推广已成为各大游戏公司争夺市场份额的关键环节。然而&#xff0c;面对众多推广渠道和复杂的用户行为&#xff0c;如何精准地评估推广效果、优化投放策略&#xff0c;成为了游戏推广人员亟待解决的问题。此时&#xff0c;Xinstall作为一…

B2902A是德科技B2902A精密型电源

181/2461/8938产品概述&#xff1a; Agilent B2902A 精密源/测量单元 (SMU) 是一款 2 通道、紧凑且经济高效的台式 SMU&#xff0c;能够源和测量电压和电流。它用途广泛&#xff0c;可以轻松、高精度地执行 I/V&#xff08;电流与电压&#xff09;测量。4 象限源和测量功能的集…

SAMRTFORMS 转换PDF 发送邮件

最终成果&#xff1a; *&---------------------------------------------------------------------**& Report ZLC_FIND_EXIT*&---------------------------------------------------------------------**&根据T-CODE / 程序名查询出口、BADI增强*&-------…

【前端web入门第八天】定位、CSS精灵与一些其他CSS高级技巧

文章目录 1.定位1.1相对定位1.2 绝对定位1.3定位居中1.4 固定定位1.5 堆叠层级z-index 2.CSS精灵3. 字体图标3.1 字体图标-下载字体3.2 使用步骤 4.CSS部分高级技巧4.1 过渡 transiton4.2 透明度opacity4.3 光标类型cursor补充知识点 垂直对齐方式vertical-align 1.定位 定位 …
推荐文章