首页 > 其他分享 >机器学习:opencv--风格迁移

机器学习:opencv--风格迁移

时间:2024-10-19 18:51:44浏览次数:3  
标签:输出 img -- cv2 opencv 图像 迁移 通道 out

目录

前言

一、代码及步骤解释

1.图片与处理

2.加载模型

3.输出图像


前言

        风格迁移(Style Transfer)是一种计算机视觉技术,旨在将一种图像的艺术风格应用到另一种图像上,同时保持其内容。

 

一、代码及步骤解释

1.图片与处理

  • 传入图片,使用opencv里的dnn神经网络模型对图片进行处理,改变图片的维度
  • 图片张数,通道数,高,宽
import cv2

"""图片风格迁移"""
img = cv2.imread('huanghelou1.JPG')
img = cv2.resize(img, (500, 500))
cv2.imshow('img', img)
cv2.waitKey(0)

# 图片预处理
(h, w) = img.shape[:2]
blob = cv2.dnn.blobFromImage(img, 1, (w, h), (0, 0, 0), swapRB=True)  # 改变图像格式 B C H W
# blob = cv2.dnn.blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None)
# 参数:
#       image:表示输入图像。
#       scalefactor:表示对图像内的数据进行缩放的比例因子。具体运算是每个像素值*scalefactor,该值默认为 1。
#       size:用于控制blob的宽度、高度。
#       mean:表示从每个通道减去的均值。 (0,0,0):表示不进行均值减法。即不对图像的B、G、R通道进行任何减法操作。
#               若输入图像本身是B、G、R通道顺序的,并且下一个参数swapRB值为True,
#               则mean值对应的通道顺序为R、G、B。:opencv BGR RGB
#       swapRB:表示在必要时交换通道的R通道和B通道。一般情况下使用的是RGB通道。而openCV通常采用的是BGR通道
#               因此可以根据需要交换第1个和第3个通道。该值默认为 False。
#       crop:布尔值,如果为True:则在调整大小后进行居中裁剪
# 返回值:blob: 表示在经过缩放、裁剪、减均值后得到的符合人工神经网络输入的数据。该数据是一个四维数据,
#           布局通常使用N(表示batch size)、C(图像通道数,如RGB图像具有三个通道)、H(图像高度)、W(图像宽度)表示

 

2.加载模型

风格迁移模型

  1. 使用.readNet()读取风格迁移的模型
  2. 将上一步处理之后的图片传入模型
  3. 向前传播得到处理之后的数据
# 加载模型
net = cv2.dnn.readNet(r'model/la_muse.t7')  # readNet 通用读取模型 不论后缀
net.setInput(blob)  # 将图片传入模型
out = net.forward()  # 向前传播

 

3.输出图像

  1. 上一步骤输出的数据还是四维的,
  2. 使用.reshape()进行转换
  3. 因为输出的数据里有负值,所以使用归一化处理
  4. 然后将其进行转置 变成 (高 宽 通道数)的形式  让opencv能够输出
# 重塑形状(忽略第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
result = out_new.transpose(1, 2, 0)  # 将图像转置成 高 宽 通道数 符合opencv的格式
# 显示转换后的图像
cv2.imshow('stylized Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

标签:输出,img,--,cv2,opencv,图像,迁移,通道,out
From: https://blog.csdn.net/weixin_65047977/article/details/143063186

相关文章

  • 第六章元素应用CSS
    6.1使用CSS设置字体样式作用:一是传递语义功能,二是有美学作用。CSS提供font-family属性来控制文本的字体类型。格式如下:fonl-family:字体名称;参数:字体名称按优先顺序排列,以逗号隔开。如果字体名称包含空格,则应用引号括起。说明:用font-family属性可控制显示字体。不同......
  • 微信小程序开发入门
    介绍苍穹外卖p70-p76微信公众平台小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。准备工作注册小程序注册地址注册成功后登录地址完善小程序信息注意小程序名称每年只能修改两次,且其......
  • HTML·第六章 元素应用CSS
    6.1使用CSS设置字体样式在CSS中设置字体样式是网页设计中非常基础且重要的部分,它可以帮助设计师控制网页上文本的外观。以下是一些常用的CSS属性,用于设置字体样式:font-family:定义字体族,指定文本的字体。可以设置一个或多个字体,浏览器会使用列表中第一个可用的字体。p{......
  • 【Unity生存类游戏UI资源】GUI Pro - Survival Clean
    GUIPro-SurvivalClean是一款专为Unity设计的用户界面(GUI)插件,特别适用于生存类、沙盒类和开放世界游戏。该插件提供了简洁现代的UI设计风格,能够帮助开发者快速构建清晰且功能丰富的游戏界面。以下是它的主要功能和特点:1.简洁的生存类UI设计插件采用了简洁、......
  • 无缝轮播图
    ```html<template> <!--@touchend="handleTouchEnd"--> <!--@touchstart="handleTouchStart"--> <divclass="carousel-conainer">  <div   class="carousel-list"   :style=&quo......
  • Java虚拟机(JVM)(7)—— 垃圾回收(1)
    文章目录前言一、方法区的回收二、垃圾判别阶段算法1、引用计数法2、可达性分析算法GCRoots对象三、常见的引用对象1、强引用2、软引用软引用的使用方法3、弱引用4、虚引用和终结器引用四、垃圾回收算法1、垃圾回收算法的评价标准2、标记清除算法3、复制算法3、......
  • 小白投资理财 - 解读市盈率
    小白投资理财-解读市盈率什么是市盈率公式市盈率的解释市盈率分类TTM市盈率(TrailingTwelveMonthsP/E)静态市盈率(HistoricalorStaticP/E)动态市盈率(ForwardP/E)三者的比较:如何使用这三种市盈率?市盈率举例TTM市盈率(TrailingTwelveMonthsP/E)静态市盈率(StaticP......
  • jython和python的区别是什么
    我们通常意义上说的python是cpython,也就是完全用C实现的python,它支持C的扩展,不支持java什么的扩展。jython是完全用jython实现的python,它支持用java扩展,貌似无法用C扩展。jython用途比较少。主要在两个场景下:1、操作系统不提供cpython,只有JAVA可以用。比如sun工作站,或者......
  • python如何删除目录
    Python实现删除文件夹的三种方式一、os.rmdir(path)删除目录path,path必须是个空目录,否则抛出OSError异常。import osos.rmdir('./test')  # test是一个空的文件夹二、os.removedirs(path) 递归地删除目录。要求每一级目录都为空,才能递归删除全部目录。子目录被......
  • Regular graph and line graph (正则图和线图)(二)
    (1)循环矩阵的定义:一个矩阵称为循环矩阵,如果它的元素满足,其中下标是模约化的,并且位于集合(2),循环矩阵可由基本循环矩阵线性表出(3),循环矩阵的特征值(4)循环图的定义:图是一个循环图,它的顶点可以排序,使得邻接矩阵是一个循环矩阵(5)第一行为的邻接矩阵的循环图的特征值为:(6)可以计算3......