opencv学习:风格迁移对图像风格进行更改

介绍:

        风格迁移是一种计算机视觉技术,它能够让一张图片看起来像是用另一种风格画出来的。想象一下,你有一张普通的照片,但你希望它看起来像是梵高的印象派画作,或者像是某个著名艺术家的作品,风格迁移就可以实现。

DNN模块是什么:

        DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能,其作用是载入别的深度学习框架(如 TensorFlow、Caffe、Torch 等)中已经训练好的模型,然后用该模型完成预测等工作。

DNN 模块的特点:

● 轻量: OpenCV 的深度学习模块只实现了模型推理功能,不涉及模型训练,这使得相关程序非常精简,加速了安装和编译过程。

● 外部依赖性低:重新实现一遍深度学习框架使得 DNN 模块对外部依赖性极低,极大地方便了深度学习应用的部署。

● 方便:在原有 OpenCV 开发程序的基础上,通过 DNN 模块可以非常方便地加入对神经网络推理的支持。

● 集成:若网络模型来自多个框架,如一个来自 TensorFlow,另外一个来自 Caffe,则 DNN 模块可以方便地对网络进行整合。

● 通用性:DNN 模块提供了统一的接口来操作网络模型,内部做的优化和加速适用于所有网络模型格式,支持多种设备和操作系统。

图像预处理的功能:

        将需要处理的图像转换成可以传入人工神经网络的数据形式。 DNN 模块中的函数 blobFromlmage 完成图像预处理,从原始图像构建一个符合人工神经网络输入格式的四维块。 它通过调整图像尺寸和裁图像、减均值、按比例因子缩放、交换 B 通道和R通道等可选操作完成对图像的预处理,得到符合人工神经网络输入的目标值。

代码步骤

  1. 读取图像:使用cv2.imread函数读取待处理的图像。
    import cv2
    image=cv2.imread('right.jpg')
  2. 图像预处理:将图像转换为深度学习模型可以接受的格式。
    # 获取图像的高度和宽度
    (h,w)=image.shape[:2]
    # 创建一个blob对象,用于网络输入
    # 这里将图像缩放到与原图相同的尺寸,不改变图像的宽高比,不进行裁剪
    blob=cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),swapRB=True,crop=False)
  3. 加载模型:加载预训练的风格迁移模型。
    # 加载预训练的神经网络模型
    net=cv2.dnn.readNet(r'model\starry_night.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\la_muse.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\candy.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\composition_vii.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\feathers.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\udnie.t7')
    # net=cv2.dnn.readNetFromTorch(r'.\model\the_scream.t7')
  4. 网络输入:将预处理后的图像输入到模型中,执行模型的前向传播,得到风格迁移后的图像。
    # 设置网络输入
    net.setInput(blob)
    # 网络前向传播
    out=net.forward()
  5. 后处理:对模型输出的结果进行归一化和通道顺序转换,使其成为可显示的图像格式。
    # 调整输出的形状,使其成为标准的图像格式
    out_new=out.reshape(out.shape[1],out.shape[2],out.shape[3])
    # 归一化处理,使像素值在0到1之间
    cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)
    # 转换通道顺序,从CHW转换为HWC
    result=out_new.transpose(1,2,0)

运行结果

完整代码

import cv2
image=cv2.imread('right.jpg')
# 获取图像的高度和宽度
(h,w)=image.shape[:2]
# 创建一个blob对象,用于网络输入
# 这里将图像缩放到与原图相同的尺寸,不改变图像的宽高比,不进行裁剪
blob=cv2.dnn.blobFromImage(image,1,(w,h),(0,0,0),swapRB=True,crop=False)
# 加载预训练的神经网络模型
net=cv2.dnn.readNet(r'model\starry_night.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\la_muse.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\candy.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\composition_vii.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\feathers.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\udnie.t7')
# net=cv2.dnn.readNetFromTorch(r'.\model\the_scream.t7')
# 设置网络输入
net.setInput(blob)
# 网络前向传播
out=net.forward()
# 调整输出的形状,使其成为标准的图像格式
out_new=out.reshape(out.shape[1],out.shape[2],out.shape[3])
# 归一化处理,使像素值在0到1之间
cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)
# 转换通道顺序,从CHW转换为HWC
result=out_new.transpose(1,2,0)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

        通过本次实验,我们成功地使用OpenCV和深度学习模型实现了图像的风格迁移。我们了解到,通过预训练的模型,我们可以轻松地将一种风格应用到另一张图像上。这种技术在艺术创作、图像编辑等领域有着广泛的应用。此外,实验也加深了我们对深度学习在图像处理领域应用的理解。

猜你喜欢

转载自blog.csdn.net/mohanyelong/article/details/142904685