【进阶OpenCV】 (11)--DNN板块--实现风格迁移

文章目录

  • DNN板块
    • 一、DNN特点
    • 二、DNN函数流程
    • 三、实现风格迁移
      • 1. 图像预处理
      • 2. 加载星空模型
      • 3. 输出处理
  • 总结

DNN板块

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

DNN进行风格迁移是一项基于深度学习技术的图像处理方法,它允许将一张图片(风格图)中的风格、纹理迁移到另一张图片(内容图)上,同时保留内容图原有的主体结构。

一、DNN特点

  • 轻量: OpenCV 的深度学习模块只实现了模型推理功能,不涉及模型训练,这使得相关程序非常精简,加速了安装和编译过程。
  • 外部依赖性低:重新实现一遍深度学习框架使得 DNN 模块对外部依赖性极低,极大地方便了深度学习应用的部署。
  • 方便:在原有 OpenCV 开发程序的基础上,通过 DNN 模块可以非常方便地加入对神经网络推理的支持。
  • 集成:若网络模型来自多个框架,如一个来自 TensorFlow,另外一个来自 Caffe,则 DNN 模块可以方便地对网络进行整合。
  • 通用性:DNN 模块提供了统一的接口来操作网络模型,内部做的优化和加速适用于所有网络模型格式,支持多种设备和操作系统。

二、DNN函数流程

在这里插入图片描述

  • 图像预处理

将需要处理的图像转换成可以传入人工神经网络的数据形式

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

三、实现风格迁移

基本原理:风格迁移的实现通常基于卷积神经网络(CNNs),尤其是预训练的卷积神经网络(如VGG网络)。使用这些网络,可以提取内容图像的内容特征和风格图像的风格特征。这通常涉及到在网络的不同层次上计算特征表示。然后,定义一个损失函数,该函数包括内容损失和风格损失两个部分。内容损失用于确保生成图像与内容图像相似,而风格损失则用于确保生成图像的风格与风格图像匹配。通过最小化损失函数,使用梯度下降或其他优化方法来调整生成图像的像素值,使损失最小化,从而导致生成图像逐渐融合内容和风格。

接下来我们尝试将以下图片转化为星空风格

在这里插入图片描述

1. 图像预处理

对于图像的预处理,我们需要通过cv2.dnn.blobFromImage()函数来将图像转换成可以传入人工神经网络的数据形式:

blob = cv2.dnn.blobFromImage(image, scalefactor, size, mean, swapRB=True, crop=False)

参数

-- image (必需):要转换的图像,通常是一个通过 OpenCV 读取的彩色或灰度图像。
-- scalefactor (必需):图像缩放因子。这个值用于调整图像的像素值范围,通常设置为 1.0(不缩放)。
-- size (必需):输出 blob 的空间尺寸(宽度,高度)。这个值应该与你要使用的预训练模型的输入尺寸相匹配。
-- mean (可选):从每个通道中减去的均值。这通常用于数据标准化,以便模型能够更好地处理输入数据。对于预训练的模型,这个值通常是固定	的,并且可以在模型的文档中找到。
-- swapRB (可选):是否交换红色和蓝色通道。
-- crop (可选):是否在预处理过程中裁剪图像。

预处理

import cv2
"""-----图片预处理-----"""
# 读取输入图像
image = cv2.imread('tu.jpg')
# 显示输入图像
cv2.imshow('yuan_tu',image)
cv2.waitKey(0)(h,w) = image.shape[:2] # 获取图像尺寸
blob = cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),swapRB = True,crop = False)

2. 加载星空模型

通过cv2.dnn.readNet()函数加载模型,通过**net.setInput()设置输入,然后通过net.forward()**进行前向传播得到输出:

net = cv2.dnn.readNet(r'model\starry_night.t7') # 得到一个pytorch训练后的星空模型# 设置神经网络的输入
net.setInput(blob)
# 对输入图片进行前向传播,得到输出结果
out = net.forward()

3. 输出处理

将输出结果转换为合适的格式,out是四维的:B*C*H*W(B:batch图像数量(通常为1);C:channels通道数;H:height高度;W:width宽度)。

所以我们需要重塑形状(忽略第一维),4维变3维,调整输出out的形状,模型推理输出out是四维BCHW形式的,调整为三维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)
# 转置输出结果的维度,将通道维度移动到了最后,因为OpenCV期望图像以HWC格式显示。
result = out_new.transpose(1,2,0)
# 显示转换后的图像
cv2.imshow('Stylized Image',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

总结

本篇介绍了,如何通过DNN板块进行风格迁移。

注意!!!:进行风格迁移时,需要将传入的图片转换成可以传入人工神经网络的数据形式。且输出时进行转置,将通道维度移动到了最后,因为OpenCV期望图像以HWC格式显示。

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

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

相关文章

KANO模型,用户需求与产品设计的必备技能!

在竞争日益激烈的市场中,了解客户需求并提供符合客户期望的产品和服务变得尤为重要。那么有没有一种方法可以作为参考呢?今天小编就带大家了解一下KANO模型。KANO模型(Kano Model)作为一种帮助企业识别和优先处理客户需求的工具&a…

Django操作数据库

Django操作数据库 1、ORM框架2、ORM-创建数据库3、ORM-连接数据库4、ORM-操作表4.1、类创建表4.2、修改表结构4.2.1、删除表结构4.2.2、新增表结构 5、ORM-增删改查5.1、新增数据5.2、删除数据5.3、查询数据5.4、更新数据 1、ORM框架 Django开发操作数据库很简单,内…

项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/143105881 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…

如何解决JMeter响应数据乱码?

问题: 解决: 1、找到JMeter安装目录下的bin目录 2、 在bin目录下,打开" jmeter.properties "文件 3、搜索"sampleresult.default.encoding" 4、改成"sampleresult.default.encodingUTF-8",去掉前面…

数字图像处理:图像分割应用

数字图像处理:图像分割应用 图像分割是图像处理中的一个关键步骤,其目的是将图像分成具有不同特征的区域,以便进一步的分析和处理。 1.1 阈值分割法 阈值分割法(Thresholding)是一种基于图像灰度级或颜色的分割方法&…

图片写入GPS经纬高信息

近期项目中需要往java平台传输图片,直接使用QNetworkAccessManager和QHttpMultipart类即可,其他博文中有分享。 主要是平台接口对所传输图片有要求:需要包含GPS信息(经度、纬度、高度)。 Qt无法直接实现,…

教育平台的创新设计:Spring Boot实现

3系统分析 3.1可行性分析 通过对本信息化在线教学平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本信息化在线教学平台采用Spring Boot框架,JA…

【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

Axure重要元件三——中继器修改数据

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器修改数据 主要内容:显示编辑内容、表格赋值、修改数据 应用场景:更新行、表单数据行修改 案例展示: 正文…

前端算法合集-2(含面试题-美团一面)

主要考察的就是数组扁平化,由浅入深吧 ①利用tostring()和split() let arr [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]] let newarrarr.toString().split(,) let numarrnewarr.map((item)>{itemNumber(item)return item }) console.log(numarr) ②利用…

AndroidStudio移动开发:使用Service播放音乐【步骤】

目录 一、创建新application 二、准备音乐文件 三、创建项目和布局(如果需要交互界面的话,这里简单假设一个基本布局) 四、创建MusicService类 五、在MainActivity中启动和控制Service(也可以另外创建MusicActivity类&#x…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述: xdsec的小伙伴们和参赛者来上课,碰巧这一天签到系统坏了,作为老师的你,要帮他们 教师代签。 特殊提醒:luo同学今天好像在宿舍打游戏,不想来上课,这是严重的缺勤行为…

【数据分享】全国人口-人口年龄结构和抚养比(1990-2021年)

数据介绍 一级标题指标名称单位指标解释人口年末总人口万人年末人口数指每年12月31日24时的人口数。年度统计的全国人口总数内未包括香港、澳门特别行政区和台湾省以及海外华侨人数。1981年及以前人口数据为户籍统计数;1982、1990、2000、2010、2020年数据为当年人口…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式,用户可以通过可视化的方式,简单拖拽,不写代码或者编写少量代码,类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

Redis 常用指令详解

Redis是一款开源的、高性能的键值对存储数据库,常用于缓存、会话存储以及其他需要快速访问的数据场景。本文将介绍Redis的一些常用指令,并通过代码示例进行说明。 一、连接操作指令 1. 连接 Redis 服务器 ./redis-cli -h 127.0.0.1 -p 63792. 认证&a…

计算广告第三版pdf

需要该书pdf版本的同学点赞,私信我:

Spark_入库时报错ORA-00001 unique constraint violated 解决办法

首先可能是数据入重复了 检查一下看看是否入库前删除了分区的数据,可能是重复数据入库的问题,如果不是这个那么继续排查。 入库的数据有问题,检测方法 如果报主键冲突了,则group by 一下id,date,然后select 的时候加一…

飞睿智能超宽带UWB音频传输模块,超低延迟数据传输,实时音频声音更纯净

在信息爆炸的时代,音频传输技术正以未有的速度发展,创新我们进入一个全新的听觉世界。今天,我们要探讨的,就是这场技术创新中的一颗璀璨明星——飞睿智能超宽带(UWB)音频传输模块。它以其独特的优势&#x…

RHCSA课后练习1

文件管理命令练习 vi/vim练习 vim newfile 按 a 进入编辑模式 :r 文件 在末尾模式中插入文件 :%s/#/ /g 先将#标记为匹配项:%g#d 再删除 : set nu 开启行号 自行组cp 用grep命令找到6段再用tail命令选中第六段 用find查找 [A-Z]代表所有…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》,有朋友问光代码和文字不太真切,能否补充几张图片,今天我们演示一下: 这是第一帧画面:P1(我们的参考帧) 这是第二帧画面:P2(需要编码的帧&…