目录
前言
一、代码及步骤解释
1.图片与处理
2.加载模型
3.输出图像
前言
风格迁移(Style Transfer)是一种计算机视觉技术,旨在将一种图像的艺术风格应用到另一种图像上,同时保持其内容。
一、代码及步骤解释
1.图片与处理
- 传入图片,使用opencv里的dnn神经网络模型对图片进行处理,改变图片的维度
- 图片张数,通道数,高,宽
import cv2"""图片风格迁移"""
img = cv2.imread('huanghelou1.JPG')
img = cv2.resize(img, (500, 500))
cv2.imshow('img', img)
cv2.waitKey(0)# 图片预处理
(h, w) = img.shape[:2]
blob = cv2.dnn.blobFromImage(img, 1, (w, h), (0, 0, 0), swapRB=True) # 改变图像格式 B C H W
# blob = cv2.dnn.blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None)
# 参数:
# image:表示输入图像。
# scalefactor:表示对图像内的数据进行缩放的比例因子。具体运算是每个像素值*scalefactor,该值默认为 1。
# size:用于控制blob的宽度、高度。
# mean:表示从每个通道减去的均值。 (0,0,0):表示不进行均值减法。即不对图像的B、G、R通道进行任何减法操作。
# 若输入图像本身是B、G、R通道顺序的,并且下一个参数swapRB值为True,
# 则mean值对应的通道顺序为R、G、B。:opencv BGR RGB
# swapRB:表示在必要时交换通道的R通道和B通道。一般情况下使用的是RGB通道。而openCV通常采用的是BGR通道
# 因此可以根据需要交换第1个和第3个通道。该值默认为 False。
# crop:布尔值,如果为True:则在调整大小后进行居中裁剪
# 返回值:blob: 表示在经过缩放、裁剪、减均值后得到的符合人工神经网络输入的数据。该数据是一个四维数据,
# 布局通常使用N(表示batch size)、C(图像通道数,如RGB图像具有三个通道)、H(图像高度)、W(图像宽度)表示
2.加载模型
风格迁移模型
- 使用.readNet()读取风格迁移的模型
- 将上一步处理之后的图片传入模型
- 向前传播得到处理之后的数据
# 加载模型
net = cv2.dnn.readNet(r'model/la_muse.t7') # readNet 通用读取模型 不论后缀
net.setInput(blob) # 将图片传入模型
out = net.forward() # 向前传播
3.输出图像
- 上一步骤输出的数据还是四维的,
- 使用.reshape()进行转换
- 因为输出的数据里有负值,所以使用归一化处理
- 然后将其进行转置 变成 (高 宽 通道数)的形式 让opencv能够输出
# 重塑形状(忽略第1维),4维变3维
# 调整输出out的形状,模型推理输出out是四维BCHW形式的,调整为三维CHW形式
out_new = out.reshape(out.shape[1], out.shape[2], out.shape[3])
# 对输入的数组(或图像)进行归一化处理,使其数值范围在指定的范国内
cv2.normalize(out_new, out_new, norm_type=cv2.NORM_MINMAX) # 输入数组 输出数组 归一化类型
# 转置输出结果的维度
# result = out_new
result = out_new.transpose(1, 2, 0) # 将图像转置成 高 宽 通道数 符合opencv的格式
# 显示转换后的图像
cv2.imshow('stylized Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出: