我喜欢《你的名字》这个故事,前一段时间在微信上使用过它的滤镜,实现的效果很惊艳,应该类似于下面的这些结果
这三幅图应该都是手机版本制作的,它们一个比较显著的特点是分辨率比较相似。如何实现类似的效果了?(注意后面两图天上的云是相同的)
首先我想到的是Prisma的实现方法,这种实现方法,最后得到的是纹理的转换,效果应该说非常好,但是依赖于深度学习,目前这个方面掌握的不是很明确。而且显然上面三图不是纹理转换。
继续寻找,主要参考《实现<你的名字>同款滤镜,python+opencv》等相关资料。
一、问题分析
对于这样一副图片,如果想变成《你的名字》这种效果,需要做以下事情
(一)背景(天空)分割,替换后再融合
在自然界的图片中,很难出现动漫中大多大多的云彩。首先需要将背景(天空)分割出来,替换成动漫的天空,并且在很好地融合回去。
需要实现的技术:1.背景(天空)分割;2.再融合。需要准备的材料:1.大块的动漫云图
(二)前景色调转换
为了实现漫画中具有卡通意味的前景色调,需要对前面切割下来的前景图片进行色调转换。
需要实现的技术:3.LUT和色块制作
(三)程序框架
需要实现的技术:基于GOMfcTemplate2,实现图像的输入输出、滤镜操作的参数选择等基础操作
二、材料准备
1.大朵的云。先找到一副自然界中的云。
再准备(制作)一幅动漫的云和一副星空的图片.
三、算法实验
1.背景(天空)分割,采用材料中的方法,修改形态学部分
/************************************************************************/
/* 1.背景(天空)分割 */
/************************************************************************/
cvtColor(matSrc,temp,COLOR_BGR2HSV);
split(temp,planes);
equalizeHist(planes[2],planes[2]);//对v通道进行equalizeHist
merge(planes,temp);
inRange(temp,Scalar(100,43,46),Scalar(124,255,255),temp);
erode(temp,temp,Mat());//形态学变换,填补内部空洞
dilate(temp,temp,Mat());
imshow("原始图",matSrc);
对于这幅图来说,效果不错
2.再融合
以此为mask,直接将云图拷贝过来(之前需要先做尺度变换,就是resize)
cvtColor(temp,mask,COLOR_BGR2GRAY);//将结果存入mask
resize(matCloud,matCloud,matSrc.size());
matCloud.copyTo(matSrc,mask);
这个时候看图片,还是有很多瑕疵的,特别是边缘的地方。
所以采用seamlessclone,得到以下结果
//seamless clone
Point center(matSrc.cols/2,matSrc.rows/2);
Mat normal_clone;
Mat mixed_clone;
Mat monochrome_clone;
seamlessClone(matCloud, matSrc, mask, center, normal_clone, NORMAL_CLONE);
seamlessClone(matCloud, matSrc, mask, center, mixed_clone, MIXED_CLONE);
seamlessClone(matCloud, matSrc, mask, center, monochrome_clone, MONOCHROME_TRANSFER);
NORMAL_CLONE
MIXED_CLONE
MONOCHROME_TRANSFER
相比较之下,MIXED_CLONE对原图纹理的保存更好一些,在最后是项目中,计划将这些选线都保留。
3.LUT和色卡制作
滤镜的实现,其实只是一个RGB通道到RGB通道的转换。这个我之前有所积累,为了实现最好的效果,我这里重新实现一遍。
//打印原始色卡
Mat matBoard = Mat(2048,1024,CV_8UC3,Scalar(0));
for (int b = 0; b < 128; b++)
{
for (int g = 0; g < 128; g++)
{
for (int r = 0; r < 128; r++)
{
int index = b * 128 * 128 + g * 128 + r;
int icols = index/1024;
int irows = index%1024;
matBoard.at<Vec3b>(icols,irows)[0] = b;
matBoard.at<Vec3b>(icols,irows)[1] = g;
matBoard.at<Vec3b>(icols,irows)[2] = r;
}
}
}
采用美图秀秀对其进行卡通转换
四、工程实现
基于GOMfcTemplate2,实现图像的输入输出、滤镜操作的参数选择等基础操作
五、小结反思