基于OpenCV和深度学习实现图像风格迁移

文章目录

    • 引言
    • 一、准备工作
    • 二、代码实现解析
      • 1. 读取和显示原始图像
      • 2. 图像预处理
      • 3. 加载和运行风格迁移模型
      • 4. 处理输出结果
    • 三、效果展示
    • 四、扩展应用
    • 五、总结

引言

图像风格迁移是计算机视觉中一个非常有趣的应用,它可以将一幅图像的内容与另一幅图像的艺术风格相结合。今天我们将介绍如何使用OpenCV的dnn模块加载预训练的深度学习模型,快速实现图像风格迁移效果。

一、准备工作

首先确保你已经安装了OpenCV库:

pip install opencv-python

我们需要准备:

  1. 输入图像(如like2.jpg
  2. 预训练的风格迁移模型(如starry_night.t7

二、代码实现解析

1. 读取和显示原始图像

import cv2# 读取输入图像并调整大小
image = cv2.imread('like2.jpg')
image = cv2.resize(image, dsize=None, fx=0.5, fy=0.5)# 显示原始图像
cv2.imshow('Original Image', image)
cv2.waitKey(0)

这部分代码读取输入图像并将其大小缩小一半,然后显示原始图像。

2. 图像预处理

(h, w) = image.shape[:2]  # 获取图片尺寸# 创建blob对象,用于神经网络输入
blob = cv2.dnn.blobFromImage(image, 1, (w, h), (0, 0, 0), swapRB=False, crop=False)

blobFromImage函数对图像进行预处理:

  • 1:缩放因子,保持原始像素值
  • (w, h):输入图像的尺寸
  • (0, 0, 0):均值减法,这里不使用
  • swapRB=False:不交换红蓝通道
  • crop=False:不裁剪图像

3. 加载和运行风格迁移模型

# 加载预训练模型
net = cv2.dnn.readNet(r'model\starry_night.t7')  # PyTorch训练的星空风格模型
net.setInput(blob)# 前向传播获取输出
out = net.forward()

这里我们加载了一个已经训练好的星空风格迁移模型(.t7文件是Torch模型格式)。
这段代码是使用OpenCV的dnn模块加载并运行一个预训练的深度学习模型的核心部分。我来详细解释每一行:

  1. net = cv2.dnn.readNet(r'model\starry_night.t7')

这行代码的作用是加载预训练的深度学习模型

  • cv2.dnn.readNet():OpenCV中用于加载预训练模型的函数
  • r'model\starry_night.t7':模型文件的路径(这里使用了原始字符串r''避免转义字符问题)
    • .t7是Torch/LuaTorch框架的模型文件扩展名
    • 这是一个已经训练好的"星空风格"风格迁移模型
  1. net.setInput(blob)

这行代码的作用是设置模型的输入

  • blob:之前通过blobFromImage预处理得到的输入数据
  • setInput()方法将预处理后的图像数据传递给神经网络
  1. out = net.forward()

这行代码的作用是执行前向传播(推理)

  • forward():让加载的神经网络执行前向计算(即推理过程)
  • out:得到模型的输出结果(风格迁移后的图像数据)

整体流程解释

  1. 加载模型:从磁盘读取预训练好的神经网络模型
  2. 设置输入:将预处理后的图像数据输入网络
  3. 执行推理:让网络处理输入图像并生成输出

技术细节

  • 这个模型是一个风格迁移网络,它学习了如何将普通照片转换为星空艺术风格
  • .t7文件包含了网络的所有层结构、权重和参数
  • forward()执行的是整个网络的推理过程,不需要训练(因为模型已经预训练好了)
  • 输出out是一个四维张量(BCHW格式),需要后续处理才能显示为图像

类比理解

可以把这个过程想象成一个"艺术滤镜机":

  1. 先安装滤镜(加载模型)
  2. 放入要处理的照片(设置输入)
  3. 按下处理按钮(执行forward)
  4. 得到艺术照(输出结果)

这种方法是典型的"模型推理"过程,区别于"模型训练",因为我们只是使用已经训练好的模型,而不修改其参数。

4. 处理输出结果

# 调整输出形状(从4维BCHW变为3维CHW)
out_new = out.reshape(out.shape[1], out.shape[2], out.shape[3])# 归一化处理
cv2.normalize(out_new, out_new, norm_type=cv2.NORM_MINMAX)# 转置维度
result = out_new.transpose(1, 2, 0)# 显示风格迁移后的图像
cv2.imshow('Stylized Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出处理步骤:

  1. 重塑形状:将四维输出(BCHW)转为三维(CHW)
  2. 归一化:将像素值归一化到合理范围
  3. 转置维度:调整通道顺序以便正确显示

三、效果展示

运行代码后,你会看到两个窗口:

  1. 原始图像窗口
  2. 应用了星空风格的艺术图像窗口
  3. 图像显示如下:
    在这里插入图片描述
    在这里插入图片描述

四、扩展应用

你可以尝试:

  1. 使用不同的风格模型(如梵高、毕加索等风格)
  2. 调整输入图像大小以获得不同细节效果
  3. 尝试不同的归一化方法

五、总结

通过OpenCV的dnn模块,我们可以轻松加载预训练的深度学习模型实现图像风格迁移。这种方法简单高效,适合快速实现艺术效果。你可以从OpenCV的示例代码或模型库中找到更多风格迁移模型进行实验。

希望这篇教程对你有所帮助!如果你有任何问题,欢迎在评论区留言讨论。

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

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

相关文章

SwiftUI隐藏返回按钮保留右滑手势方案

SwiftUI 隐藏返回按钮但保留右滑返回手势的方案 在 SwiftUI 中,如果你使用: .navigationBarBackButtonHidden(true)可以隐藏系统返回按钮,但会发现 右滑返回手势(边缘返回)失效了。 这是因为 SwiftUI 底层使用了 UI…

练习小项目11:鼠标跟随小圆点

🎯 项目目标: 当鼠标在页面移动时,小圆点会跟随鼠标移动的位置,带有平滑动画。 🧠 实现思路: HTML: 页面内放一个 div 作为圆点。 CSS: 圆点使用绝对定位,初始在屏幕…

华为:eSight网管平台使用snmp纳管交换机

一、SNMP简介 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于管理和监控网络设备的标准协议,广泛应用于路由器、交换机、服务器、打印机等网络设备的管理场景。以下是对它的简单介绍: 1、SNM…

【单片机期末】接口及应用

一、C51语言基础 【考点】存储类型 data是低128字节 code是ROM idata是高128字节 pdata是外部RAM可以用R0 R1寻址的,也叫页 xdata是外部RAM,可以用DPTR寻址或总线扩展 其中data、code、idata、pdata、xdata均为字节类型的,bdata是对位寻址的 …

C#迭代器

文档 C# Iterators 关键内容 普通接口 public interface IEnumerable {IEnumerator GetEnumerator(); }public interface IEnumerator {object Current { get; }bool MoveNext();void Reset(); }泛型接口 public interface IEnumerable<out T> : IEnumerable {IEnum…

Java多线程:为什么wait()必须用循环而非if?

在Java多线程编程中&#xff0c;调用wait()方法时应使用**循环结构&#xff08;while循环&#xff09;**而非if块&#xff0c;这是由线程同步的特性和潜在风险决定的。以下是具体原因和实现规范&#xff1a; 一、正确调用方式 synchronized (lockObject) {while (!condition) …

Fiori 初学记录----怎么调用后端系统odata 服务实现简单的CURD

1.对上面的内表做一个简单的增删改查的操作 SEGW 创建odata 项目&#xff0c;实现增删改查方法。如下图 2.odata 准备完毕后&#xff0c;打开vscode 下一步等待项目生成 把下面这个目录的视图&#xff1a;替换一下&#xff1a; View1.view.xml 代码&#xff1a; <…

OpenCV CUDA模块图像变形------对图像进行GPU加速的仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于对图像进行 GPU 加速的仿射变换&#xff08;Affine Transformation&#xff09;&#xff0c;是 cv::warpAffine 的 CUDA 版本。支持平…

语音增强方法

一、音量增强 音量增强&#xff0c;顾名思义就是音量的调大和调小&#xff0c;通过对音量进行增强可以使得模型更好的泛化。防止数据只有小音量时&#xff0c;当有大音量传入时模型不能很好的进行识别。 下面是我对音量增强生成频谱图进行可视化的结果 上面的一个图片是音量…

内网渗透测试技巧与利用操作手册(SMB / MSSQL / LDAP)

SMB 枚举与利用清单 &#x1f50d; SMB 枚举与连接 # 尝试空会话连接&#xff08;Null Session&#xff09; smbclient -N -U "" -L \\<IP> smbclient -N -U "test" -L \\<IP> smbclient -N -U "Guest" -L \\<IP># 下载共享…

ADB(Android Debug Bridge)Android官方调试工具及常用命令

ADB的定义 ADB&#xff08;Android Debug Bridge&#xff09;是Android官方提供的调试工具&#xff0c;属于Android SDK的一部分。它通过命令行与Android设备通信&#xff0c;支持安装应用、调试、文件传输、日志抓取等功能&#xff0c;适用于开发、测试及高级用户场景。 ADB工…

再现重大BUG,微软紧急撤回Win 11六月更新

BUG年年有&#xff0c;今年特别多&#xff01; Windows 11发布这近4年来&#xff0c;咱们算是一路见证了其「要么在修复BUG&#xff0c;要么在修复BUG路上」这么一件壮举。 最新的6月Windows 11 24H2更新&#xff08;版本号KB5060842&#xff09;&#xff0c;微软带来了多项改…

ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?

提问 ROS2 工作空间中, CMakeLists.txt&#xff0c; setup.py和 package.xml的作用分别是&#xff1f; 回答 在一个 ROS 2 包&#xff08;package&#xff09;里&#xff0c;这三个文件各司其职&#xff1a; package.xml 作用&#xff1a;声明包的元信息和依赖关系&#xff…

Untiy打包安卓踩坑

Untiy 版本&#xff1a;unity6.1 运行环境&#xff1a;Win11 报错一&#xff1a; Assembly ‘Assets/ExternalDependencyManager/Editor/1.2.183/Google.IOSResolver.dll’ will not be loaded due to errors: 解决方法&#xff1a;通过在 Unity Hub 中下载 iOS 包来解决 报错…

2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)

大家好&#xff0c;我是你们的编程搬砖工~ 今天给大家安排一篇超级详细、超接地气、纯小白友好的《Python 安装教程 for Windows》&#xff0c;从下载到安装&#xff0c;从环境变量到验证&#xff0c;手把手带你装好 Python&#xff0c;不管你是 Python3.7、3.9、3.10 还是 3.1…

【IEEE/EI/Scopus检索】2025年第五届机器学习与大数据管理国际会议 (MLBDM 2025)

2025年第五届机器学习与大数据管理国际会议 (MLBDM 2025) 2025 5th International Conference on Machine Learning and Big Data Management(MLBDM 2025)会议地点&#xff1a;南京&#xff0c;中国 时间&#xff1a;2025年12月26日- 28日 ● 会议简介 2025年第五届机器学习…

前端实现ios26最新液态玻璃效果!

先看效果图 实现步骤 先定义玻璃元素和液态滤镜 <!--玻璃容器--> <div class"glass-container"><!--使用液态滤镜--><div class"glass-filter"></div><!--边沿效果--><div class"glass-specular">…

麒麟系统集成开发环境Kylin-IDE初体验,菜鸟小白入门教程

一、安装Kylin-IDE 1、打开应用商店&#xff0c;转到“软件”->“开发”页面&#xff0c;找到“Kylin-IDE”&#xff0c;点下载。&#xff08;也可以在搜索栏搜索Kylin-IDE&#xff09; 2、等待Kylin-IDE下载并自动安装完成。 3、双击桌面的Kylin-IDE图标。 4、自动弹出“开…

Python爬虫实战:研究Bleach库相关技术

一、引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。网络爬虫作为一种自动获取网页内容的技术,能够高效地从互联网上收集所需信息,为数据分析、信息检索、舆情监测等应用提供基础。然而,爬取到的网页内容往往包含大量的 HTML 标签、JavaScri…

分布假设学习笔记

文章目录 分布假设学习笔记自然语言处理中的分布假设应用场景适用范围 Word2vec、BERT和GPTWord2vecBERTGPT 假设成立吗 分布假设学习笔记 自然语言处理中的分布假设 分布假设&#xff08;Distributional Hypothesis&#xff09;是指&#xff1a;词语在相似上下文中出现&…