Python图像风格迁移已经是一个比较成熟的领域,现在连实时风格迁移都不是问题。之前一直在想这样一篇文章,但是配置大部分开源项目都很麻烦,比如luanfujun/deep-photo-styletransfer这个项目,需要安装CUDA,pytorch,cudnn等,花了一个一天来配置它。但是现在我们有一个非常好的开源应用项目,那就是OpenCV的DNN图像风格迁移。只需要安装OpenCV即可使用,在cmd/terminal中输入(如果没有安装Python,请看这篇文章:Python安装):pipinstallpython-opencv但它也有局限性,我们只能使用模型由其他人训练以执行风格迁移。如果我们要自定义样式,就必须配置cudn等工具,使用deep-photo-styletransfer等项目进行训练。在今天的教程中,我们将使用fast-neural-style训练模型对下图进行风格迁移。喵喵喵喵1.选择模型fast-neural-style一共发布了9种模型风格,我们会一一尝试,部分风格如下例如:模型文件可以在下方关注我们公众号Python实战宝典,回复风格迁移下载,内含全部10种模型风格的资源。2、克隆OpenCV源码我们直接克隆OpenCV开源项目中PythonDNN图像迁移的例子,地址为:https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py代码如下:importcv2ascviimportnumpyasnpiimportargparseparser=argparse.ArgumentParser(description='Thisscriptisusedtorunstyletransfermodelsfrom''https://github.com/jcjohnson/fast-neural-style使用OpenCV')解析器。add_argument('--input',help='图像或视频的路径。跳过从相机捕捉帧')parser.add_argument('--model',help='Pathto.t7model')parser.add_argument('--width',default=-1,type=int,help='将输入调整为特定宽度。')parser.add_argument('--height',default=-1,type=int,help='将输入调整为具体高度。')parser.add_argument('--median_filter',default=0,type=int,help='后处理模糊的内核大小。')args=parser.parse_args()net=cv.dnn.readNetFromTorch(args.model)ifargs.input:cap=cv.VideoCapture(args.input)else:cap=cv.VideoCapture(0)cv.namedWindow('Styledimage',cv.WINDOW_NORMAL)而cv.waitKey(1)<0:hasFrame,frame=cap.read()ifnothasFrame:cv.waitKey()breakinWidth=args.如果args.width!=-1elseframe.shape[1]inHeight=args.height如果args.height!=-1elseframe.shape[0]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.939out[1]+=116.779out[2]+=123.68out/=255out=out.transpose(1,2,0)t,_=net.getPerfProfile()freq=cv.getTickFrequency()/1000print(t/freq,'ms')ifargs.median_filter:out=cv.medianBlur(out,args.median_filter)cv.imshow('Styledimage',out)注意,源码是基于Python2的,所以第46行少了括号,如果你是Python3,请注意加上括号这段代码可以直接使用,parser中定义了5个参数,--input输入要迁移的图片位置,--model指要使用的模型,--width/--height指图片宽高,median_filter是一个中值滤波器。基本思想是用该像素邻域灰度值的中值代替该像素点的灰度值。因此,理论上,该值越大,图像越平滑,输出结果的细节越好。(不确定)。Median_filter我自己试了一下,对结果影响不大。3.开始迁移将以上代码保存到一个文件中,命名为1.py,在CMD/Terminal中运行带参数的脚本进行迁移。例如:$python1.py--input1.jpg--modeludnie.t7效果如下:全部9种风格的迁移效果:文章到此结束,如果喜欢今天的Python教程,请继续关注Python实战宝典,如果对您有帮助,请点赞/观看。有什么问题可以在下方留言区留言,我们会耐心解答!Python实用词典(pythondict.com)不只是字典欢迎关注公众号:Python实用词典原文来自Python实用词典:9种图像风格的Python迁移
