用MATLAB制作素描风格视频:附完整源代码

这两天闲着没事,写几篇文章解解闷儿~

去年用MATLAB制作了一组blackpink的mv素描风格视频合集(av78304346),虽然播放量不多,但感觉挺有意思的,制作的时候也学到了很多东西、体会到了MATLAB这玩意儿真是牛掰,不仅能玩音乐,还能给视频加滤镜,最重要的是,看了爱豆的所有mv。。。

话不多说,感兴趣的朋友可以看一下这个“教程”吧。

首先是工具,我制作这组视频一共用了3个软件(按顺序):AE、MATLAB、PR

制作流程很简单:

1.用AE逐帧导出视频所有图片

2.用MATLAB自动读图加滤镜

3.用PR逐帧生成视频、再合成视频

对比效果,如果是高清图片,效果更好(blackpink-Lisa)

下面详细讲一下整个过程:(主要讲用MATLAB加素描滤镜

1.用AE逐帧导出视频所有图片

这个很简单,不会的可以自行百度(我就是百度一下后学会的。。。链接:https://jingyan.baidu.com/article/ff4116250ebdc112e4823731.html)

注意读出来的图片会很多,而且需要把图片按照序列名依次生成(如下面第一张图片所示),否则第三部用PR读图时图片顺序就是乱的。。。

2.用MATLAB自动读图加滤镜(代码在文末)

其实不会用MATLAB的同学也可以用PS或者手机自带的滤镜软件一张一张地给图片添加滤镜,每天一张,一个MV按照4000张算的话,可以做约11年。。。

这里使用MATLAB需要两个函数,第一个colorgrad.m函数是主函数需要用到的函数,第二个是主函数(我称之为shunxudutupian.m),需要注意的是,这两个函数都需要和步骤1得到的很多张图片要放到一个文件夹下面,而且该文件夹要在MATLAB的当前文件夹里打开

将两个m文件放到步骤1得到的图片的文件夹里

打开MATLAB

在MATLAB的当前文件夹栏打开上一图的文件夹

点击打开“当前文件夹”里的主程序(我命名为shunxudutupian.m这个主程序的命名都无所谓),将代码pt ='E:\MATLAB2019\bin\bp\'里面的地址改为“当前文件夹”的地址,将代码ext = '*.jpg';.jpg改为自己的图片格式即可(如果是bmp,就将jpg改成bmp),再运行该主程序即可,注意如果有很多图片的话,时间会很长,4000张图片依次读入、加滤镜、再依次生成素描风格图片大约需要20~40分钟不等,生成的图片序列会自动写入“当前文件夹”里

运行程序完毕后的当前文件夹

3.用PR逐帧生成视频、再合成视频

在PR里将生成的素描风格图片按照序列名称依次打开,再修改视频播放总时间即可,这一步也很简单,具体可以自行百度(我还是百度一下后学会的。。。推荐这个https://jingyan.baidu.com/article/0aa22375618d1088cc0d64eb.html)

总结

这个方法比较耗时间,但是最后效果却很不错(毕竟是一帧一帧生成的视频)图片来源:av78304346。

对比效果(JENNIE-SOLO)

对比效果(JENNIE-KILL THIS LOVE)

对比效果(JISOO-DDU DU DDU DU)

对比效果(LISA-DDU DU DDU DU)

对比效果(JISOO-AS IF IT'S YOUR LAST)

值得注意的是,利用MATLAB生成素描风格图片的方式相当依赖图片的清晰度,比如上图最后一张JISOO-AIIYL,我选用的源视频是标清视频,因此导出的图片像素低,导致生成的素描风格图片质量很模糊。而前面几张都是用蓝光视频生成的,因此生成的素描风格图片质量较高。

另外,图片的亮度、对比度对生成的素描风格图片也有较大影响,比如上图LISA-DDDD的图片,LISA抛出的烟雾靠近她的一侧,轮廓较为模糊,生成的素描风格图片边界就很不清晰。而且对于风格较暗或色差相差不大的图片,生成的效果也不是很理想。

对比效果(PALYING WITH FIRE的开场,由于图像风格较暗,对比度低,生成的图片效果不是很理想)

对比效果(JENNIE-STAY,画面对比度低,导致素描风格图片质量较低)

源代码

colorgrad.m

function [VG,A,PPG]=colorgrad(f,T) if  (ndims(f) ~= 3) || (size(f,3) ~=3)     error('Input image must be RGB.'); end sh=fspecial('sobel'); sv=sh'; Rx=imfilter(double(f(:,:,1)),sh,'replicate'); Ry=imfilter(double(f(:,:,1)),sv,'replicate'); Gx=imfilter(double(f(:,:,2)),sh,'replicate'); Gy=imfilter(double(f(:,:,2)),sv,'replicate'); Bx=imfilter(double(f(:,:,3)),sh,'replicate'); By=imfilter(double(f(:,:,3)),sv,'replicate'); gxx=Rx.^2+Gx.^2+Bx.^2; gyy=Ry.^2+Gy.^2+By.^2; gxy=Rx.*Ry+Gx.*Gy+Bx.*By; A=0.5*(atan(2*gxy./(gxx-gyy+eps))); G1=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*A)+2*gxy.*sin(2*A)); A=A+pi/2; G2=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*A)+2*gxy.*sin(2*A)); G1=G1.^0.5; G2=G2.^0.5; VG=mat2gray(max(G1,G2)); RG=sqrt(Rx.^2+Ry.^2); GG=sqrt(Gx.^2+Gy.^2); BG=sqrt(Bx.^2+By.^2); PPG=mat2gray(RG+GG+BG); if nargin==2     VG=(VG>T).*VG;     PPG=(PPG>T).*PPG; end

主程序

close all clear all clc; pt ='E:\MATLAB2019\bin\bp\'; ext = '*.jpg'; dis = dir([pt ext]); nms = {dis.name}; for k = 1:1:length(nms)     aa=dis(k,1);     bb=aa.name;     f = imread(bb);   [VG,A,PPG] = colorgrad(f);   ppg = im2uint8(PPG);   ppgf = 255 - ppg;   [M,N] = size(ppgf);T=200;   ppgf1 = zeros(M,N);   for ii = 1:M       for jj = 1:N           if ppgf(ii,jj)<T               ppgf1(ii,jj)=0;           else               ppgf1(ii,jj)=235/(255-T)*(ppgf(ii,jj)-T);           end       end   end   ppgf1 = uint8(ppgf1);   figure;   str=['00000',bb]; set(0,'DefaultFigureVisible','off') imwrite(ppgf,str); end imshow(image)

今天就写到这儿吧,有什么意见或建议可以通过留言告诉我,谢谢各位。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空