Pytorch 实现sobel算子的卷积操作详解
作者:洪流之源 发布时间:2022-02-22 10:11:37
标签:Pytorch,sobel算子,卷积
卷积在pytorch中有两种实现,一种是torch.nn.Conv2d(),一种是torch.nn.functional.conv2d(),这两种方式本质都是执行卷积操作,对输入的要求也是一样的,首先需要输入的是一个torch.autograd.Variable()的类型,大小是(batch,channel, H,W),其中batch表示输入的一批数据的数目,channel表示输入的通道数。
一般一张彩色的图片是3,灰度图片是1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数。H和W表示输入图片的高度和宽度,比如一个batch是32张图片,每张图片是3通道,高和宽分别是50和100,那么输入的大小就是(32,3,50,100)。
如下代码是卷积执行soble边缘检测算子的实现:
import torch
import numpy as np
from torch import nn
from PIL import Image
from torch.autograd import Variable
import torch.nn.functional as F
def nn_conv2d(im):
# 用nn.Conv2d定义卷积操作
conv_op = nn.Conv2d(1, 1, 3, bias=False)
# 定义sobel算子参数
sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')
# 将sobel算子转换为适配卷积操作的卷积核
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))
# 给卷积操作的卷积核赋值
conv_op.weight.data = torch.from_numpy(sobel_kernel)
# 对图像进行卷积操作
edge_detect = conv_op(Variable(im))
# 将输出转换为图片格式
edge_detect = edge_detect.squeeze().detach().numpy()
return edge_detect
def functional_conv2d(im):
sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') #
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))
weight = Variable(torch.from_numpy(sobel_kernel))
edge_detect = F.conv2d(Variable(im), weight)
edge_detect = edge_detect.squeeze().detach().numpy()
return edge_detect
def main():
# 读入一张图片,并转换为灰度图
im = Image.open('./cat.jpg').convert('L')
# 将图片数据转换为矩阵
im = np.array(im, dtype='float32')
# 将图片矩阵转换为pytorch tensor,并适配卷积输入的要求
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
# 边缘检测操作
# edge_detect = nn_conv2d(im)
edge_detect = functional_conv2d(im)
# 将array数据转换为image
im = Image.fromarray(edge_detect)
# image数据转换为灰度模式
im = im.convert('L')
# 保存图片
im.save('edge.jpg', quality=95)
if __name__ == "__main__":
main()
原图片:cat.jpg
结果图片:edge.jpg
来源:https://blog.csdn.net/weicao1990/article/details/100521530


猜你喜欢
- SQL Server 2005 远程连接配置TCP/IP属性.Surface Area Configuration –> Databa
- Python内建了map()和reduce()函数。如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified
- 修改MySQL下的默认mysql数据库的user表,删除所有host为localhost记录,另外添加一些其他记录,重新启动MySQL服务器
- 前言随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数
- 一.ajax介绍1、ajax的含义Ajax全称“Async Javascript And XML”即:异步的javascript和XML。它
- 关于递归函数:函数内部调用自身的函数。以n阶乘为例:f(n) = n ! = 1 x 2 x 3 x 4 x...x(n-1)x(n) =
- 一. 视图集与路由的使用使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:list() 提供一组数据retrieve() 提
- lambda 函数Python 支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做 lambda 的函数,是从 Lisp 借用来的
- 那么,现在如果给出一个权限编号,要去检索出用后这个权限的用户集合,就会需要在逗号分隔的多个权限编号中去匹配给出的这个权限编号。如果使用lik
- 正态分布应用最广泛的连续概率分布,其特征是“钟”形曲线。这种分布的概率密度函数为:其中,μ为均值,σ为标准差。求正态分布曲线下面积有3σ原则
- 啥也不说了,直接上代码吧!# encoding:utf-8import requests # 导入requests模块用于访问测试自己的ip
- 这次介绍日期数据处理。用python中的方法对日期数据进行处理, 我们可以获取很多有用的信息, 比如年月日,星期,周次,季度等, 这里分享工
- 一、前言班花加我说她电话坏了让我看看,那肯定义不容辞!【兴奋了半个小时】没别的我就想秀一下技术!五分钟后我修好了,电脑重启之后显示输入密码,
- 授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。在
- 什么是Scrapy?Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各
- Python 爬虫之超链接 url中含有中文出错及解决办法python3.5 爬虫错误:UnicodeEncodeError: 'a
- 本人野生程序员一名,了解了一些微服务架构、前后端分离、SPA的知识后就想试试做点什么东西。之前一直做后端,前端只是有基础知识。之前学习过an
- 1. 说明本篇主要针对在Ubuntu系统中,matplotlib显示不了中文的问题,尤其是在无法安装系统
- 搭建ftp服务器server端# -*- coding:utf-8 -*-from pyftpdlib.authorizers import
- 逆向最大匹配方法有正即有负,正向最大匹配算法大家可以参阅https://www.jb51.net/article/127404.htm逆向最