码迷,mamicode.com
首页 > 其他好文 > 详细

自己动手,实现“你的名字”滤镜

时间:2017-07-21 11:37:53      阅读:572      评论:0      收藏:0      [点我收藏+]

标签:变换   one   src   nbsp   add   border   输入   lin   prism   

    我喜欢《你的名字》这个故事,前一段时间在微信上使用过它的滤镜,实现的效果很惊艳,应该类似于下面的这些结果
    技术分享技术分享技术分享
    这三幅图应该都是手机版本制作的,它们一个比较显著的特点是分辨率比较相似。如何实现类似的效果了?(注意后面两图天上的云是相同的)
    首先我想到的是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,实现图像的输入输出、滤镜操作的参数选择等基础操作
五、小结反思

    





自己动手,实现“你的名字”滤镜

标签:变换   one   src   nbsp   add   border   输入   lin   prism   

原文地址:http://www.cnblogs.com/jsxyhelu/p/7216795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!