【代码实现】opencv 高斯模糊和pytorch 高斯模糊
wiki百科
Gaussian Blur,也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。
opencv实现
opencv实现高斯滤波有两种方式,
1、是使用自带的
cv2.GaussianBlur,
2、自己构造高斯kernel,然后调用cv2.filter2D函数,
方法2这个高斯kernel也可以使用opencv自带的cv2.getGaussianKernel来创建,并通过乘以转置来获得NXN的核。
以下是示例代码。
import cv2
import numpy as np
original_image = np.random.rand(256, 256, 3).astype(np.float32)# 设置高斯核大小和标准差
sigma = 0.334# 确定高斯核大小
kernel_size = int(6 * sigma + 1) # 通常选择为 6*sigma + 1# 使用 OpenCV 进行高斯模糊,方法1
a = cv2.GaussianBlur(original_image, (0, 0), sigma)# 使用 OpenCV 进行高斯模糊,方法2
kernel = cv2.getGaussianKernel(kernel_size, sigma)
kernel = kernel * kernel.transpose()b = cv2.filter2D(original_image, -1, kernel)
print(np.abs(a - b).max())
np.allclose(a, b, atol=1e-3)
pytorch 实现
有可能在构建的网络中需要使用高斯滤波,但是又不想通过opencv实现,也可以在tensor层面对图像进行高斯滤波。也就是使用卷积的方式来实现filter。
同样实现方式也有两种,
1、使用 F.conv2d的方式
2、使用nn.Conv2d ,但权重 需要固定
需要先定义高斯核,然后在采用上述两种方式来具体实现
# 定义高斯核
def gaussian_kernel(size, sigma):x = torch.arange(size, dtype=torch.float32) - size // 2kernel_1d = torch.exp(-0.5 * (x / sigma) ** 2)kernel_1d /= kernel_1d.sum()kernel_2d = torch.outer(kernel_1d, kernel_1d)return kernel_2d.unsqueeze(0).unsqueeze(0)
特别需要注意的是group 要设置为3,RGB通道分别使用高斯核,不然结果会出错。
以下是两种方法的实现。
# 方法1 F.conv2d应用高斯模糊
def apply_gaussian_blur(image, kernel_size, sigma):padding = (kernel_size - 1) // 2# 使用 ReflectionPad2d 进行填充img_torch_pad = F.pad(image, pad=(padding, padding, padding, padding), mode='reflect')kernel = gaussian_kernel(kernel_size, sigma)kernel = kernel.repeat(3, 1, 1, 1) # 重复以匹配输入图像的通道数kernel = kernel.to(image.device)# 使用卷积操作进行高斯模糊blurred_image = F.conv2d(img_torch_pad, kernel, padding=0, groups=3)return blurred_image
# 方法2 创建带有固定高斯核的Conv2D层
class GaussianBlur(nn.Module):def __init__(self, kernel_size, sigma, in_channels=3):super(GaussianBlur, self).__init__()kernel = gaussian_kernel(kernel_size, sigma)kernel = kernel.repeat(in_channels, 1, 1, 1) # 重复以匹配输入图像的通道数self.conv = nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, padding=0,stride=1,groups=in_channels, bias=False)self.padding = (kernel_size-1)//2self.conv.weight.data = kerneldef forward(self, x):x = F.pad(x, pad=(self.padding, self.padding, self.padding, self.padding), mode='reflect')#x = self.pad(x)return self.conv(x)
比较四种方法的差异
# 创建一个形状为 (1, 3, 256, 56) 的随机图像
original_image = np.random.rand(1, 3, 256, 56)
original_image_np = original_image[0].transpose(1, 2, 0)# 将 NumPy 数组转换为 PyTorch 张量
original_image_tensor = torch.tensor(original_image, dtype=torch.float32)# 设置高斯核大小和标准差
sigma = 0.334# 确定高斯核大小
kernel_size = int(6 * sigma + 1) # 通常选择为 6*sigma + 1# opencv 方法1
opencv1 = cv2.GaussianBlur(original_image_np, (0, 0), sigma).transpose(2, 0, 1)[np.newaxis, ...] #根据sigma创建kernel,一般是6s +1
# opencv 方法2
# 使用 OpenCV 进行高斯模糊,方法2
kernel = cv2.getGaussianKernel(kernel_size, sigma)
kernel = kernel * kernel.transpose()
opencv2 = cv2.filter2D(original_image_np, -1, kernel).transpose(2, 0, 1)[np.newaxis, ...]
# torch 方法1
torch1 = apply_gaussian_blur(original_image_tensor, kernel_size, sigma).numpy()
# torch 方法2
blur_layer = GaussianBlur(kernel_size, sigma)
torch2 = blur_layer(original_image_tensor).detach().numpy()def all_arrays_close(*arrays):reference = arrays[0]for array in arrays[1:]:if not np.allclose(reference, array,rtol=1e-5, atol=1e-8):return Falsereturn Trueif all_arrays_close(opencv1, opencv2, torch1, torch2):print("All arrays are close to each other.")
else:print("Arrays are not close to each other.")
输出

说明四种方法是等价的。
相关文章:
【代码实现】opencv 高斯模糊和pytorch 高斯模糊
wiki百科 Gaussian Blur,也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。 opencv实现 opencv实现高斯滤波有两种方式, 1、是使用自带的cv2…...
python基础语法2
文章目录 1.顺序语句2.条件语句2.1 语法格式 3.缩进与代码块4.空语句 pass5.循环语句5.1 while循环5.2 for循环 5.3 continue与break 1.顺序语句 默认情况下,python的代码都是按照从上到下的顺序依次执行的。 print(hello ) print(world)结果一定是hello world。写…...
linux第一课:下载与安装
这是我的个人复习笔记,草稿箱字太多会卡就发这了,欢迎大家阅读。 Kali Linux,黑客必备神器。跟着我,带你从入门到入狱! 第一课,下载与安装。 第一步: 在官网下载Centos镜像:http…...
虚拟机添加共享文件夹后仍无法显示文件
参考: https://blog.csdn.net/Pretender_1205/article/details/134859089 进入/mnt/hgfs目录下执行 sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other/mnt/hgfs 是挂载点,也可以修改为其他挂载点-o allow_other表示允许其他用户(普通用户)访问共…...
OSPF协议
基础知识 OSPF:开放式最短路径优先协议 (无类别链路状态IGP动态协议) OSPF的特点: 1.OSPF将自治系统划分为逻辑上的区域,使用LSA来发布路由信息,并通过OSPF报文在区域内路由器之间交互建立链路状态数据库和路由表 2.支持等开销的负载均衡…...
行为设计模式 -观察者模式- JAVA
观察者模式 一.简介二. 案例2.1 抽象主题(Subject)2.2 具体主题(Concrete Subject)2.3 抽象观察者(Observer)2.4 具体观察者(Concrete Observer)2.5 测试 三. 结论3.1 优缺点3.2 使用…...
在阿里工作是一种什么体验?
很多人都对在阿里工作感到好奇,今天就来给大家分享一下在阿里工作是一种什么体验~ 首先,先来介绍一下阿里的职位等级划分标准。 简单来讲,阿里的职位等级可以认为是 P 序列和 M 序列,但目前 M 序列已经不太对中下层员工开放了&…...
828华为云征文|华为云Flexus云服务器X实例——uniapp功能开发、搭建股票系统选择用什么服务器比较好?
在二次开发、安装搭建股票系统时,选择华为云Flexus X服务器是一个值得考虑的优质选项。以下是一些具体的建议: 测试环境:Linux系统CentOS7.6、宝塔、PHP7.3、MySQL5.7,根目录public,伪静态thinkphp,开启ssl…...
电子电路元件器介绍与选型——晶振
一、晶振 在我们使用嘉立创的时候,经常会看到晶振接到两个电容,这两个电容毫无疑问是滤波的,整个晶振其实就是一个振荡器,但这个振荡器会将其他频率给过滤掉,只保留一个频率也就是晶振的标称频率。当然上面讲的很明显是…...
【IEEE PDF eXpress】格式不对
目录 一、问题二、解决方法 一、问题 word的文档,用IEEE PDF eXpress网站生成pdf后,提交论文出现错误: Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…...
OpenAI全新多模态内容审核模型上线:基于 GPT-4o,可检测文本和图像
在数字时代,内容安全问题愈发受到重视。9月26日,OpenAI 正式推出了一款全新的多模态内容审核模型,名为 “omni-moderation-latest”。 该模型基于最新的 GPT-4o 技术,能够准确地识别检测有害文本图像。这一更新将为开发者提供强大…...
Visual Studio 字体与主题推荐
个人推荐,仅供参考: 主题:One Monokai VS Theme 链接:One Monokai VS Theme - Visual Studio Marketplacehttps://marketplace.visualstudio.com/items?itemNameazemoh.onemonokai 效果: 字体:JetBrain…...
信息学奥赛一本通 1416:【17NOIP普及组】棋盘 | 洛谷 P3956 [NOIP2017 普及组] 棋盘
【题目链接】 洛谷 P3956 [NOIP2017 普及组] 棋盘 ybt 1416:【17NOIP普及组】棋盘 【题目考点】 1. 深搜:深搜回溯 2. 深搜剪枝:最优化剪枝 【解题思路】 搜索从左上角到右下角的所有走法中花费金币最少的走法。 需要使用深搜回溯&…...
UE4完整教程 UE4简介 UE4学习攻略及文件格式
开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费!全文干货。 UE4简介学习攻略UE4Demo代码面试内容资源-CSDN文库https://download.csdn.net/download/m0_72216164/89825102 工作招聘无领导小组面试全攻略最常见面试题(第一部分)共有17章+可…...
JVM内存回收机制
目录 1.JVM运行时数据区 2.JVM类加载过程 3.双清委派模型 4.垃圾回收机制(GC) 找出谁是垃圾方案一:引用计数 找出谁是垃圾:方案二,可达性分析 释放垃圾的内存空间 判断垃圾:jvm依据对象的年龄对 对象…...
中国身份证号码校验
题目描述 第二届河南省最美教师评选开始了,每一位同学都可以投票选出你支持的人选,但是为了防止刷票,必须通过身份验证才可投票。负责投票平台后台的老大爷希望你能帮他验证身份证号的合法性,防止那些熊孩子随意刷票,…...
【Kubernetes】常见面试题汇总(五十四)
目录 120.创建 init C 容器后,其状态不正常? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-113 属于【Kubernetes】的生产…...
不懂外语也能无障碍交流?探索4款超好用中英翻译工具
嘿,各位外贸流程的小伙伴们,今儿咱们来聊聊那些翻译神器,看看它们在中英文互译这条路上,是怎么给我们这些天天跟洋文打交道的哥们儿姐们儿减轻负担的。我亲身体验了福昕翻译在线、福昕翻译大师、海鲸AI翻译还有腾讯翻译君…...
C++ WebDriver扩展
概述 WebDriver协议基于HTTP,使用JSON进行数据传输,定义了client与driver之间的通信标准。无论client的实现语言(如Java或C#),都能通过协议中的endpoints准确指示driver执行各种操作,覆盖了Selenium的所有功…...
WeChat_DevTools 断点调试方法总结
新建工程,以小程序 login 调试为例,代码如下: // 登录wx.login({success: res > {// 发送 res.code 到后台换取 openId, sessionKey, unionIddebugger;resThis this;wx.showModal({title: 登录成功,content: res.code res.code,comple…...
影刀RPA 企业级专题篇:自动化中台架构与多业务流程治理实践
影刀RPA 企业级专题篇:自动化中台架构与多业务流程治理实践 作者:林焱 很多团队最开始做自动化。 目标都很简单。 让流程跑起来。 减少重复操作。 前期。 几个流程。 几台机器。 一个维护人员。 系统看起来非常轻。 但随着业务扩大。 问题会…...
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
涡流检测驱动的发动机气门硬度分选技术【附算法】
✨ 长期致力于核环境机器人、机器人运动学、机械臂振动抑制、自适应动力学控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)核辐射环境下涡流检测机…...
Agent 一接 MCP 大结果集就开始失忆:从 Result Summarization 到 Cursor Paging 的工程实战
一、MCP 一接大结果集,Agent 最先坏掉的不是推理,而是记忆 🧠 很多团队把 MCP 当成 Agent 的万能扩展层:只要把数据库、工单、代码检索、指标平台都挂进去,模型就能“边查边做”。真正上线后最先暴露的问题却很一致&am…...
CANN/asc-devkit算子动态库配置
KernelSo 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/c…...
为什么 AI 多智能体系统最终都会遇到“混乱边界”?
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
ElevenLabs台湾话语音上线后用户留存率骤降47%?揭秘方言语料清洗盲区与3步合规性校验法
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs台湾话语音上线后用户留存率骤降47%?揭秘方言语料清洗盲区与3步合规性校验法 ElevenLabs于2024年Q2正式上线台湾话(闽南语)语音合成服务,初期D…...
【限时解密】ElevenLabs未公开的瑞典文语料权重配置表:仅限前200名开发者获取的/sv-SE/声道微调参数
更多请点击: https://codechina.net 第一章:瑞典文语音合成的技术背景与ElevenLabs架构定位 瑞典语作为北日耳曼语支的重要语言,拥有丰富的元音系统(9个长元音、9个短元音)、独特的声调重音(accent 1 和 a…...
使用Taotoken的Python SDK快速接入大模型API教程
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken的Python SDK快速接入大模型API教程 对于希望快速将大模型能力集成到Python应用中的开发者而言,直接对接多…...
构建企业级 AI 编程助手(AI-OS)v1.0,集成 Matt Pocock 全套技能,实现零幻觉开发
告别单文件 Prompt:构建企业级 AI 编程助手(AI-OS)v1.0,集成 Matt Pocock 全套技能,实现零幻觉开发 引言:为什么你的 AI 编程总是“翻车”? 在使用 OpenCode、Cursor、Cline 等 AI 编程工具时&a…...
