1. 程式人生 > >自己動手,實現“你的名字”濾鏡

自己動手,實現“你的名字”濾鏡

height 使用 圖片 很好 board courier mage margin ges

我喜歡《你的名字》這個故事,前一段時間在微信上使用過它的濾鏡,實現的效果很驚艷,應該類似於下面的這些結果 技術分享技術分享技術分享 這三幅圖應該都是手機版本制作的,它們一個比較顯著的特點是分辨率比較相似。如何實現類似的效果了?(註意後面兩圖天上的雲是相同的) 首先我想到的是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,實現圖像的輸入輸出、濾鏡操作的參數選擇等基礎操作五、小結反思



來自為知筆記(Wiz)

自己動手,實現“你的名字”濾鏡