计算机视觉基础第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、加载权重推理、输出数据还原成图像。风格迁移并不是简单滤镜,而是卷积网络对图像内容特征与艺术纹理特征的重新融合。后续可以更换不同预训练模型实现更多艺术画风,也可以自行采集图片训练自定义风格模型。

相关推荐
奈落246 小时前
AI辅助的另一面:从2026年国际AI安全报告的“故障”清单到国内专家的可靠性短板,自主行动的Agent为什么更难及时干预
人工智能·安全·agent·本地部署·ai 办公
火山引擎开发者社区8 小时前
eMudhra 证书失陷:容器用户最容易忽略的镜像信任链漏洞
人工智能
LabVIEW开发9 小时前
LabVIEW 机载 DIAL:每秒万次甲烷测量
人工智能·labview·labview知识·labview功能·labview程序
飞猫的边缘AI10 小时前
英特尔量子生意
人工智能·量子计算·边缘ai
深蓝AI10 小时前
桌面 Agent 缺的不是视觉:Vercel 开源 agent-desktop,用无障碍树 ref 替代截图坐标
人工智能·程序员
镜子AI10 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
向哆哆10 小时前
羊行为目标检测数据集:4类别、2,000张图像 | 目标检测
人工智能·yolo·目标检测·目标跟踪
如若12311 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
赛博守夜人11 小时前
AI安全攻防与治理之十六:对抗样本、恶意文件与多模态攻击,AI 内容安全检测的真实盲区
人工智能·安全
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习