计算机视觉基础第15章|DNN实现图像风格迁移

目录

前言

一、需求

二、分块代码解析

1.导入库、读取并显示原图

[2.图像预处理,生成 blob 张量](#2.图像预处理,生成 blob 张量)

3.加载模型,送入数据并前向推理

4.对网络输出结果做后处理

5.展示最终风格迁移效果图

[三、核心 API 说明](#三、核心 API 说明)

四、完整代码

四、训练与推理的区别

五、本章小结


前言

前面章节我们已经学习了图像检测、边缘检测、轮廓检测、模板匹配、直方图、关键点检测以及图像拼接等传统计算机视觉算法。传统算法依靠人工设计算子完成图像处理,特征表达能力有限。本章我们将使用 OpenCV 中的 DNN 模块,加载预训练的卷积神经网络模型完成图像风格迁移。在保留原图内容结构不变的前提下,将油画的色彩、笔触纹理赋予普通照片,实现图像的艺术化生成。本章重点掌握 blob 图像预处理、预训练模型加载、网络前向推理以及输出图像后处理的完整流程。

一、需求

给定一张普通实景图像,使用已经训练完成的梵高星空风格迁移模型完成图像风格化,最终输出带有油画质感的效果图。本次实验不需要本地训练网络,直接基于 OpenCV‑DNN 完成模型推理即可。

二、分块代码解析

1.导入库、读取并显示原图

python 复制代码
import cv2
import numpy as np

image = cv2.imread(r"girl.png")
image = cv2.resize(image,(640,480))
cv2.imshow("image",image)
cv2.waitKey(0)

导入 OpenCV 和数值计算库,读取本地图片,统一缩放为 640×480 固定尺寸。展示原始图像,按下任意键才会执行后续代码。固定尺寸是为了匹配模型输入要求,避免维度报错。

2.图像预处理,生成 blob 张量

python 复制代码
(h,w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),crop=False)

获取图像的高和宽,通过blobFromImage把 HWC 格式的普通图片转换成神经网络要求的( N,C,H,W )四维数据。本次不缩放像素值、不做均值减法,不对图片进行裁剪,保留完整图像信息。

3.加载模型,送入数据并前向推理

python 复制代码
net = cv2.dnn.readNet(r"starry_night.t7")
net.setInput(blob)
out = net.forward()

读取预训练starry_night.t7风格迁移模型文件,将预处理好的 blob 数据传入网络,执行前向传播计算。模型直接输出风格变换后的多维特征数组,该结果不能直接作为图片显示。

OpenCV快速图像风格迁移预训练权重包资源-CSDN下载

该链接提供了多种 OpenCV 快速图像风格迁移的预训练权重包,包含 9 种经典艺术风格的 .t7 模型,支持梵高星空、呐喊、浮世绘、马赛克等画风,可根据需要自行下载选择。

4.对网络输出结果做后处理

python 复制代码
out_new = out.reshape(out.shape[1],out.shape[2],out.shape[3])
cv2.normalize(out_new,out_new,0,255,cv2.NORM_MINMAX)
result = out_new.transpose(1,2,0).astype(np.uint8)

通过 reshape 函数去除数据的批次维度,保留图像核心特征维度;利用归一化操作将模型输出的浮点型数据映射至 0~255 的标准像素区间;将通道、高度、宽度(C,H,W)的维度排布转换为 OpenCV 适配的高度、宽度、通道(H,W,C)格式,最终转换为 8 位无符号整型数据,生成可正常可视化的图像数组。

5.展示最终风格迁移效果图

python 复制代码
cv2.imshow("result",result)
cv2.waitKey(0)

三、核心 API 说明

cv2.dnn.blobFromImage():图像预处理函数,完成普通图像向 NCHW 四维张量的转换,适配神经网络输入规范。

cv2.dnn.readNet():加载预训练模型文件,初始化推理网络对象。

net.setInput():为网络设置输入张量数据。

net.forward():执行前向推理,得到网络输出特征。

cv2.normalize():将输出数据映射至 0‑255 标准像素范围。

reshape、transpose:调整多维数组维度顺序,转换成可视化图像格式。

四、完整代码

python 复制代码
import cv2
import numpy as np

image = cv2.imread(r"girl.png")
image = cv2.resize(image,(640,480))
cv2.imshow("image",image)
cv2.waitKey(0)

(h,w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),crop=False)

net = cv2.dnn.readNet(r"D:\pythoncode2\bigdata_ai40\model\model\starry_night.t7")
net.setInput(blob)
out = net.forward()

out_new = out.reshape(out.shape[1],out.shape[2],out.shape[3])
cv2.normalize(out_new,out_new,0,255,cv2.NORM_MINMAX)
result = out_new.transpose(1,2,0).astype(np.uint8)

cv2.imshow("result",result)
cv2.waitKey(0)

四、训练与推理的区别

训练阶段:准备一张风格图片和大量内容数据集,定义内容损失与风格损失,通过反向传播不断更新网络权重,消耗大量算力,最终保存模型文件。推理阶段:直接加载训练完毕的权重,输入单张图片执行一次前向计算,快速生成风格化图像,不需要更新参数。本章代码实现的就是推理过程。

五、本章小结

本章使用 OpenCV‑DNN 完成风格迁移实战,掌握深度学习模型部署的完整流程:原图读取、预处理生成 blob、加载权重推理、输出数据还原成图像。风格迁移并不是简单滤镜,而是卷积网络对图像内容特征与艺术纹理特征的重新融合。后续可以更换不同预训练模型实现更多艺术画风,也可以自行采集图片训练自定义风格模型。

相关推荐
Mickey Q15 分钟前
【深度学习】权重衰减与 Dropout
人工智能·深度学习
欧特克_Glodon16 分钟前
OpenCV计算机视觉开发入门与实践<二十九>:grabCut算法分割图像
opencv·算法·计算机视觉·图像分割·grabcut 算法
具身AGI16 分钟前
从演示到作业,物理AI 人类学习路线 的深意
人工智能·学习
Capricorn198818 分钟前
科研智能体出现召回率低与数据覆盖冲突怎么排查?知芽 Notebook Skill 机制拆解
大数据·论文阅读·人工智能·笔记
邋遢道18 分钟前
# 企业级 Agent 从 0 到 1(三):推理循环——让模型自己决定停,它就停不下来
人工智能·python
麻花地19 分钟前
开源一个 Windows 实时面试助手:听译、置顶提词、按需生成英文稿
深度学习·github
ZGG00320 分钟前
MCP 02:MCP 的各类比对——和 Function Calling、A2A、Skill 到底什么关系
人工智能·后端·python
IT_陈寒21 分钟前
Vite热更新突然失效?可能是这个配置在捣鬼
前端·人工智能·后端
不懂的浪漫21 分钟前
企业 Agent Runtime | 项目知识需要生命周期
人工智能·软件工程·coding agent