使用libtorch实现sobel算子进行边缘检测,python和c++实现

文章目录

  • python
    • python结果
  • cpp
    • c++结果

python

import torch
import torch.nn as nn
from PIL import Image
import numpy as np
import cv2class SobelEdgeDetector(nn.Module):def __init__(self):super(SobelEdgeDetector, self).__init__()self.convx = nn.Conv2d(1,1,3,padding=1)self.convy = nn.Conv2d(1,1,3,padding=1)self.convx.weight.data = torch.FloatTensor([[1,0,-1],[2,0,-2],[1,0,-1]]).unsqueeze(0).unsqueeze(0)self.convy.weight.data = torch.FloatTensor([[1,2,1],[0,0,0],[-1,-2,-1]]).unsqueeze(0).unsqueeze(0)def forward(self, x):grad_x = self.convx(x)grad_y = self.convy(x)edges = torch.sqrt(grad_x**2 + grad_y**2)return edgesdef norm_gray(img):max_value = np.max(img)min_value = np.min(img)img = ( img - min_value) / (max_value - min_value ) * 255img = np.clip(img, 0, 255).astype(np.ubyte)return imgif __name__ == '__main__':img = cv2.imread("/home/lhb_python_2/seg_2d/JPEGImages/Abyssinian_1.jpg", 0)img = torch.tensor(img,dtype=torch.float32).unsqueeze(0).unsqueeze(0)print(img.shape)model = SobelEdgeDetector()model.eval()edges = model(img)outputs = edges.squeeze().detach().numpy()print(outputs.shape)outputs = norm_gray(outputs)cv2.imwrite("edge.jpg",outputs)

python结果

在这里插入图片描述

cpp

// libtorch实现sobel算子边缘检测#include<torch/script.h>
#include<torch/torch.h>
#include<opencv.hpp>
#include<iostream>using std::cout; using std::endl;
using std::string;inline torch::nn::Conv2dOptions Conv2dOptions(int64_t in_channels, int64_t out_channles, int64_t kernel_size,int64_t stride = 1, int64_t padding = 1, bool with_bias = false
) 
{torch::nn::Conv2dOptions conv2dOptions = torch::nn::Conv2dOptions(in_channels, out_channles, kernel_size);conv2dOptions.stride(stride);conv2dOptions.padding(padding);conv2dOptions.bias(with_bias);return conv2dOptions;
}class SobelEdgeDetector : public torch::nn::Module
{
private:torch::nn::Conv2d convx{ nullptr };torch::nn::Conv2d convy{ nullptr };public:SobelEdgeDetector(int in_channels, int out_channels, int kernel_size, int stride, int padding = 1);torch::Tensor forward(torch::Tensor x);
};int main()
{SobelEdgeDetector model(1, 1, 3, 1, 1);std::string imgPath("C:\\Users\\Administrator\\Downloads\\Abyssinian_1.jpg");cv::Mat img = cv::imread(imgPath, 0);torch::Tensor imgTesor = torch::from_blob(img.data, { img.rows, img.cols, 1 }, torch::kByte).permute({ 2,0,1 }).unsqueeze(0).to(torch::kFloat32);cout << imgTesor.sizes() << endl;model.eval();auto outTensor = model.forward(imgTesor);//cout << outTensor.sizes() << endl;//cout << outTensor << endl;float min_val = outTensor.min().item<float>();float max_val = outTensor.max().item<float>();outTensor = (outTensor - min_val) / (max_val - min_val) * 255;cv::Mat outImg(outTensor.size(2), outTensor.size(3), CV_32FC1, outTensor.data_ptr<float>());/*cv::imshow("w", outImg);cv::waitKey();*/cv::imwrite("edge.jpg", outImg);return 0;
}SobelEdgeDetector::SobelEdgeDetector(int in_channels, int out_channels, int kernel_size, int stride, int padding)
{convx = register_module("convx", torch::nn::Conv2d(Conv2dOptions(in_channels, out_channels, kernel_size, stride, padding)));convy = register_module("convy", torch::nn::Conv2d(Conv2dOptions(in_channels, out_channels, kernel_size, stride, padding)));convx->weight = torch::tensor({ {1,0,-1},{2,0,-2},{1,0,-1 } }, torch::kFloat32);convx->weight = convx->weight.unsqueeze(0);convx->weight = convx->weight.unsqueeze(0);//cout << convx->weight << endl;convy->weight = torch::tensor({ {1,2,1},{0,0,0},{-1,-2,-1 } }, torch::kFloat32);convy->weight = convy->weight.unsqueeze(0);convy->weight = convy->weight.unsqueeze(0);
}torch::Tensor SobelEdgeDetector::forward(torch::Tensor x)
{//return torch::Tensor();torch::Tensor gradX = this->convx(x);torch::Tensor gradY = this->convy(x);torch::Tensor edges = torch::sqrt(gradX * gradX + gradY * gradY);return edges;
}

c++结果

在这里插入图片描述

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

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

相关文章

植物病害检测YOLOV8,OPENCV调用

【免费】植物病害检测&#xff0c;10种类型&#xff0c;YOLOV8训练&#xff0c;转换成ONNX&#xff0c;OPENCV调用资源-CSDN文库 植物病害检测&#xff0c;YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTH…

实现vue3响应式系统核心-shallowReactive

简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应&#xff0c;当你取出的值为对象类型&#xff0c;需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应&#xff0c;即 只代理了对象的第一层&#xff0c;也就是 shallowReactiv…

【java核心-IoC(控制反转)和DI(依赖注入)及AOP(面向切面编程)】

java核心-IoC&#xff08;控制反转&#xff09;和DI&#xff08;依赖注入&#xff09;及AOP&#xff08;面向切面编程&#xff09; 控制反转&#xff08;IoC&#xff09;依赖注入&#xff08;DI&#xff09;面向切面编程&#xff08;AOPAOP的应用场景包括但不限于&#xff1a;以…

安装和启动berTopic,hdbscan和importlib.metadata

1. 安装问题&#xff1a;hdbsacn 安装berTopic的时候&#xff0c;包 hdbsacn一直安装失败&#xff0c;报出以下错误&#xff1a; 尝试了很多办法&#xff1a;① 下载hdbscan的tar.gz文件安装&#xff0c;安装失败&#xff1b;② 安装*.whl文件&#xff0c;安装成功&#xff…

【C++初阶】C++入门(2)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、函数重载1.1 函数重载的概念1.2 函数重载的种类1.3 C支持函数重载的原理 二…

海外短剧系统国际短剧源码h5多语言版app挂载tiktok油管ins

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目 前言 一、海外短剧系统是什么&#xff1f; 二、海外短剧系统功能与运营方式介绍 1.系统功能 2.短剧APP运营方式 总结 前言 本文简单介绍海外短剧系统的功能&#xff…

Flutter的安装与环境配置

一、下载安装Futter&#xff1a; 1、Flutter中文文档&#xff1a; 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK&#xff1a; Flutter中文文档 里面有&#xff0c;下载完成之后找个文件夹解压出来&#xff0c;最好不要将 Flu…

asp.net core监听本地ip地址

开发asp.net core的时候遇到一个问题我想提供访问供其他同事测试&#xff0c;但是默认都是localhost或者127.0.0.1。我想换成我的Ip地址访问但是不行&#xff0c;百度搜索需要更换监听的地址即修改launchSettings.json&#xff0c;修改为0.0.0.0:5248&#xff0c;这样不管local…

Enlight官方第三届“金融帝国杯”玩家游戏视频邀请赛《获奖者名单公布》

Enlight官方第三届“金融帝国杯”玩家游戏视频邀请赛 《获奖者名单公布》 ————————————— Ⅰ〖公布单位〗 金融之路CapLab官方中文社群竞赛委员会 ————————————— Ⅱ〖公布时间〗 2024年01月31日 ————————————— Ⅲ〖获奖结果〗 一等奖1名…

gdp调试—Linux

目录 介绍 使用 介绍 代码分为debug模式和release模式 如果一份代码要被调试&#xff0c;这份代码必须是debug Linux下编译代码默认是是release模式 如果你想代码是debug模式 必须加上 - g 小提&#xff1a; vim默认&#xff1a;命令模式 gcc默认&#xff1a;releas…

比Filebeat更强大的日志收集工具-Fluent bit的http插件实战

文章目录 1.前言2. fluent bit http插件配置以及参数详解3. Http 接口服务3.1 开发Http 接口服务3.2 重启fluent bit向http web服务发送数据 1.前言 Fluent Bit 的 HTTP 插件提供了一种灵活而通用的机制&#xff0c;可用于将日志数据 从各种环境中传输到指定的远程服务器&#…

【JVM】类加载流程

目录 1.加载 2.链接 &#xff08;1&#xff09;校验 &#xff08;2&#xff09;准备 &#xff08;3&#xff09;解析 3.初始化 4.使用 5.卸载 1.加载 加载阶段&#xff0c;简言之&#xff0c;查找并加载类的二进制数据&#xff0c;生成 Class 的实例 在加载类时&#x…