Python 基于 OpenCV DNN 的图像风格迁移实战
本文介绍了如何使用 Python 和 OpenCV 的 DNN 模块实现图像风格迁移。通过加载预训练的神经网络模型,可以将普通照片转换为特定艺术风格。教程涵盖了环境配置、模型选择、代码解析及运行步骤,适合初学者快速体验深度学习在图像处理中的应用。重点讲解了 fast-neural-style 模型的集成方式,解决了传统深度学习框架配置繁琐的问题,并提供了完整的 Python 3 代码示例及常见问题的解决方案。

本文介绍了如何使用 Python 和 OpenCV 的 DNN 模块实现图像风格迁移。通过加载预训练的神经网络模型,可以将普通照片转换为特定艺术风格。教程涵盖了环境配置、模型选择、代码解析及运行步骤,适合初学者快速体验深度学习在图像处理中的应用。重点讲解了 fast-neural-style 模型的集成方式,解决了传统深度学习框架配置繁琐的问题,并提供了完整的 Python 3 代码示例及常见问题的解决方案。

图像风格迁移(Neural Style Transfer)是深度学习在计算机视觉领域的一个经典应用。它利用卷积神经网络(CNN)提取图像的'内容'和'风格',并通过优化算法将一种图像的风格应用到另一种图像的内容上。
早期的实现通常依赖 PyTorch 或 TensorFlow,需要配置 CUDA、cuDNN 等复杂环境。而 OpenCV 4.0+ 引入了 DNN(Deep Neural Network)模块,支持直接加载 Torch (.t7) 模型进行推理,无需安装庞大的深度学习框架,极大地降低了使用门槛,非常适合初学者快速体验。
确保已安装 Python 3.6 及以上版本。推荐使用虚拟环境管理依赖:
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
本项目仅需 OpenCV 库即可运行,无需额外的深度学习框架:
pip install opencv-python numpy
若需处理视频流,可额外安装 opencv-contrib-python。
本教程基于 fast-neural-style 项目预训练的模型。该项目提供了多种艺术风格的模型文件(后缀为 .t7),例如梵高、蒙德里安、毕加索等风格。
由于原始下载链接可能失效,建议从以下官方仓库获取模型:
fast-neural-style-models 资源包。常见的模型文件名包括:udnie.t7, mosaic.t7, starry_night.t7 等。
OpenCV 官方仓库中提供了基于 C++ 和 Python 的示例代码。以下是经过适配的 Python 3 版本,支持命令行参数控制输入路径、模型路径及图像尺寸。
import cv2 as cv
import numpy as np
import argparse
import sys
def main():
parser = argparse.ArgumentParser(
description='This script is used to run style transfer models from '
'https://github.com/jcjohnson/fast-neural-style using OpenCV')
parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
parser.add_argument('--model', help='Path to .t7 model')
parser.add_argument('--width', default=-1, type=int, help='Resize input to specific width.')
parser.add_argument('--height', default=-1, type=int, help='Resize input to specific height.')
parser.add_argument('--median_filter', default=0, type=int, help='Kernel size of postprocessing blurring.')
args = parser.parse_args()
# 加载模型
try:
net = cv.dnn.readNetFromTorch(args.model)
except Exception as e:
print(f"Failed to load model: {e}")
sys.exit(1)
# 读取输入源
if args.input:
cap = cv.VideoCapture(args.input)
else:
cap = cv.VideoCapture(0)
cv.namedWindow('Styled image', cv.WINDOW_NORMAL)
while True:
hasFrame, frame = cap.read()
if not hasFrame:
break
# 调整尺寸
inWidth = args.width if args.width != -1 else frame.shape[1]
inHeight = args.height if args.height != -1 else frame.shape[0]
# 创建 blob 并设置网络输入
inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),
(103.939, 116.779, 123.68), swapRB=False, crop=False)
net.setInput(inp)
out = net.forward()
# 还原图像数据
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.68
out /= 255
out = out.transpose(1, 2, 0)
# 性能统计
t, _ = net.getPerfProfile()
freq = cv.getTickFrequency() / 1000
print(f"Inference time: {t / freq:.2f} ms")
# 后处理:中值滤波
if args.median_filter:
out = cv.medianBlur(out, args.median_filter)
cv.imshow('Styled image', out)
# 按 q 键退出
if cv.waitKey(1) == ord('q'):
break
if __name__ == '__main__':
main()
代码说明:
readNetFromTorch 加载 .t7 格式模型。blobFromImage 将图像转换为网络输入的张量格式,包含归一化操作。将上述代码保存为 style_transfer.py,并在终端中运行:
python style_transfer.py --input test.jpg --model udnie.t7
参数详解:
--input: 输入图像路径。留空则调用摄像头。--model: 风格模型文件路径(如 udnie.t7)。--width/--height: 强制缩放输入图像尺寸,影响推理速度和质量。--median_filter: 中值滤波窗口大小,用于平滑噪点,默认 0 表示不启用。确保模型文件路径正确,且文件格式为 Torch 序列化格式(.t7)。如果报错 Invalid file format,请检查模型来源是否兼容 OpenCV DNN。
--width 参数)。cv.imshow)。median_filter 参数以减少高频噪声。本文演示了如何利用 OpenCV 的 DNN 模块快速实现图像风格迁移。相比传统的 PyTorch 方案,该方法无需配置 GPU 驱动,部署更加轻量。对于希望入门计算机视觉或快速原型开发的开发者,这是一个极佳的切入点。后续可进一步研究如何自定义训练模型,或结合其他图像处理技术进行更复杂的创作。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online