【代码实现】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.")

输出
在这里插入图片描述
说明四种方法是等价的。

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

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

相关文章

在MacOS上安装MongoDB数据库

一、安装方法 1.1 安装包安装 首先,打开MongoDB 官网下载安装包,下载链接:https://www.mongodb.com/try/download/community。 根据自己的系统环境自行选择下载的版本。将下载好的 MongoDB 安装包解压缩,并将文件夹名改为 mon…

机器学习基本上就是特征工程——《特征工程训练营》

作为机器学习流程的一部分,特征工程是对数据进行转化以提高机器学习性能的艺术。 当前有关机器学习的讨论主要以模型为中心。更应该关注以数据为中心的机器学习方法。 本书旨在介绍流行的特征工程技术,讨论何时以及如何运用这些技术的框架。我发现&…

yolov8实例分割重要图片

训练分割要准备好数据集和分割预训练权重文件 下面这张图是数据集的格式 下面这张图配置数据集,下面names 要和labelme转txt里配置的一样 下面这张图进行训练,配置一些全局参数 ,初始的yolov8s-seg.pt文件需要到github上yolov8开源项目里下 l…

ERROR [internal] load metadata for docker.io/library/openjdk:8

ERROR: failed to solve: DeadlineExceeded: DeadlineExceeded: DeadlineExceeded: openjdk:8: failed to do request: Head “https://registry-1.docker.io/v2/library/openjdk/manifests/8”: dial tcp 202.160.129.6:443: i/o timeout 在构建docker镜像时从docker.io/libr…

论文笔记(四十七)Diffusion Policy: Visuomotor Policy

Diffusion Policy: Visuomotor Policy 文章概括摘要1. 介绍2. 扩散策略的公式化2.1 去噪扩散概率模型2.2 DDPM 训练2.3 用于视觉运动策略学习的扩散模型 3 关键设计决策3.1 网络架构选项3.2 视觉编码器3.3 噪声计划3.4 加速实时控制的推理 4. 扩散策略的四个引人入胜的特性4.1 …

【Python报错已解决】error: subprocess-exited-with-error

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

004集—— txt格式坐标写入cad(CAD—C#二次开发入门)

如图所示原始坐标格式,xy按空格分开,将坐标按顺序在cad中画成多段线: 坐标xy分开并按行重新输入txt,效果如下: 代码如下 : using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; us…

一文详解WebRTC、RTSP、RTMP、SRT

背景 好多开发者,希望对WebRTC、RTSP、RTMP、SRT有个初步的了解,知道什么场景该做怎样的方案选择,本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC,相信好多开发者第一件事想到的就是低延迟,WebRTC(W…

HarmonyOS Next应用开发——瀑布流WaterFlow

瀑布流WaterFlow 瀑布流容器,由“行”和“列”分割的单元格所组成,通过容器自身的排列规则,将不同大小的“项目”自上而下,如瀑布般紧密布局。 瀑布流容器的子组件只能是FlowItem,可以配合ForEach、LazyForEach进行循…

聚星文社——绘唐科技有什么区别!

聚星文社和绘唐科技是两个不同的公司,有一些区别。下面是它们的一些区别: 绘唐科技——聚星文社https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof 行业领域:聚星文社主要从事文化娱乐行业,包括出版、影视制作等&…

Redis: 主从复制原理

主从复制原理剖析 1 )配置 通过下面的从节点的配置项可以开启主从之间的复制功能slaveof 192.16.10.101 6379这里的复制包含全量复制和增量复制 2 )主节点的主从配置信息解析 查看主从之间的信息,在主节点上 $ info replication 打印出来的…

【Power Query】M函数-List.Sum

M函数-List 列表求和 &#xff08;List.Sum&#xff09;&#xff1a;1&#xff09;横向求和2&#xff09;列求和★思路★</font>★实操★</font> 3&#xff09;求总和4&#xff09;求部分占总体的比重★横向★</font>★竖向★</font> 列表求和 &#x…

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…

OPENCV判断图像中目标物位置及多目标物聚类

文章目录 在最近的项目中&#xff0c;又碰到一个有意思的问题需要通过图像算法来解决。就是显微拍摄的到的医疗图像中&#xff0c;有时候目标物比较偏&#xff0c;也就是在图像的比较偏的位置&#xff0c;需要通过移动样本&#xff0c;将目标物置于视野正中央&#xff0c;然后再…

unity一键注释日志和反注释日志

开发背景&#xff1a;游戏中日志也是很大的开销&#xff0c;虽然有些日志不打印但是毕竟有字符串的开销&#xff0c;甚至有字符串拼接的开销&#xff0c;有些还有装箱和拆箱的开销&#xff0c;比如Debug.Log(1) 这种 因此需要注释掉&#xff0c;当然还需要提供反注释的功能&am…

通信工程学习:什么是MAC媒体接入控制

MAC&#xff1a;媒体接入控制 MAC&#xff08;Medium Access Control&#xff09;&#xff0c;即媒体接入控制&#xff0c;是计算机网络中数据链路层的一个重要组成部分&#xff0c;负责协调多个发送和接收站点对一个共享传输媒体的占用。以下是关于MAC的详细解释&#xff1a; …

闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨

上图为执行语义搜索前的聚类演示 &#xff0c;嵌入技术是自然语言处理的核心组成部分。虽然嵌入技术的应用范围广泛&#xff0c;但在检索应用中的语义搜索仍是其最常见的用途之一。 尽管知识图谱等可以提升检索的准确率和效率&#xff0c;但标准向量检索技术仍然具有其实用价值…

实战笔记:Vue2项目Webpack 3升级到Webpack 4的实操指南

在Web开发领域&#xff0c;保持技术的更新是非常重要的。随着前端构建工具的快速发展&#xff0c;Webpack已经更新到5.x版本&#xff0c;如果你正在使用Vue2项目&#xff0c;并且还在使用Webpack 3&#xff0c;那么是时候考虑升级一下Webpack了。我最近将我的Vue2项目从Webpack…

MicoZone-Maven

一、理论 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供项目构建和依赖管理支持的工具。 通过Maven管理依赖的优势&#xff1a; 1、通过在pom.xml中指定jar包坐标即可自动从仓库下载依赖 2、如果jar包存在子依赖会自动下载子依赖包 3、如果jar包之间存在冲突…

【初阶数据结构】详解插入排序 希尔排序(内含排序的概念和意义)

文章目录 前言1. 排序的概念及其应用1.1 排序的概念1.2 排序的应用 2. 插入排序2.1 基本思想2.2 插入排序的代码实现2.3 插入排序算法总结 3. 希尔排序3.1 基本思想3.2 希尔排序的代码实现3.3 希尔排序的特征总结 前言 初级数据结构系列已经进入到了排序的部分了。相信大家听到…