使用OpenCV進(jìn)行無縫克隆
圖1:無縫克隆示例:一架飛機(jī)克隆到傍晚天空的照片中
OpenCV 3中引入的令人興奮的新功能之一稱為無縫克隆瘾英。使用此新功能捍掺,你可以從一個(gè)圖像復(fù)制對象厨内,并將其粘貼到另一個(gè)圖像中捞奕,使組合看起來無縫且自然容燕。上面的圖像是使用天空和飛機(jī)的場景創(chuàng)建的琅拌。如果我簡單地將飛機(jī)圖像覆蓋在天空圖像的頂部缨伊,結(jié)果將顯得荒謬(參見圖2)
圖2:飛機(jī)重疊的天空
當(dāng)然,在他們正確的思想中进宝,沒有人會(huì)做這樣的組合刻坊。你顯然會(huì)仔細(xì)地掩蓋圖像,也許在Photoshop中花了半天后得到一張如圖3所示的圖像党晋。
圖3:天空圖像谭胚,飛機(jī)上覆蓋著仔細(xì)的遮蔽
如果你是一名藝術(shù)家徐块,你將花費(fèi)另外半天時(shí)間,仔細(xì)調(diào)整飛機(jī)上的燈光灾而,使其成為天空圖像的照明胡控,并創(chuàng)造出美麗的構(gòu)圖。但是有兩個(gè)問題旁趟。首先昼激,你沒有半天的時(shí)間。其次锡搜,你可能不是藝術(shù)家橙困!
如果你能在飛機(jī)周圍制作一個(gè)非常粗糙的面具,然后創(chuàng)造一個(gè)看起來像圖1的漂亮構(gòu)圖余爆,那不是很酷嗎纷宇?如果你只用10行代碼就能做到這一點(diǎn)怎么辦??在我向您展示代碼之前蛾方,讓我花一個(gè)小時(shí)來解釋無縫克隆背后令人興奮的理論像捶。我們先來看看代碼吧。
無縫克隆實(shí)例:
快速瀏覽一下python的用法
# 導(dǎo)入相關(guān)的包
import cv2
import numpy as np
# 讀圖像
src = cv2.imread("images/airplane.jpg")
dst = cv2.imread("images/sky.jpg")
# 構(gòu)建一個(gè)在飛機(jī)周圍粗略的掩模
src_mask = np.zeros(src.shape, src.dtype)
poly = np.array([ [4,80], [30,54], [151,63], [254,37], [298,90], [272,134], [43,122] ], np.int32)
cv2.fillPoly(src_mask, [poly], (255, 255, 255))
# 這是飛機(jī)的中心點(diǎn)
center = (800,100)
# 無縫克隆.
output = cv2.seamlessClone(src, dst, src_mask, center, cv2.NORMAL_CLONE)
# 保存結(jié)果
cv2.imwrite("images/opencv-seamless-cloning-example.jpg", output);
復(fù)制代碼
上面的例子中桩砰,我使用的克隆類型(標(biāo)志)是NORMAL_CLONE拓春。還有另一種類型MIXED_CLONE,與NORMAL_CLONE略有不同亚隅。讓我們看看這兩種類型在細(xì)節(jié)上有何不同硼莽。
正常克隆(NORMAL_CLONE)與混合克隆(MIXED_CLONE)
我有一個(gè)5歲的兒子煮纵,如果我對他很好懂鸵,他會(huì)給我“我愛你”的門票。有一段時(shí)間行疏,孩子們渴望得到父母的認(rèn)可匆光,但這些天父母們必須盡力賺取“我愛你”的門票。無論如何酿联,回到克隆终息。我將在計(jì)算機(jī)視覺服務(wù)中使用其中一個(gè)“我愛你的門票”(參見圖4)。
圖4:“我愛你”門票
讓我們嘗試將這個(gè)圖像克隆到圖5所示的木質(zhì)紋理上贞让。我們將是懶惰的并且使用全白的掩模周崭,并將源圖像克隆在木質(zhì)紋理圖像的中心。
# 導(dǎo)入相關(guān)的包
import cv2
import numpy as np
# 讀圖像:源圖像將被克隆到目標(biāo)圖像上
im = cv2.imread("images/wood-texture.jpg")
obj= cv2.imread("images/iloveyouticket.jpg")
# 構(gòu)建全白的掩模
mask = 255 * np.ones(obj.shape, obj.dtype)
# 源圖像在目標(biāo)圖像的中位置
width, height, channels = im.shape
center = (height/2, width/2)
# 將源圖像無縫克隆到目標(biāo)圖像上并將結(jié)果輸出
normal_clone = cv2.seamlessClone(obj, im, mask, center, cv2.NORMAL_CLONE)
mixed_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MIXED_CLONE)
# 保存結(jié)果
cv2.imwrite("images/opencv-normal-clone-example.jpg", normal_clone)
cv2.imwrite("images/opencv-mixed-clone-example.jpg", mixed_clone)
復(fù)制代碼
正吃牛克隆結(jié)果
如果我們使用NORMAL_CLONE標(biāo)志使用正承颍克隆,我們將得到如圖6所示的結(jié)果《捉悖現(xiàn)在我們沒有使用好的掩模磨取,你可以看到單詞“I”和“Love”之間以及“you”和“Paa”之間的過度平滑人柿。當(dāng)然我們很懶。我們可以創(chuàng)建一個(gè)粗糙的掩模并改進(jìn)結(jié)果忙厌。但如果你懶惰而聰明凫岖,你會(huì)使用混合克隆。
圖6:OpenCV正撤昃唬克隆示例
混合克隆結(jié)果:
在正掣绶牛克隆中,源圖像的紋理(漸變)將保留在克隆區(qū)域中爹土。在混合克隆中甥雕,克隆區(qū)域的紋理(梯度)由源圖像和目標(biāo)圖像的組合確定≌鸵穑混合克隆不會(huì)產(chǎn)生平滑區(qū)域社露,因?yàn)樗鼤?huì)選擇源圖像和目標(biāo)圖像之間的主要紋理(漸變)∏砟铮混合克隆的結(jié)果如圖7所示峭弟。請注意,“I”和“Love”以及“you”和“Paa”之間的紋理不再平滑脱拼。懶人歡呼瞒瘸!
圖7:OpenCV混合克隆示例
無縫克隆視頻結(jié)果
我拍攝了飛機(jī)和天空的圖像,并改變了飛機(jī)的位置來創(chuàng)建這個(gè)動(dòng)畫熄浓。MIXED_CLONE給出了更好的結(jié)果情臭,你幾乎沒有注意到任何文物。將300×194圖像(飛機(jī))克隆到1000×560圖像(天空)上大約需要0.4秒赌蔑。
地址https://youtu.be/Ico_zGP8X2U這個(gè)是youtube上的
Poisson Image Editing
OpenCV中的無縫克隆是由Patrick Perez俯在,Michel Gangnet和Andrew Blake撰寫的具有影響力的SIGGRAPH 2003論文題為“Poisson Image Editing”的實(shí)現(xiàn)。
現(xiàn)在我們知道如果我們使用精心創(chuàng)建的掩模將源圖像(飛機(jī))的強(qiáng)度(RGB值)與目標(biāo)圖像(天空)混合娃惯,我們將獲得如圖3所示的結(jié)果朝巫。本文的核心見解是使用圖像漸變而不是圖像強(qiáng)度可以產(chǎn)生更真實(shí)的結(jié)果。在無縫克隆之后石景,掩模區(qū)域中的結(jié)果圖像的強(qiáng)度與掩模區(qū)域中的源區(qū)域的強(qiáng)度不同。相反拙吉,掩模區(qū)域中的結(jié)果圖像的梯度與掩模區(qū)域中的源區(qū)域的梯度大致相同潮孽。另外,在掩模區(qū)域的邊界處的結(jié)果圖像的強(qiáng)度與目標(biāo)圖像(天空)的強(qiáng)度相同筷黔。
作者表明往史,這是通過求解泊松方程來完成的,因此也就是論文的標(biāo)題 - Poisson Image Editing佛舱。該論文的理論和實(shí)現(xiàn)細(xì)節(jié)實(shí)際上非匙道酷挨决,但超出了本文的范圍。但是订歪,如果您閱讀論文并有疑問脖祈,請隨時(shí)在評論部分詢問。原文鏈接:https://bbs.easyaiforum.cn/thread-674-1-1.html