计算机视觉——Opencv(模块风格迁移)

发布时间:2026/5/19 16:38:24

计算机视觉——Opencv(模块风格迁移) 风格迁移的核心原理源于卷积神经网络CNN对图像特征的提取能力通过算法分离图像的内容特征与风格特征再将两者重新组合生成兼具原始内容与艺术风格的全新图像。从技术落地来看借助 OpenCV 的 DNN 深度神经网络模块搭配预训练好的风格迁移模型就能快速实现这一效果。核心技术原理图像预处理Blob 构建深度学习模型对输入图像有严格的格式要求OpenCV 的dnn.blobFromImage函数就是专门用于将普通图像转换为模型可识别的四维张量Blob完成缩放、减均值、通道调整等预处理操作。预训练模型加载风格迁移的深度学习模型已经由科研人员训练完成我们直接加载.t7格式的 Torch 预训练模型即可。本文使用的是梵高《星空》专属的风格迁移模型模型文件体积小、推理速度快非常适合入门学习。前向推理与结果重构将预处理后的图像输入模型通过前向传播得到风格化后的输出张量再将张量重构为可视化的图像格式完成最终效果展示。前期准备准备两个核心文件输入图像任意格式的图片JPG/PNG/WebP 均可预训练模型starry_night.t7梵高星空风格迁移预训练模型网络上可免费下载完整代码解析导入相关库和读取图像import cv2 # 读取输入图像 image cv2.imread(rC:\Users\LEGION\Desktop\OIP-C.webp) # 显示输入图像 cv2.imshow(yuan tu, image) cv2.waitKey(0)图像预处理核心步骤# ----------------图片预处理---------------- (h, w) image.shape[:2] # 获取图像尺寸 # 函数cv2.dnn.blobFromImage:实现图像预处理从原始图像构建一个符合人工神经网络输入格式的四维模块。 blob cv2.dnn.blobFromImage(image, scalefactor1, size(w, h), mean(0, 0, 0), swapRBFalse, cropFalse)image.shape返回图像的 (高度宽度通道数)image.shape[:2]只提取前两个值h, w用于后续指定预处理后的图像大小保证风格迁移后图像尺寸与原图一致。cv2.dnn.blobFromImage()函数参数名作用本文配置说明image输入的原始图像我们读取的照片变量scalefactor像素值缩放因子设为 1表示不缩放像素值size输出 Blob 的尺寸设为原图 (w, h)保持尺寸一致mean通道减均值设为 (0,0,0)不进行减均值操作swapRB是否交换 R/B 通道设为 False本模型无需交换通道crop是否居中裁剪设为 False不裁剪图像swapRB:表示在必要时交换通道的R通道和B通道。一般情况下使用的是RGB通道而OpenCV通常采用的是BGR通道。因此可以根据需要交换第1个和第3个通道。该值默认为 False。返回值 Blob四维张量格式为NCHW分别代表NBatch Size批次大小本文为 1单张图像C通道数彩色图像为 3H图像高度W图像宽度。预训练模型加载与前向推理# ----------------加载模型---------------- net cv2.dnn.readNet(rC:\Users\LEGION\Desktop\starry_night.t7) # 得到一个pytorch训练之后的星空模型 net.setInput(blob) # 对输入图像进行前向传播得到输出结果 out net.forward()模型加载cv2.dnn.readNet()作用加载预训练的深度学习模型支持 Caffe、TensorFlow、Torch、DarkNet 等多种框架的模型格式本文加载的starry_night.t7是 Torch 框架训练的梵高星空风格迁移模型OpenCV 可直接识别并加载返回值net神经网络模型对象后续用于输入数据和推理。2. 模型推理net.setInput(blob)将预处理后的 Blob 张量设置为模型的输入out net.forward()执行前向传播这是风格迁移的核心计算过程模型会自动提取原图的内容特征融合《星空》的风格特征输出风格化后的张量。加载模型netcv2.dnn.readNet([ model[, config[, framework]] ])各参数的含义如下model:神经网络的实际结构和功能它定义了数据如何通过网络流动如何进行训练如何进行推理。config:一组参数和设置帮助控制模型的行为包括网络架构、训练过程、优化器等内容。framework:DNN框架可省略。DNN模块会自动推断框架种类。net:返回值返回网络模型对象。支持的模型格式有Torch,TensorFlow,Caffe,DarkNet. ONNX和Intel OpenVINOmodel参数 | config参数 | framework参数 | 函数名称*.caffemodel | *.prototxt | caffe | readNetFromCaffe*.pd | *.pbxtxt | tensorflow | readNetFromTensorFlow*.t7 | *.net | torch | readNetFromTorch*.weight | *.cfg | darknet | readNetFromDarknet*.bin | *.xml | dldt | readNetFromModelOptimizer*.onnx | | onnx | readNetFromONNX输出结果重构与可视化模型输出的是四维张量无法直接显示为图像我们需要对其进行形状调整、归一化、维度转置等操作# 将输出结果转换为合适的格式 # out是四维的B*C*H*W # 输出处理 # 重塑形状(忽略第1维)4维变3维 out_new out.reshape(out.shape[1], out.shape[2], out.shape[3]) # 对输入的数组或图像进行归一化处理使其数值范围在指定的范围内 cv2.normalize(out_new, out_new, norm_typecv2.NORM_MINMAX) # 转置输出结果的维度 result out_new.transpose(1, 2, 0) # 显示转换后的图像 cv2.imshow(Stylized Image, result) cv2.waitKey(0) cv2.destroyAllWindows()维度重塑模型输出out是四维格式BCHW其中 B1单张图像我们用reshape函数忽略第一维将其转换为三维格式CHW通道、高度、宽度这是图像数据的标准三维结构。像素值归一化cv2.normalize()函数将输出张量的像素值归一化到[0,1]区间。因为模型推理后的像素值范围不固定直接显示会出现黑屏、花屏等问题归一化后才能正常可视化。维度转置OpenCV 的图像格式是HWC高度、宽度、通道而模型输出是CHW因此通过transpose(1,2,0)将维度顺序调整为HWC匹配 OpenCV 的图像显示规则。运行结果

相关新闻