目录
[2.图像预处理,生成 blob 张量](#2.图像预处理,生成 blob 张量)
[三、核心 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 快速图像风格迁移的预训练权重包,包含 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、加载权重推理、输出数据还原成图像。风格迁移并不是简单滤镜,而是卷积网络对图像内容特征与艺术纹理特征的重新融合。后续可以更换不同预训练模型实现更多艺术画风,也可以自行采集图片训练自定义风格模型。