OpenCV进阶操作:风格迁移以及DNN模块解析

文章目录


前言

风格迁移(Style Transfer)是计算机视觉领域的一项突破性技术,它通过算法将一幅图像的内容与另一幅图像的艺术风格相结合。这项技术自2015年Gatys等人提出神经网络风格迁移算法以来,在艺术创作、图像处理和移动应用开发等领域获得了广泛应用。


一、风格迁移

1、风格迁移是什么?

风格迁移是一种计算机视觉技术,通过将一幅图像的风格与另一幅图像的内容结合,生成一个新的图像。

在OpenCV中,风格迁移通常使用神经网络来实现。

2、步骤

1)训练

首先,使用一幅参考图像作为"风格图像"和一幅目标图像作为"内容图像",训练一个神经网络模型。训练过程中,网络学习如何将内容图像的内容与风格图像的风格进行组合。

2)迁移

一旦模型训练完成,就可以使用该模型将任意图像的内容与风格进行迁移。在迁移过程中,网络会将输入图像的内容与风格图像的风格进行匹配,并生成一个新的图像,该图像具有输入图像的内容和风格图像的风格。

二、DNN模块

1、什么是DNN模块

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

2、DNN模块特点

  • 轻量

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

  • 外部依赖性低

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

  • 方便

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

  • 集成

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

  • 通用性

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

3、流程图

4、图像预处理功能

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

三、案例实现

1、数据预处理

python 复制代码
import cv2
# 读取输入图像
image = cv2.imread('R-C.jpg')
image = cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
# 显示输入图像
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 = False,crop = False)

2、加载模型

  • 使用.readNet()读取风格迁移的模型
  • 将上一步处理之后的图片传入模型
  • 向前传播得到处理之后的数据
python 复制代码
'''-----------------加载模型------------------------'''
net = cv2.dnn.readNet(r'model\starry_night.t7')  #得到一个pytorch训练之后的星空模型
net.setInput(blob)
# 对输入图像进行向前传播,得到输出结果
out = net.forward()
# 将输出结果转换为合适的格式
# out是四维的:B*C*H*W
# ======输出处理=======
# 重塑形状(忽略第1维),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)
# 转置输出结果的维度
result = out_new.transpose(1,2,0)
# 显示转换后的图像
cv2.imshow('Stylized Image',result)
cv2.waitKey(0)
# cv2.destroyAllWindows()

总结

通过OpenCV实现风格迁移,开发者可以在平衡性能和效果的同时,快速构建实用的图像处理应用。无论是想要为移动应用添加实时滤镜功能,还是开发专业的艺术创作工具,OpenCV都提供了从简单到复杂的多层级解决方案。随着边缘计算设备性能的提升,风格迁移技术正在从实验室走向实际应用,开启计算机视觉与数字艺术结合的新篇章。

相关推荐
天天代码码天天10 分钟前
C# Onnx 动漫人物头部检测
人工智能·深度学习·神经网络·opencv·目标检测·机器学习·计算机视觉
Joseit28 分钟前
从零打造AI面试系统全栈开发
人工智能·面试·职场和发展
小猪猪_136 分钟前
多视角学习、多任务学习,迁移学习
人工智能·迁移学习
飞哥数智坊1 小时前
AI编程实战:Cursor 1.0 上手实测,刀更锋利马更快
人工智能·cursor
vlln1 小时前
【论文解读】ReAct:从思考脱离行动, 到行动反馈思考
人工智能·深度学习·机器学习
qq_430908571 小时前
华为ICT和AI智能应用
人工智能·华为
试剂界的爱马仕2 小时前
软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码
网络·人工智能·科技·机器学习·ci/cd·ai写作
小王毕业啦2 小时前
2022年 国内税务年鉴PDF电子版Excel
大数据·人工智能·数据挖掘·数据分析·数据统计·年鉴·社科数据
1296004522 小时前
机器翻译模型笔记
人工智能·笔记·机器翻译
superior tigre2 小时前
RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
人工智能·rnn·深度学习