这两天闲着没事,写几篇文章解解闷儿~
去年用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)
今天就写到这儿吧,有什么意见或建议可以通过留言告诉我,谢谢各位。