python请输入你的名字_实现《你的名字》同款滤镜,python+opencv
好久沒有上簡書,最近上來一看發現這篇文章閱讀量遠超了其他的文章,還有評論提到說在講技術的時候賣萌不好。哈哈,當時寫的時候完全沒想過會有人搜到看,只是為自己的作品留個念想,所以文風比較散漫隨意。于是這次來小修了一遍,謝謝閱讀~
前很長一段時間,時光相冊火了一個應用《你的名字》同款濾鏡,一時間這種鮮艷靚麗的卡通天空濾鏡刷遍了QQ空間朋友圈。
時光相冊的效果是這樣的。
左:原圖,右:濾鏡圖
他們在新聞采訪中說自己和prisma一樣用到了深度學習的技術,不過是用在了天空區域提取上。
我初步理解下就是:
1. 使用深度學習提取了天空區域
2. 蒙版替換了預設的卡通天空圖片
3. 輔以傳統美圖濾鏡方法美化效果。
天空區域真的需要用深度學習來提取嗎?在知乎上逛了,下果然有人和我有相似的疑問。
我覺得深度學習真的很難把控,這是自己做著玩的小東西,所以我就用opencv實現了一個極簡版=v=
首先確定編碼流程:
1). 實現天空提取檢測模塊
2). 實現無縫融合模塊
3). 實現日系色調濾鏡
4). 整合測試及聯調
PART1. 天空區域提取
嘗試了三種方法,兩種是來自論文的,一種是隨便寫寫的,從最終的平均質量來看,還是拍腦袋決定的簡單方法A的平均質量更高。
方法A. 閾值分割,藍色消除
核心思想是將藍色作為天空進行消除。利用HSV顏色模型做色調分離,首先將原圖轉換到HSV空間,并進行藍色部分的選擇,然后做個閾值分割,從而使得藍色可以被分割走。只要我們選取到了合適的H值,那么就可以把藍色去掉。
下表是顏色對應的HSV的值:
這種方案在天空較均勻,藍色較明顯時表現較好
我的效果(目前用的opencv里的copyto接口,傻乎乎的粘貼了卡通天空圖去檢測到的區域)所以邊界還比較僵硬。
我的天空區域提取代碼:首先是cvtColor,給原圖從BGR轉HSV去,然后把hsv的三個通道split一下
用Inrange分出我們需要的藍色閾值區域。中值濾波一下消除雜點,讓Mask看起來比較完整。跟著一個開操作,再濾波一下。其實這些都是我隨便定的,目的就是讓提取出的黑白Mask更完整一點,別盡是小雜點,我們只需要保證大致的準確就行。把檢測區域存在mask里,做成一個黑白圖片。(用來提取天空region的mask),下面是這段文字的順序代碼描述。
B.《sky region detection in a single image for autonomous ground robot navigation》
和其他的方法不同,這個算法可以同時用于灰度圖和彩色圖。做法是:1、獲取圖像的梯度信息;2、根據能量函數優化計算【梯度域的最優分割閾值】,估計初始天空區域;3、最后一步后處理是為了細化前期天空區域的檢測,比如途中沒有天空區域出現,或天空對象伸出地面時。、
這個我實現了,測試時很容易檢測出奇奇怪怪的東西。可能是我寫的不對,如果最終要求是70%圖能看,那么還是A方法好一些。
C.《一種基于灰度閾值的天地背景輪廓線提取方法》
針對天地背景輪廓線具有波動起伏、邊緣模糊及輪廓邊緣灰度值變化緩慢的特點,采用灰度閾值方法,實現了多種天地背景邊緣輪廓提取
天地背景圖像通常包括天空區域和地表區域,常見的有天空海面、天空平原、天空山地、天空沙漠等景物圖像。在攝錄遠距離天地背景圖像時,背景圖像除了噪聲增大外,還會因大氣湍流等因素影響而產生抖動或起伏,這種現象在背景邊緣輪廓附近尤為明顯。其結果造成圖像輪廓邊緣模糊、波動起伏,圖像邊緣區域灰度值變化呈現連續緩慢變化狀態,導致建立在微分理論基礎上的傳統經典圖像邊緣檢測算法對天地背景圖像的邊緣輪廓提取失效。
同上,可能是我寫的不對,如果最終要求是70%圖能看,那么還是草率決定的A方法好一些。
無縫融合
在展示方法A效果的時候,我用copyto函數進行的融合,那融合效果十分僵硬,邊緣一看就是摳圖貼上去的,這種看起來就很沒品并外行的效果,咱們是必須拒絕的。
那么怎么做融合才能無縫?這里我了解的方法中和時光相冊效果最像的是一個叫【泊松融合】的方法。seamlessClone這個泊松函數在Opencv2里沒有,所以我重新去下opencv3。下來opencv3后,發現報錯提示我Numpy跟不上版本,本來裝的是Numpy1.9,說要升級到10以上。然后跑去sourceforge里補了一個numpy 1.10.2。當環境配好之后,seamlessClone就自己通了。詳細代碼是這樣的:
其實完全就是調用用seamlessClone這個函數么,前期需要做一些準備工作。找出邊緣,給出定位(確定要把卡通圖貼在什么位置、按什么比例縮放后再貼)
然后調用seamlessClone,按api上要求的給他傳他要的那些參數就Ok了。這里選的融合方式是normal_clone,不清楚原因,只是把選項都試了試這個效果最好。
這個變化真真是超明顯的。下面放對比圖,左邊是沒有seamlessclone的,右邊是seamlessClone的。可以看左邊的樹的間隙(好明顯的異樣感),右邊是用seamlessclone之后,瞬間就無痕了。
這樣看起來右邊就已經挺自然的了。不過還缺了點“動漫感”,為什么呢,因為沒有調色。
調色濾鏡
其實這玩意卡了我很久,因為壓根沒在網上看到“教教我怎么做濾鏡”這樣的教程。一搜一大把都是用著那些很基本的函數弄來弄去,都是些很丑很土氣的濾鏡效果
那么多美圖應用都提供了什么“和風濾鏡”,“小清新濾鏡”,“午后陽光濾鏡”,Blabla…………
有木有人可以告訴我他們都是咋做的?
謝謝大神,雖然完全沒有感受到手把手的教(擦淚),但是連猜帶蒙的我還是給整出來了。
就讓我來手把手的教大家一下(擦淚)。
首先,有一張(被公認很標準的)色卡圖,當原始顏色映射表,左圖是原始顏色表,右圖是對應著某個色彩濾鏡“比如和風”的濾鏡色卡表。
這兩個色卡表說是表,其實就是圖片,就是一堆有RGB通道的像素點集。
我說下濾鏡的思想:
要給一張圖片刷濾鏡,遍歷它的每個像素點,比如坐標(0,0)的像素點,它的顏色是(123,132,231)先在表1查顏色(123,132,231)對應的色卡表位置(坐標),再去表二查出對位坐標的新的顏色值(RGB)替換掉當前像素點的顏色(RGB)。基本都是自行腦補出來的思路,原始色卡說白了就是一堆數值,一堆有規律的數值。
我們需要跟著輸入圖的各個像素點上的RGB值,找到它位于原始色卡的坐標。那么就是要找到原始色卡每個點的RGB值和它的坐標的對應關系。這個原石色卡表當然是有規律的,它每個坐標上的RGB數值都是和坐標掛鉤的,是有規則的。
經過一段時間的歸納總結我推出來了映射公式:(AB二維是坐標,xyz是三個顏色通道)
A = y/4 + (x/32)*64
B = z/4 + ((x%32)/4)*64
這個公式我驗證了完全正確,用網上給出的一個示例色卡,能刷出濾鏡色如下。
是不是看起來挺高級?有點美圖秀秀的feel了吧!
可能有人想問??右邊那個對應新濾鏡的色卡是怎么來的?
答:我在網上下載的。(好吧,專業的濾鏡制作公司應該會需要藝術家?設計師來做那張色卡)這是藝術范疇了我等程序猿只要知道怎么怎么進行映射,怎么寫代碼轉換風格就可以了。不過,畢竟是沖著實現你的名字同款濾鏡的目標做的。那你的名字同款色調也是必須的。
那么我來介紹一下我制作右側色卡的方法把。。
……
感覺說出來會很丟人。
……
但不失為一個好辦法。
【把左側的原始色卡存到手機里,放到任意一個美圖應用里 “刷一下” ,刷哪個濾鏡,就出哪個濾鏡的色卡。等于是復刻色卡】
如果是盈利性質的這樣做肯定是不行的,應該讓設計師設計,咱們宅著自己練技術玩,這方法還不錯。
下面是我對色卡操作的代碼:
整合前三塊
最后就是簡單的加法,把前三塊串起來就Ok了
可以大概看看最終效果,我覺得還挺夢幻的,不過因為天空提取的算法太簡單,所以有些圖片的天空的表現很辣雞就是了。。Just for fun!
嘿嘿嘿我要寫簡書當然是放好看的效果了。至于不好看的,就不展示了
批量測試的結果(100張圖):
好看的結果普遍在50%左右,能看(不保證好看)的結果在80%以上。不能看的在15%左右。不能看圖就是固定的幾張,都是因為天空區域提取出錯了(多選/少選)。如果想做成專業應用,在天空區域提取這步肯定不能像我寫的方法A這么隨意。
以上。
謝謝閱讀~
總結
以上是生活随笔為你收集整理的python请输入你的名字_实现《你的名字》同款滤镜,python+opencv的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux图形化界面(linux 图形化
- 下一篇: 进程与服务的签名_苹果app签名需要注意