003 OpenCV filter2D

目录

一、环境

二、图像卷积

三、代码演示

3.1、锐化

3.2、sobel边缘,x方向

3.3、sobel边缘,y方向

3.4、高斯模糊

3.5、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、图像卷积

在OpenCV中,filter2D函数是用于在图像空间域进行卷积操作的函数。然而,你也可以通过fft2ifft2函数在频率域进行滤波。下面我将对这两种方法进行简单的比较。

空间域卷积:

空间域卷积是一种直接在图像上应用滤波器的方法。filter2D函数会接受一个输入图像和一个滤波器,然后在输入图像上应用滤波器。滤波器是一个二维数组,通常是一个核对图像进行卷积。例如,你可以使用一个边缘检测滤波器来检测图像中的边缘。

优点:

  1. 直观:空间域卷积直观易懂,易于实现和理解。
  2. 计算效率高:由于滤波器直接应用于图像像素,因此这种方法的计算效率相对较高。

缺点:

  1. 边缘效应:空间域卷积可能会在图像边缘产生不期望的效应,例如边缘像素的变形。
  2. 无法处理大滤波器:由于卷积核需要覆盖整个图像,因此对于大的滤波器,空间域卷积可能会变得非常慢。

频域滤波:

频域滤波是在频率域上应用滤波器的方法。首先,使用fft2函数将输入图像转换到频率域,然后应用滤波器,最后使用ifft2将结果转换回空间域。在频率域上,滤波器可以是一个一维数组,大大降低了处理时间和内存需求。

优点:

  1. 处理大滤波器:由于在频率域上进行滤波,所以可以处理任意大小的滤波器,而不会增加卷积核的大小。
  2. 边缘效应减少:由于在频率域上进行操作,所以可以减少在空间域卷积中出现的边缘效应。

缺点:

  1. 计算复杂度增加:频域滤波需要额外的步骤来转换图像到频率域和回空间域,这会增加计算的复杂度。
  2. 对噪声敏感:频率域滤波可能会放大图像中的噪声,特别是在高频部分。
  3. 需要更多的内存:频域滤波需要额外的内存来存储频率域的图像和滤波器。

总的来说,空间域卷积和频域滤波各有其优点和缺点。选择哪种方法取决于你的具体需求和问题。例如,如果你需要处理非常大的滤波器或者需要减少边缘效应,那么频域滤波可能是一个更好的选择。如果你需要快速简单的方法或者处理小滤波器,那么空间域卷积可能更适合你。

三、代码演示

卷积在图像中原理很简单,如下图,图像I1被卷积核K提取特征,最终得到I2,但是要注意,I1维度是5x5的,计算的时候,需要将其四周边界进行拓展(padding),形成7X7的矩阵(拓展区域填充0),然后卷积,最后才能得到5X5的I2。

3.1、锐化

# 卷积核:锐化
    kernel_shape = np.array([[0, -1, 0],
                             [-1, 5, -1],
                             [0, -1, 0]], np.float32)  # kernel should be floating point type

下面左边是原图,右边是效果图,效果图明显比原图更加清晰。

3.2、sobel边缘,x方向

# 卷积核:sobel边缘,X方向
    kernel_sebelx = np.array([[-1, 0, 1],
                             [-2, 0, 2],
                             [-1, 0, 1]], np.float32) 

3.3、sobel边缘,y方向

# 卷积核:sobel边缘,y方向
    kernel_sebely = np.array([[1, 2, 1],
                             [0, 0, 0],
                             [-1, -2, -1]], np.float32) 

3.4、高斯模糊

# 卷积核:高斯模糊,元素和为1
    kernel_gaussian = np.array([[0.1, 0.1, 0.1],
                                [0.1, 0.2, 0.1],
                                [0.1, 0.1, 0.1]], np.float32) 

3.5、完整代码

from __future__ import print_function
import sys
import time
import numpy as np
import cv2 as cv

def main(argv):
    src = cv.imread('7.jpg', 1)
    cv.namedWindow("Input", cv.WINDOW_AUTOSIZE)
    cv.namedWindow("Output", cv.WINDOW_AUTOSIZE)
    cv.imshow("Input", src)
    # 卷积核:锐化
    kernel_shape = np.array([[0, -1, 0],
                             [-1, 5, -1],
                             [0, -1, 0]], np.float32)  # kernel should be floating point type
    # 卷积核:sobel边缘,X方向
    kernel_sebelx = np.array([[-1, 0, 1],
                             [-2, 0, 2],
                             [-1, 0, 1]], np.float32) 
    # 卷积核:sobel边缘,y方向
    kernel_sebely = np.array([[1, 2, 1],
                             [0, 0, 0],
                             [-1, -2, -1]], np.float32) 
    # 卷积核:高斯模糊,元素和为1
    kernel_gaussian = np.array([[0.1, 0.1, 0.1],
                                [0.1, 0.2, 0.1],
                                [0.1, 0.1, 0.1]], np.float32) 
    #dst1 = cv.filter2D(src, -1, kernel_shape)
    #dst1 = cv.filter2D(src, -1, kernel_sebelx)
    #dst1 = cv.filter2D(src, -1, kernel_sebely)
    dst1 = cv.filter2D(src, -1, kernel_gaussian)
    cv.imshow("Output", dst1)
    cv.waitKey(0)
    cv.destroyAllWindows()
    return 0

if __name__ == "__main__":
    main(sys.argv[1:])

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

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

相关文章

时间序列预测(6) — ARIMA实现单输入单输出负荷预测

目录 1 数据准备与可视化 2 简单数据探索与清洗 3 差分处理 4 绘制ACF与PACF图像,完成模型选择 5 建立ARIMA和SARIMA模型 5.1 初步建模 5.2 精细化建模 5.3 最终的模型 ARIMA作为成熟的统计学模型已被各种软件以各种方式实现,在Python中我们最常使…

电源地虚接,导致信号线发烫

音频板的信号是经过隔直电容接到音频板的。

【STM32】CRC(循环冗余校验)

一、CRC的背景知识 1、什么是CRC (1)CRC(Cyclic Redundancy Check),循环冗余校验 (2)什么是校验,为什么需要校验:数据传输,数据存储过程中需要使用到的 (3)什么是冗余:表示比实际上要传输的数据…

正版软件|Kaspersky 杀毒软件 - 全方位安全软件

卡巴斯基 全方位安全软件 一款产品满足 您的全部安全需求, 通过屡获殊荣的保护产品抵御黑客、病毒和恶意软件,获得无与伦比的安全感。此外还有支付保护和隐私保护工具,为您提供全方位保护。包含高级版功能: 免费 Kaspersky Safe …

使用Jupyter Notebook调试PySpark程序错误总结

项目场景: 在Ubuntu16.04 hadoop2.6.0 spark2.3.1环境下 简单调试一个PySpark程序,中间遇到的错误总结(发现版对应和基础配置很重要) 注意:在前提安装配置好 hadoop hive anaconda jupyternotebook spark zo…

vulnhub靶机Momentum2

下载地址:https://download.vulnhub.com/momentum/Momentum2.ova 主机发现 端口扫描 端口服务扫描 漏洞扫描 先去看看web 这里面没有什么,就顺手扫一下目录 发现一些可疑的目录 比较正常 再看一下有没有别的web 看到几个新的东西去看看 文件上传 啥都没…

8.jib-maven-plugin构建springboot项目镜像,docker部署配置

目录 1.构建、推送镜像 1.1 执行脚本 2.2 pom.xml配置 ​2.部署镜像服务 2.1 执行脚本 2.2 compose文件 3.docker stack常用命令 介绍:使用goole jib插件构建镜像,docker stack启动部署服务; 通过执行两个脚本既可以实现构建镜像、部…

实时音视频方案汇总

若有好的方案欢迎留言讨论,非常感谢,汇总了一些,从市面上了解的一些低时延的端到端的方案,仅供参照,若有问题,也欢迎留言更正! 方案 方案描述 时延 备注 1大华同轴高清电缆200米电缆&#xf…

Mysql之多表查询下篇

Mysql之多表查询下篇 满外连接的实现UNION关键字UNIONUNION ALL操作符 7种SQL JOINS的实现语法格式小结自然连接USING连接表连接的约束条件 满外连接的实现 在上篇博客中,我们可以了解到在Mysql中是不支持FULL JOIN来实现 满外连接的,那么我们在Mysql采用…

“鸿蒙之父”确认鸿蒙 PC 来了;腾讯是囤积 AI 芯片最多的中国科技公司之一丨 RTE 开发者日报 Vol.87

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Cow Lineup S——离散化、单调队列、双指针

题目描述 思路 x、id不大于1亿,数据量太大,使用离散化将id离散化成一串从1开始连续的编号,使用map集合进行离散化使用双指针维护一段区间,这段区间满足每个编号都包含 如何使用map集合进行离散化? 维护一个变量nums…

如何将中文翻译成荷兰语?

随着中国的崛起,荷兰与中国的交流日益频繁。越来越多的企业和个人需要荷兰语翻译服务。那么,如何将中文翻译成荷兰语,北京哪家翻译公司比较专业? 专业人士指出,要提供优质的荷兰语翻译服务,不仅需要扎实的荷…

如何为初创企业选择合适的 ERP 系统?

**ERP系统**是制造、分销、供应链、金融、会计、风险管理等多个行业必不可少的企业技术解决方案。不论垂直行业、企业规模或目标受众如何,将ERP作为企业管理战略的核心部分都非常重要。 对于渴望发展的小型企业和初创企业来说,更是如此。大型企业需要对…

Maven依赖管理项目构建工具(保姆级教学)

一、Maven介绍 官网地址:Maven – Introduction Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 Maven就是一个软件&#…

mysql索引学习案例

简单的学习一下mysql普通索引 这是一个小的案例 一、创建表SQL CREATE TABLE group_order (id int(11) NOT NULL AUTO_INCREMENT,group_seq varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT 拼单号,group_status int(8) NOT NULL COMMENT 100 待提货, 200 已提货, 300 已…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux)A-2&#…

vite+vue3+ts中watch和watchEffct的使用

vitevue3ts中watch和watchEffct的使用 本文目录 vitevue3ts中watch和watchEffct的使用watchrefreactivepropsimmediate组合监听 watchEffect单值多值侦听副作用停止监听 watch vue官方文档:https://cn.vuejs.org/api/reactivity-core.html#watch 可以监听基础类型&…

cookie机制 + java 案例

目录 为什么会有cookie?? cookie从哪里来的?? cookie到哪里去?? cookie有啥用?? session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

牛客机考题编程题输入输出

有时空可以练练这里的题目: https://ac.nowcoder.com/acm/contest/5652 做个总结,其实就两种输入类型: 一种是下面这种,需要对输入的每行进行运算 这种就是循环读取每行的数做一个运算: import sys while True:line …

【Nuxt】Nuxt3 动态导入图片 src

nuxt3 不再支持 require 动态导入资源,因此需要我们将图片放到 public 目录下,这样我们就可以动态导入了 比如下面 👇: 感谢 Nuxt3遇见的坑(四):图片动态渲染之后打包路径问题以及打包css样式…