opencv学习:风格迁移对图像风格进行更改

news2025/1/2 0:29:16

介绍:

        风格迁移是一种计算机视觉技术,它能够让一张图片看起来像是用另一种风格画出来的。想象一下,你有一张普通的照片,但你希望它看起来像是梵高的印象派画作,或者像是某个著名艺术家的作品,风格迁移就可以实现。

DNN模块是什么:

        DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能,其作用是载入别的深度学习框架(如 TensorFlow、Caffe、Torch 等)中已经训练好的模型,然后用该模型完成预测等工作。

DNN 模块的特点:

● 轻量: OpenCV 的深度学习模块只实现了模型推理功能,不涉及模型训练,这使得相关程序非常精简,加速了安装和编译过程。

● 外部依赖性低:重新实现一遍深度学习框架使得 DNN 模块对外部依赖性极低,极大地方便了深度学习应用的部署。

● 方便:在原有 OpenCV 开发程序的基础上,通过 DNN 模块可以非常方便地加入对神经网络推理的支持。

● 集成:若网络模型来自多个框架,如一个来自 TensorFlow,另外一个来自 Caffe,则 DNN 模块可以方便地对网络进行整合。

● 通用性:DNN 模块提供了统一的接口来操作网络模型,内部做的优化和加速适用于所有网络模型格式,支持多种设备和操作系统。

图像预处理的功能:

        将需要处理的图像转换成可以传入人工神经网络的数据形式。 DNN 模块中的函数 blobFromlmage 完成图像预处理,从原始图像构建一个符合人工神经网络输入格式的四维块。 它通过调整图像尺寸和裁图像、减均值、按比例因子缩放、交换 B 通道和R通道等可选操作完成对图像的预处理,得到符合人工神经网络输入的目标值。

代码步骤

  1. 读取图像:使用cv2.imread函数读取待处理的图像。
    import cv2
    image=cv2.imread('right.jpg')
  2. 图像预处理:将图像转换为深度学习模型可以接受的格式。
    # 获取图像的高度和宽度
    (h,w)=image.shape[:2]
    # 创建一个blob对象,用于网络输入
    # 这里将图像缩放到与原图相同的尺寸,不改变图像的宽高比,不进行裁剪
    blob=cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),swapRB=True,crop=False)
  3. 加载模型:加载预训练的风格迁移模型。
    # 加载预训练的神经网络模型
    net=cv2.dnn.readNet(r'model\starry_night.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\la_muse.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\candy.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\composition_vii.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\feathers.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\udnie.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\the_scream.t7')
  4. 网络输入:将预处理后的图像输入到模型中,执行模型的前向传播,得到风格迁移后的图像。
    # 设置网络输入
    net.setInput(blob)
    # 网络前向传播
    out=net.forward()
  5. 后处理:对模型输出的结果进行归一化和通道顺序转换,使其成为可显示的图像格式。
    # 调整输出的形状,使其成为标准的图像格式
    out_new=out.reshape(out.shape[1],out.shape[2],out.shape[3])
    # 归一化处理,使像素值在0到1之间
    cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)
    # 转换通道顺序,从CHW转换为HWC
    result=out_new.transpose(1,2,0)

运行结果

完整代码

import cv2
image=cv2.imread('right.jpg')
# 获取图像的高度和宽度
(h,w)=image.shape[:2]
# 创建一个blob对象,用于网络输入
# 这里将图像缩放到与原图相同的尺寸,不改变图像的宽高比,不进行裁剪
blob=cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),swapRB=True,crop=False)
# 加载预训练的神经网络模型
net=cv2.dnn.readNet(r'model\starry_night.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\la_muse.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\candy.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\composition_vii.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\feathers.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\udnie.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\the_scream.t7')
# 设置网络输入
net.setInput(blob)
# 网络前向传播
out=net.forward()
# 调整输出的形状,使其成为标准的图像格式
out_new=out.reshape(out.shape[1],out.shape[2],out.shape[3])
# 归一化处理,使像素值在0到1之间
cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)
# 转换通道顺序,从CHW转换为HWC
result=out_new.transpose(1,2,0)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

        通过本次实验,我们成功地使用OpenCV和深度学习模型实现了图像的风格迁移。我们了解到,通过预训练的模型,我们可以轻松地将一种风格应用到另一张图像上。这种技术在艺术创作、图像编辑等领域有着广泛的应用。此外,实验也加深了我们对深度学习在图像处理领域应用的理解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 ——— oj题:搜索插入位置

目录 题目要求 代码实现 题目要求 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置 请必须使用时间复杂度为 O(long n) 的算法 示例 1: 输入: nums [1,3,5,6], t…

golang包管理

package 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。 包与依赖管理 本章学习目标 掌握包的定义和使用掌握init初始化函数的使用掌握…

一、el-table的滚动条加粗并解决遮挡内容问题

近期接到产品提的需求,反馈用户说table里面的滚动条过小,不方便拖动,希望加粗,然后我就研究了下如何加粗,发现加粗后会导致遮挡内容的问题,并予以解决。以下是实现和解决的方法和步骤。 先看看官网的滚动条…

[翻译]MOSIP 101

目录 Architecture Principles of MOSIP (MOSIP架构原则) MOSIP Functional Architecture(MOSIP功能架构) MOSIP Features(MOSIP特点) MOSIP Modules(MOSIP模块) MOSIP Logical…

manjaro kde 24 应该如何设置才能上网(2024-10-13亲测)

要在 Manjaro KDE 24 上设置网络连接,可以按照以下步骤进行设置,确保你能够连接到互联网: 是的,你可以尝试使用一个简单的自动修复脚本来解决 Manjaro KDE 中的网络连接问题。这个脚本将检查网络服务、重新启动 NetworkManager、…

R语言统计分析——相关图

参考资料:R语言实战【第2版】 相关系数矩阵是多元统计分析的一个基本方面。哪些被考察的变量与其他变量相关性很强,而哪些并不强?随着变量数的增加,这类问题将变得很难回答。相关图作为一种相对现代的方法,可以通过相关…

Node.js 中的 WebSocket 底层实现

WebSockets 是一种网络通信协议,可实现双向客户端-服务器通信。 WebSockets 通常用于需要即时更新的应用程序,使用 HTTP 之上的持久双工通道来支持实时交互,而无需持续进行连接协商。服务器推送是 WebSockets 的众多常见用例之一。 本文首先…

剖析DNS劫持攻击原理及其防御措施

DNS劫持可导致用户访问到虚假网站,还可能使攻击者获取用户的敏感信息或利用受感染的计算机进行其他恶意活动。了解清楚DNS劫持攻击的原理有助于我们提升安全意识,避免个人信息泄露及财产损失。 1. 基础概念 DNS劫持是一种网络攻击,通过修改域…

低代码开发技术:驱动MES系统创新与制造业数字化转型的融合之路

低代码开发与生产管理MES系统的融合,是当今制造业数字化转型的一个重要趋势。以下是对这一融合现象的详细分析: 一、低代码开发的概念与特点 低代码开发是一种通过图形化界面和预构建模块来简化应用程序开发过程的方法。它允许开发人员使用拖放组件和最…

MT1331-MT1340 码题集 (c 语言详解)

MT1341反比例函数 c 语言实现代码 #include <stdio.h>double f(double x) { return 1.0 / x; }double trapezoidal_integration(double a, double b, int n) {// computer step lengthdouble h (b - a) / n;// computer points valuedouble sum (f(a) f(b)) / 2.0;//…

linux的sed命令

学习链接 Linux文本处理器sed - B站视频 文章目录 学习链接基础介绍语法格式sed的处理过程sed的选项-n-e-f-r-i pattern的7种用法sed中的编辑命令详解p 打印d 删除a 行后追加i 行前追加r 行后追加指定文件内容w 行追加到其它文件中 替换操作s/pattern/strings/pattern/string/…

【AI论文精读4】RAG论文综述2(微软亚研院 2409)P2-问题定义

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI大项目】【AI应用】 P1 二、问题定义 数据增强的大语言模型&#xff08;LLM&#xff09;应用可以采取多种形式&#xff0c;从常见的基于领域特定数据的问答机器人&#xff0c;到复杂数据管道中的语义处理操作&#x…

AI工具在论文选题方面可以提供的帮助

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在论文写作中&#xff0c;选题是决定研究质量和成果的关键步骤。随着人工智能技术的快速发展&#xff0c;AI工具在论文选题方面的应用逐渐受到关注。通过智能算法和大数据分析&#xff…

selenium安装

一、安装selenium 1&#xff0c;安装selenium -- 命令&#xff1a; pip install selenium -- 网络不稳的请换源安装&#xff1a; pip install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 二、安装chrome webdriver 1.查看谷歌浏览器版本 …

Excel:vba实现合并工作表(表头相同)

这个代码应该也适用于一些表头相同的工作表的汇总&#xff0c;只需要修改想要遍历的表&#xff0c;适用于处理大量表头相同的表的合并 这里的汇总合并表 total 是我事先创建的&#xff0c;我觉得比用vba代码创建要容易一下&#xff0c;如果不事先创建汇总表就用下面的代码&…

二十一、浮动(1 文本)

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title></title> <style> img{ widows: 100px; float: left;/*脱离文档流*/ …

BUG调试记录:C++中有符号类型和无符号类型在自动补位时的差异

BUG调试记录&#xff1a;C中有符号类型和无符号类型在自动补位时的差异 昨天和同事一起干活的过程中&#xff0c;项目中一个函数的计算结果出现了问题&#xff0c;即使我们反复对照流程图并进行了一系列的手算也没有发现任何编码上的差错&#xff0c;在逻辑上整个函数的编写是完…

【C++入门(7)】string

一、与C语言的联系 C的string类其实是从C语言的字符串演变过来的&#xff0c;是STL中用于处理字符串的一个容器。 在C语言中&#xff0c;字符串是以 \0 为结尾的一串字符&#xff0c;为了便于操作&#xff0c;C语言标准库中也提供了不少str系列的库函数供人使用。但是这些库函…

Java生成图片_基于Spring AI

Spring AI 优势 过去&#xff0c;使用Java编写AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;开发者需自行对接各个AI服务提供商的接口&#xff0c;导致代码复杂度高、迁移成本大。如今&#xff0c;Spring AI Alibaba的出现极大地缓解了这一问题&#xff0c;它提…

vue3之生命周期钩子

Vue 组件实例生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c…