【OpenCV实现图像:图像处理技巧之空间滤波】
文章目录
- 概要
- 导入库
- 空间过滤器模板
- 展示效果
- 分析与总结
概要
空间滤波器是数字图像处理中的基本工具之一。它通过在图像的每个像素位置上应用一个特定的滤波模板,根据该位置周围的相邻像素值进行加权操作,从而修改该像素的值。这种加权操作能够突出或模糊图像的特定特征,实现多种图像处理任务。
在降噪任务中,空间滤波器可以平均化局部像素值,减少图像中的噪声,使图像看起来更清晰。在边缘检测中,滤波器可以强调图像中的边缘,使其更加显著,便于后续分析。而在图像平滑任务中,空间滤波器则可以平滑图像中的过渡区域,使图像看起来更加连续和自然。
通过在不同的图像处理场景中灵活应用空间滤波器,可以有效改善图像质量,满足各种视觉需求。这些滤波器的设计和选择是图像处理领域的重要课题,能够帮助人们更好地理解和分析图像信息。
导入库
为了进行图像处理,我们通常需要导入一些必要的库
import numpy as np
import matplotlib.pyplot as plt
from fractions import Fraction
from skimage.io import imread, imshow
from scipy.signal import convolve2d
from skimage.color import rgb2gray, gray2rgb
空间过滤器模板
空间滤波器模板是用于修改像素值的核心工具。在以下代码中,我们定义了五种常见的空间滤波器模板,分别是Horizontal Sobel Filter、Vertical Sobel Filter、Edge Detection、Sharpen和Box Blur。
def get_filters():# 定义滤波器模板kernel_hsf = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])kernel_vsf = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1]])kernel_edge = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, -1]])kernel_sharpen = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]])kernel_bblur = (1 / 9.0) * np.array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])kernels = {'Box Blur': kernel_bblur,'Sharpen': kernel_sharpen,'Horizontal Sobel Filter': kernel_hsf,'Vertical Sobel Filter': kernel_vsf,'Edge Detection': kernel_edge,}return kernels
展示效果
通过以上定义的滤波器模板,我们可以将它们应用于真实图像上,以获得不同的视觉效果。
将display_filters('dorm_lobby.png') 换成自己的图片即可
def display_filters(image_path):# 读取图像image = imread(image_path)[:,:,:3] kernels = get_filters()# 创建包含子图的图像窗口fig, 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([])for i, (name, kernel) in enumerate(kernels.items(), 1):row = i // 3col = i % 3ax[row, col].imshow(kernel, cmap='gray')ax[row, col].set_title(name, fontsize=30)for (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)plt.tight_layout()plt.show()# 展示滤波器效果
display_filters('dorm_lobby.png')
结果:

述代码中,通过函数get_filters(),我们定义了五种常见的空间滤波器模板,分别为Horizontal Sobel Filter, Vertical Sobel Filter, Edge Detection, Sharpen以及 Box Blur 。接着我们可以将这些滤波器应用于真实图像。
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
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 kernelsdef 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()def apply_selected_kernels(image_path, selected_kernels, plot_cols=3):# Define the kernelskernels = get_filters()# Check if the selected kernels are defined, if not raise an exceptionfor k in selected_kernels:if k not in kernels:raise ValueError(f"Kernel '{k}' not defined.")# Read the imageimage = imread(image_path)[:, :, :3]# Apply selected kernels to each color channel of the imageconv_rgb_images = {}for kernel_name in selected_kernels:kernel = 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 and convolved imagesfig, axs = plt.subplots(len(selected_kernels) + 1, plot_cols, figsize=(15, 10))axs[0, 0].imshow(image)axs[0, 0].set_title('Original Image')axs[0, 0].axis('off')for i, kernel_name in enumerate(selected_kernels, 1):axs[i, 0].imshow(conv_rgb_images[kernel_name])axs[i, 0].set_title(kernel_name)axs[i, 0].axis('off')# Hide remaining empty subplots, if anyfor i in range(len(selected_kernels) + 1, len(axs.flat)):axs.flatten()[i].axis('off')plt.tight_layout()plt.show()# 调用display_filters()函数来获取滤波器矩阵
# display_filters('dorm_lobby.png')# 调用apply_selected_kernels()函数,传入图像路径和希望应用的滤波器名称列表
apply_selected_kernels('dorm_lobby.png',['Edge Detection','Horizontal Sobel Filter','Vertical Sobel Filter'])
结果:

当然,我们可以通过以下代码查看其他几种模板的对应效果,代码如下:
# Visualize Edge Detection, Sharpen, and Box Blur
apply_selected_kernels('dog.png', ['Edge Detection','Sharpen', 'Box Blur'], plot_cols=2)
分析与总结
在图像处理中,空间滤波器的作用非常强大。不同的滤波器模板可以用于实现各种图像处理任务,例如边缘检测、图像锐化和模糊等。通过深入了解每种滤波器的特点和应用场景,我们可以更好地运用它们,释放创造力,探索图像处理的无限可能性。通过本文的介绍,希望读者对空间滤波器有了更加清晰的认识,能够在实际应用中灵活运用这些知识,创造出更加引人注目的图像效果。
相关文章:
【OpenCV实现图像:图像处理技巧之空间滤波】
文章目录 概要导入库空间过滤器模板展示效果分析与总结 概要 空间滤波器是数字图像处理中的基本工具之一。它通过在图像的每个像素位置上应用一个特定的滤波模板,根据该位置周围的相邻像素值进行加权操作,从而修改该像素的值。这种加权操作能够突出或模…...
载波通讯电表的使用年限是多久?
随着科技的飞速发展,智能家居、物联网等概念逐渐深入人心,载波通讯电表作为一种新型的智能电表,凭借其低功耗、高可靠性、远程通讯等优点,广泛应用于居民用电、工业生产等领域。那么,载波通讯电表的使用年限是多久呢&a…...
微信小程序多端应用 Donut 多端编译
目前支持 wxml、wxs、js/ts、json,less/sass 等文件类型,资源支持通过配置区分不同平台 wxml中使用 <!-- #if MP --><view class"test-view">wechat</view><!-- #elif IOS --><view class"test-view"…...
调试 Mahony 滤波算法的思考 10
调试 Mahony 滤波算法的思考 1. 说在前面的2.Mahony滤波算法的核心思想3. 易懂的理解 Mahony 滤波算法的过程4. 其他的一些思考5. 民间 9轴评估板 1. 说在前面的 之前调试基于QMI8658 6轴姿态解算的时候,我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让…...
Bean——IOC(Github上有代码)
源码 https://github.com/cmdch2017/Bean_IOC.git 获取Bean对象 BeanFactory Bean的作用域 第三方Bean需要用Bean注解 比如消息队列项目中,需要用到Json的消息转换器,这是第三方的Bean对象,所以不能用Component,而要用Bean …...
功能更新|Leangoo领歌免费敏捷工具支持SAFe大规模敏捷框架
Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo可以支持敏捷研发管理全流程,包括小型团队敏捷开发,规模化敏捷SAFe…...
漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案
漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解…...
交流信号继电器 DX-31BJ/AC220V JOSEF约瑟 电压启动 面板嵌入式安装
DX系列信号继电器由矩形脉冲激磁,磁钢保持。本继电器为双绕组。工作线圈可为电压型,亦可为电流型。复归线圈为电压型。继电器的工作电流或工作电压为长脉冲,亦可为脉冲不小于20mS的短脉冲。 系列型号 DX-31B信号继电器DX-31BJ信号继电器 D…...
SpringCloudAlibaba系列之Nacos配置管理
目录 说明 认识配置中心 Nacos架构图 Nacos配置管理实现原理 核心源码分析-客户端 核心源码分析-服务端 配置修改的实时通知 主流配置中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos配置中心的一些实现,很多细节没有涉及&#…...
Kyligence Copilot 亮相第六届进博会,增添数智新活力
11月5日,第六届中国国际进口博览会(以下简称“进博会”)在上海国家会展中心盛大启幕,众多新科技、新成果、新展品亮相本届进博会。作为阿斯利康(AstraZeneca)合作伙伴,跬智信息(Kyli…...
MySQL 批量修改表的列名为小写
1、获取脚本 SELECT concat( alter table , TABLE_NAME, change column , COLUMN_NAME, , lower( COLUMN_NAME ), , COLUMN_TYPE, comment \, COLUMN_COMMENT, \; ) AS 脚本 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA 数据库名 and TABLE_NAME表名-- 大写是up…...
ElasticSearch 查询方法示例 java
public List<PricePolicyConditionDTO> queryEs(OrderPriceOutDTO param, List<String> materialCodeList, List<String> categoryCodeList) {BoolQueryBuilder mainQueryBoolBuilder new BoolQueryBuilder();//销售组织if (CharSequenceUtil.isNotEmpty(pa…...
5G毫米波通信中的关键技术
随着5G技术的快速发展,毫米波通信作为其中的一项重要技术,在高速数据传输、低延迟通信和大规模连接等方面具有显著的优势。本文将探讨5G毫米波通信中的关键技术,包括毫米波频段的选择、信号处理技术和MIMO技术等。 一、毫米波频段的选择 毫米…...
2.3.3 交换机的RSTP技术
实验2.3.3 交换机的RSTP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置。2.开启交换机的STP。3.配置SW3A和SW3B上STP的优先级。将SW3A配置为根交换机,SW3B配置为备用根交换机。4.配置SW2A和SW2B的边缘接口 六、任务验收七、…...
国外访问学者/博士后留学人员反诈骗指南
访问学者/博士后/联合培养博士人员出国后,对当地环境及政策不熟悉,需要提高防范意识,为此,知识人网小编特整理这篇反诈骗指南,提醒留学人员防微杜渐、未雨绸缪。 近日,多国使馆发布相关提醒:不法…...
设计模式之组合模式-创建层次化的对象结构
目录 概述概念主要角色应用场景 组合模式的实现类图NS图基本代码组合模式的精髓意外收获(❀❀) 应用示例-公司组织架构管理需求结构图代码 组合模式的优缺点优点缺点 总结 概述 概念 组合模式是一种结构型设计模式,它允许将对象组合成树形结…...
Windows 有趣功能集锦
Windows 有趣功能集锦 隐藏文件或文件夹 CMD 运行以下命令隐藏 # attrib h <文件或文件夹名称> attrib r h s a 测试显示 # attrib h <文件或文件夹名称> attrib -r -h -s -a 测试使视频显示为图片 准备一个视频文件和一个需要显示的图片先将视频压缩成压缩文…...
【nodejs版playwright】02-支持多套测试环环境执行用例
日常测试中,一套测试用例需支持在不同的测试环境运行,如staging、production 因为涉及不同的测试环境,那使用的环境变量或参数就不一样,如staging登录可能用到的用户名是A,而production可能用到的是b。 所以需要有一个…...
React高阶组件(Higher-Order Components, HOCs)
React 高阶组件 (Higher Order Components, HOCs) 是一种模式,让组件具备一定的扩展能力。它是函数式编程思想在 React 应用程序中的体现。HOCs 可以让你重用组件,提高组件的可复用性。 HOCs 是什么? 高阶组件实际上是一个函数,…...
利用RoboBrowser库和爬虫代理实现微博视频的爬取
技术概述 微博是一个社交媒体平台,用户可以在上面发布和分享各种内容,包括文字、图片、音频和视频。微博视频是微博上的一种重要的内容形式,有时我们可能想要下载微博视频到本地,以便于观看或分析。但是,微博视频并没…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
