OpenCV图像处理技巧之空间滤波
1. 引言
再次问好,图像处理爱好者们!🌟 在前面的章节中,我们学习了图像处理的基础知识,并展现了图像增强的魅力。在这一节中,我们将更深入地研究空间滤波技术。
闲话少说,我们直接开始吧!
2. 基本概念
在图像处理方面,空间滤波器是我们所需要的基本工具。💫 这些滤波器具有根据局部相邻像素值修改其像素值的能力,使我们能够执行各种图像处理任务,例如降噪、边缘检测和图像平滑。
首先,按照惯例,让我们导入必要的库作为基础:
import numpy as np
import matplotlib.pyplot as plt
from fractions import Fraction
from skimage.io import imread, imshow# For Spatial Filters
from scipy.signal import convolve2d
from skimage.color import rgb2gray, gray2rgb
3. 空间过滤器模板
接下来,我们将对图像应用各种简单的空间过滤器。这些过滤器的模板通常会用周围像素的平均值来改变当前像素值,从而达到图像增强和其他令人兴奋的功能。
接着,通过以下代码定义我们的过滤器模板:
def get_filters():# Define Filters# Horizontal Sobel Filterkernel_hsf = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])# Vertical Sobel Filterkernel_vsf = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1]])# Edge Detectionkernel_edge = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, -1]])# Sharpenkernel_sharpen = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]])# Box Blurkernel_bblur = (1 / 9.0) * np.array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])# Define the kernelskernels = {'Box Blur': kernel_bblur,'Sharpen': kernel_sharpen,'Horizontal Sobel Filter': kernel_hsf,'Vertical Sobel Filter': kernel_vsf,'Edge Detection': kernel_edge,}return kernels
接着,让我们展示上述模板的可视化效果:
def display_filters(image_path):# Read the imageimage = imread(image_path)[:,:,:3] kernels = get_filters()# Create a figure with subplots for each kernelfig, ax = plt.subplots(2, 3, figsize=(20, 15))ax[0, 0].imshow(rgb2gray(image[:,:,:3]), cmap='gray')ax[0, 0].set_title('Original Image', fontsize=20)ax[0, 0].set_xticks([])ax[0, 0].set_yticks([])# Loop over the keys and values in the kernels dictionaryfor i, (name, kernel) in enumerate(kernels.items(), 1):# Determine the subplot indexrow = i // 3col = i % 3# Plot the kernel on the appropriate subplotax[row, col].imshow(kernel, cmap='gray')ax[row, col].set_title(name, fontsize=30)# Loop over the cells in the kernelfor (j, k), val in np.ndenumerate(kernel):if val < 1:ax[row, col].text(k, j, str(Fraction(val).limit_denominator()), ha='center', va='center', color='red',fontsize=30)else:ax[row, col].text(k, j, str(val), ha='center', va='center', color='red',fontsize=30)# Show the plotplt.tight_layout()plt.show()# Display filters
display_filters('dorm_lobby.png')
得到结果如下:

4. 展示效果
上述代码中,通过函数get_filters(),我们定义了五种常见的空间滤波器模板,分别为Horizontal Sobel Filter, Vertical Sobel Filter, Edge Detection, Sharpen以及 Box Blur 。紧着我们可以将这些滤波器应用于真实图像。此时我们可以使用 apply_selected_kernels() 函数来达到不同的可视化效果: 🖼️✨
def apply_selected_kernels(image_path, selected_kernels, plot_cols=3):# Define the kernelsall_kernels = get_filters()# Check if the selected kernels are defined, if not raise an exceptionfor k in selected_kernels:if k not in all_kernels:raise ValueError(f"Kernel '{k}' not defined.")# Read the imageimage = imread(image_path)[:,:,:3]# Apply selected kernels to each color channel of the image conv_rgb_images = {}for kernel_name in selected_kernels:kernel = all_kernels[kernel_name]transformed_channels = []for i in range(3):conv_image = convolve2d(image[:, :, i], kernel, 'valid')transformed_channels.append(abs(conv_image))conv_rgb_image = np.dstack(transformed_channels)conv_rgb_image = np.clip(conv_rgb_image, 0, 255).astype(np.uint8)conv_rgb_images[kernel_name] = conv_rgb_image# Display the original image along with the combined results of all # the kernels in a subplotfig, ax = plt.subplots(2, plot_cols, figsize=(20, 20))ax[0, 0].imshow(image)ax[0, 0].set_title('Original Image', fontsize=20)ax[0, 0].set_xticks([])ax[0, 0].set_yticks([])for i, (kernel_name, conv_rgb_image) in enumerate(conv_rgb_images.items(), 1):row, col = divmod(i, plot_cols)ax[row, col].imshow(conv_rgb_image)ax[row, col].set_title(kernel_name, fontsize=20)ax[row, col].set_xticks([])ax[row, col].set_yticks([])plt.tight_layout()plt.show()
可以通过传入不同的参数selected_kernels,得到不同的效果,样例调用代码如下:
# Visualize Edge Detection and Sobel Filters
apply_selected_kernels('dorm_lobby.png', ['Edge Detection','Horizontal Sobel Filter', 'Vertical Sobel Filter'], plot_cols=2)
得到结果如下:

当然,我们可以通过以下代码查看其他几种模板的对应效果,代码如下:
# Visualize Edge Detection, Sharpen, and Box Blur
apply_selected_kernels('dog.png', ['Edge Detection','Sharpen', 'Box Blur'], plot_cols=2)
结果如下:

5. 分析
接着,让我们更加深入的分析上述五种模板的特点和作用,归纳如下:
-
Edge Detection (kernel_edge)
这是一种通用的边缘检测滤波器,有时称为拉普拉斯滤波器或高斯拉普拉斯滤波器。该术语通常是指一系列用于识别数字图像中图像亮度急剧变化或不连续的点的方法。它对所有方向的边缘做出同等响应。它与 Sobel 滤镜之间的区别在于它不区分边缘方向。 -
Sobel filter
Sobel滤波器通常也用于边缘检测,但它专门用于检测特定方向的边缘。Sobel算子使用两个3x3的卷积核通过计算导数的近似值来检测不同方向的边缘——一个用于水平方向的边缘检测,另一个用于垂直方向的边缘检测。 -
Horizontal Sobel Filter (kernel_hsf)
这旨在最大程度地响应垂直方向边缘的检测,最小地响应水平方向的边缘。这就是为什么生成的图像突出显示了水平边缘线。 -
Vertical Sobel Filter (kernel_vsf)
这是Sobel滤波器响应的另一个方向。它旨在最大程度地响应水平方向的边缘,最小地响应垂直方向的边缘。这就是为什么生成的图像突出显示了垂直边缘线。 -
Sharpen (kernel_sharpen)
此滤波器用于增强图像的“清晰度”。它通过增强彼此相邻的像素的对比度来工作,从而使边缘看起来更加清晰。 -
Box Blur (kernel_bblur)
此滤波器用于图像模糊。它的工作原理是平均每个像素周围邻域的像素值,从而降低边缘的清晰度并混合附近像素的颜色。
6. 总结
瞧!这些滤波器为我们提供了图像转换的巨大魅力,可以突出隐藏的细节并增强其视觉冲击力。通过了解每种滤波器的特性和应用,可以释放我们的创造力,探索图像处理的无限可能性。
这不是很酷吗?😎
相关文章:
OpenCV图像处理技巧之空间滤波
1. 引言 再次问好,图像处理爱好者们!🌟 在前面的章节中,我们学习了图像处理的基础知识,并展现了图像增强的魅力。在这一节中,我们将更深入地研究空间滤波技术。 闲话少说,我们直接开始吧&#…...
Java超级玛丽小游戏制作过程讲解 第一天 创建窗口
package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…...
【POP3/IMAP/SMTP】QQ邮箱设置
什么是 POP3/IMAP/SMTP 服务 POP3 (Post Office Protocol - Version 3)协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP (Internet Message Access Protocol)协议用于支持使用电子邮件客户端交互式存取服务…...
云计算——常见集群策略
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.什么是集群 二.集群策略 1.虚拟机HA 实现虚拟机高可用性通常涉及以下关键…...
c语言locale.h简介
<locale.h>提供的函数用于控制c标准库中对于不同的地区行为不一样的部分。(地区通常是国家或者某种特定语言的地理区域) 一、locale.h简单介绍 在标准库里,依赖地区的部分通常包括以下几项: 数字量的格式 货币的格式 字符…...
C++运算符重载详解(赋值、流插入流提取、前置后置++、取地址)
C运算符重载详解 基本介绍运算符重载案列1. 赋值运算符重载2. 前置和后置重载3. cout,cin(流插入,流提取重载)4. 取地址重载 基本介绍 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值…...
sql的count函数优化
sql的count(1)函数会执行遍历表统计符合条件的数目,下面有两个sql 第一条: select count(1) from membership_call_detail_statistics a where a.repository_id f2a4ed6b3e074e33bd99998c1def26f8 and a.statistics_date between 2023-04-01 00:00:0…...
Ai创作系统ChatGPT源码搭建教程+附源码
系统使用Nestjs和Vue3框架技术,持续集成AI能力到本系统! 更新内容: 同步官方图片重新生成指令 同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GP…...
力扣 416. 分割等和子集
题目来源:https://leetcode.cn/problems/partition-equal-subset-sum/description/ C题解(思路来源代码随想录) : 背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。…...
sqlyog导出mysql数据字典
1.打开sqlyog执行sql获取字典数据 SELECTt.COLUMN_NAME AS 字段名,t.COLUMN_TYPE AS 数据类型,CASE IFNULL(t.COLUMN_DEFAULT,Null) WHEN THEN 空字符串 WHEN Null THEN NULL ELSE t.COLUMN_DEFAULT END AS 默认值,CASE t.IS_NULLABLE WHEN YES THEN 是 ELSE 否 END AS 是否…...
【C++】多态的实现及其底层原理
个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 文章目录 前言一、什么是多态?二、多态的构成条件2.1什么是虚函数?2.2虚函数的重写2…...
【网络编程】TCP带外数据总结
文章目录 一、带外数据基本知识二、带外数据的读写三、检测带外数据是否到达3.1、select上的异常事件3.2、SIGURG信号 四、带外标记 一、带外数据基本知识 带外数据(Out Of Band,OOB),用于迅速通告对方本端发生的重要事件…...
高薪程序员面试题精讲系列133之微服务里的网关有哪些实现方案?你熟悉Gateway网关吗?
一. 面试题及剖析 1. 今日面试题 微服务里的网关有哪些实现方案? Gateway网关是怎么实现的? 你用过Gateway网关吗? Gateway里有哪些路由规则? 2. 题目剖析 在上一篇文章中,壹哥给大家梳理了微服务里的远程调用、熔断等相关的面试题。今天这篇文章,壹哥会重点给大家梳理…...
计算机网络(4) --- 协议定制
计算机网络(3) --- 网络套接字TCP_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/132035757?spm1001.2014.3001.5501 目录 1. 协议的基础知识 TCP协议通讯流程 编辑 2.协议 1.介绍 2.手写协议 1.内容 2.接口 …...
【Mybatis】Mybatis架构简介
文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块 3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件 4. 接口层 1.整体架构图 MyBatis…...
如何使用大模型处理生活繁琐的工作
如果每封电子邮件、每个带有订单、发票、投诉、录用请求或工作申请的 PDF 都可以翻译成机器可读的数据,会怎样?然后可以由 ERP / CRM / LMS / TMS 自动处理吗?无需编程特殊接口。 听起来很神奇?它确实有一些魔力。但最近已成为可…...
RpcController作用浅析
RpcController作用浅析 前面提到了RpcConsumer的实现思路,但是并没说明RpcController有什么作用,不妨看看google::protobuf::RpcController: class PROTOBUF_EXPORT RpcController {public:inline RpcController() {}virtual ~RpcControlle…...
Linux(三):Linux服务器下日常实操命令 (常年更新)
基础命令 cd命令:切换目录 cd :切换当前目录百至其它目录,比如进入/etc目录,则执行 cd /etccd / :在Linux 系统中斜杠“/”表示的是根目录。cd / ,即进入根目录.cd ~:进入用户在该系统的home目录&#…...
强大的截图软件--Snipaste
这里写目录标题 前言Snipaste贴图并置顶标注功能 下载 前言 在工作中,我们经常需要保存当前屏幕的图片,虽然系统总是会自带一些截图工具,但似乎用起来总是不那个顺手,例如我们需要对图片进行一些标注,或者将图片贴在屏…...
LeetCode·每日一题·722. 删除注释·模拟
题目 示例 思路 题意 -> 给定一段代码,将代码中的注释删除并返回。 由于注释只有两种类型: 字符串// 表示行注释,表示//和其右侧的其余字符应该被忽略。字符串/* 表示一个块注释,它表示直到下一个(非重叠&#x…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
