当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、风格迁移
    • 1、风格迁移是什么?
    • 2、步骤
      • 1)训练
      • 2)迁移
  • 二、DNN模块
    • 1、什么是DNN模块
    • 2、DNN模块特点
    • 3、流程图
    • 4、图像预处理功能
  • 三、案例实现
    • 1、数据预处理
    • 2、加载模型
  • 总结


前言

风格迁移(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、数据预处理

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()读取风格迁移的模型
  • 将上一步处理之后的图片传入模型
  • 向前传播得到处理之后的数据
'''-----------------加载模型------------------------'''
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都提供了从简单到复杂的多层级解决方案。随着边缘计算设备性能的提升,风格迁移技术正在从实验室走向实际应用,开启计算机视觉与数字艺术结合的新篇章。

http://www.xdnf.cn/news/418501.html

相关文章:

  • 【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析
  • Kafka、RabbitMQ、RocketMQ的区别
  • 加速AI在k8s上使用GPU卡
  • WPS一旦打开,就会修改默认打开方式,怎么解?
  • 【OpenCV】网络模型推理的简单流程分析(readNetFromONNX、setInput和forward等)
  • React+Webpack 脚手架、前端组件库搭建
  • Ansys 计算刚柔耦合矩阵系数
  • Linux之初见进程
  • 使用光标测量,使用 TDR 测量 pH 和 fF
  • day 24
  • 智能手表整机装配作业指导书(SOP)
  • Vue.js---分支切换与cleanup
  • 第六章 GPIO输入——按键检测
  • 工业4G路由器IR5000公交站台物联网应用解决方案
  • 游戏引擎学习第275天:将旋转和剪切传递给渲染器
  • 【Linux】简单设计libc库
  • Spring Boot之Web服务器的启动流程分析
  • Antd中Form详解:
  • Mapreduce初使用
  • 第四章 部件篇之按钮矩阵部件
  • 在Linux中使用 times函数 和 close函数 两种方式 打印进程时间。
  • 线代第二章矩阵第八节逆矩阵、解矩阵方程
  • 【计算机视觉】OpenCV项目实战:基于face_recognition库的实时人脸识别系统深度解析
  • 光谱相机的光电信号转换
  • 基于Java的家政服务平台设计与实现(代码+数据库+LW)
  • 游戏引擎学习第277天:稀疏实体系统
  • GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现
  • 前端如何应对精确数字运算?用BigNumber.js解决JavaScript原生Number类型在处理大数或高精度计算时的局限性
  • SQL中联表的运用
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——mqtt库