導(dǎo)讀
所謂人臉融合:給定輸入人臉A、B,輸出的人臉C具有A和B共同的特征,是一張全新的人臉,也可以說(shuō)是一張假臉。 人臉融合的過(guò)程主要有三步:人臉特征點(diǎn)定位,人臉融合,人臉交換。
第一步,通過(guò)深度學(xué)習(xí)訓(xùn)練的模型對(duì)兩張待融合的圖像進(jìn)行關(guān)鍵點(diǎn)定位;
第二步,根據(jù)定位結(jié)果對(duì)人臉進(jìn)行融合;
第三步,將融合得到的人臉交換到待交換的人臉上,合成最終圖像。
實(shí)際上做到第二步已經(jīng)達(dá)到了人臉融合的基本要求,對(duì)于人臉交換,大部分用于假臉交換起到一定的隱私保護(hù)作用,用在人臉融合這里也算剛剛好,如果隨意用于交換真臉,那就是信息災(zāi)難了,例如各種換臉的視頻電影層出不窮。 ?
1 人臉特征點(diǎn)定位
1.1 訓(xùn)練模型
數(shù)據(jù)集越大,訓(xùn)練的模型越精確。人臉特征點(diǎn)檢測(cè)有一個(gè)非常著名的數(shù)據(jù)集300-W(300 Faces In-The-Wild Challenge)。300-W是一項(xiàng)專注于人臉特征點(diǎn)的檢測(cè)的競(jìng)賽,在該競(jìng)賽中,參賽隊(duì)伍需要從600張圖片中檢測(cè)出人臉,并且將面部的68個(gè)特征點(diǎn)全部標(biāo)記出來(lái)。300W數(shù)據(jù)的壓縮包有2G多。包含各種各樣已經(jīng)標(biāo)記好的人臉信息。因?yàn)樵谌绱舜蟮臄?shù)據(jù)集上訓(xùn)練需要大量的資源和時(shí)間。所以,在本次的設(shè)計(jì)中,我們使用少量的數(shù)據(jù)集來(lái)訓(xùn)練。 ? 訓(xùn)練特征點(diǎn)檢測(cè)模型,這里我們用到了imglab工具。Imglab用于標(biāo)記可用于訓(xùn)練dlib或其他對(duì)象檢測(cè)器的對(duì)象的圖像。通過(guò)cmd:
imglab -c training_with_face_landmarks.xml images 來(lái)創(chuàng)建我們記錄標(biāo)簽的xml文件,接下來(lái)通過(guò)cmd:
imglab training_with_face_landmarks.xml 打開imglab工具對(duì)圖像打標(biāo)簽。這里我們按照dlib官方給出的68個(gè)特征點(diǎn)對(duì)每張圖片進(jìn)行標(biāo)注,shift+鼠標(biāo)左鍵拖動(dòng)截取人臉,雙擊選擇的矩形,shift+左鍵進(jìn)行特征點(diǎn)標(biāo)注。 接下來(lái)就可以開始訓(xùn)練模型,這一步就看電腦性能了。首先定義參數(shù)設(shè)置函數(shù):
options = dlib.simple_object_detector_training_options() 大部分參數(shù),我們使用默認(rèn)值,針對(duì)我們的訓(xùn)練集,主要設(shè)定如下幾個(gè)參數(shù)。
Oversampling_amount: 通過(guò)對(duì)訓(xùn)練樣本進(jìn)行隨機(jī)變形擴(kuò)大樣本數(shù)目。比如N張訓(xùn)練圖片,通過(guò)設(shè)置該參數(shù),訓(xùn)練樣本數(shù)將變成N * oversampling_amount張。所以一般而言,值越大越好,只是訓(xùn)練耗時(shí)也會(huì)越久。因?yàn)楸纠杏?xùn)練集數(shù)據(jù)較少,所以我們將值設(shè)得較高(300)。
Nu: 正則項(xiàng)。nu越大,表示對(duì)訓(xùn)練樣本fit越好。
Tree depth: 樹深。本例中通過(guò)增加正則化(將nu調(diào)?。┖褪褂酶∩疃鹊臉鋪?lái)降低模型的容量。
Be_verbose,是否輸出訓(xùn)練的過(guò)程中的相關(guān)訓(xùn)練信息,設(shè)置為真。
1.2 測(cè)試模型
人臉特征點(diǎn)檢測(cè)模型訓(xùn)練完成后,需要測(cè)試該模型的準(zhǔn)確率。測(cè)試模型的準(zhǔn)確率包括兩部分,訓(xùn)練集測(cè)試和測(cè)試集測(cè)試。訓(xùn)練集就是訓(xùn)練該模型的數(shù)據(jù)集合。輸出在訓(xùn)練集中的準(zhǔn)確率的核心代碼為:
print("Training accuracy{0}".format(dlib.test_shape_predictor(training_xml_path,"predictor.dat"))) 測(cè)試集即非訓(xùn)練集數(shù)據(jù)的集合。輸出在測(cè)試集中的準(zhǔn)確率的核心代碼為:
print("Testing accuracy:{0}".format(dlib.test_shape_predictor(testing_xml_path, "predictor.dat"))) 1.3 特征點(diǎn)定位 用訓(xùn)練好的模型進(jìn)行人臉特征點(diǎn)檢測(cè)。具體步驟如下,導(dǎo)入上述訓(xùn)練好的模型:
predictor = dlib.shape_predictor("predictor.dat"); 檢測(cè)人臉:
dets = detector(img, 1) 返回人臉?biāo)诰匦?,可通過(guò)len(dets)獲得人臉個(gè)數(shù);獲取檢測(cè)到的人臉特征點(diǎn):
lanmarks = [[p.x, p.y] for p in predicator(img1, d).parts()]; 在圖片中循環(huán)打印出68個(gè)特征點(diǎn),? ??
2 人臉融合
這一步首先介紹兩個(gè)算法,Delaunay三角剖分,仿射變換。
2.1 Delaunay三角剖分
設(shè)點(diǎn)集V,x,y屬于點(diǎn)集V,多邊形S中兩個(gè)端點(diǎn)為x,y的一條邊e,若過(guò)x,y兩點(diǎn)存在一個(gè)圓,且點(diǎn)集V中任何其他的點(diǎn)都不在該圓內(nèi),圓上包括x,y兩點(diǎn)最多三點(diǎn),那么稱e為Delaunay邊。那么如果點(diǎn)集V的一個(gè)三角剖分T只包含Delaunay邊,那么該三角剖分稱為Delaunay三角剖分。 ? Delaunay三角剖分有兩個(gè)重要特性,一個(gè)是空接圓特性:Delaunay三角剖分是唯一的,任意四點(diǎn)不能共圓,在Delaunay三角剖分中任一三角形的外接圓范圍內(nèi)不會(huì)有其它點(diǎn)存在。另外一個(gè)是最大化最小角特性:在散點(diǎn)集形成的所有三角剖分中,Delaunay三角剖分所形成的三角形的最小角最大。 ? 該算法其實(shí)來(lái)源于美術(shù)館問(wèn)題,美術(shù)館是一個(gè)復(fù)雜的多邊形,我們需要在美術(shù)館當(dāng)中安排警衛(wèi),在使得他們能觀察到美術(shù)館的所有角落前提下,安排的警衛(wèi)最少。多邊形中的視野問(wèn)題不好處理,所以將多邊形剖分成多個(gè)三角形從而使問(wèn)題得到簡(jiǎn)化。警衛(wèi)站在三角形的任意一個(gè)位置都能觀察到這個(gè)三角形中的每一個(gè)點(diǎn)。數(shù)學(xué)家Steve Fisk對(duì)這個(gè)問(wèn)題給出了非常精彩的解答:剖分成三角形后,每個(gè)三角形的三個(gè)頂點(diǎn)共用三種不同的顏色染色,染色結(jié)束后在最少的顏色上設(shè)置警衛(wèi)即可,如下圖所示。
所以問(wèn)題簡(jiǎn)化成將該多邊形剖分成一個(gè)個(gè)三角形。另外三角剖分也有優(yōu)劣之分,一般來(lái)說(shuō),剖分出來(lái)的三角形越勻稱越好,勻稱的三角形在圖形圖像處理方面效果比陡峭的三角形更好,如下圖所示,都是對(duì)同一個(gè)六邊形進(jìn)行三角剖分,但是右邊的效果更好,這就是Delaunay三角剖分。而在人臉融合技術(shù)中,Delaunay三角剖分也扮演了不可或缺的角色。
我們根據(jù)得到的特征點(diǎn)對(duì)人臉進(jìn)行Delaunay三角剖分,將人臉剖分成一個(gè)個(gè)三角形,然后將一個(gè)個(gè)三角形進(jìn)行仿射變換,再調(diào)整透圖片透明度,便可得到融合后的人臉,訓(xùn)練的特征點(diǎn)越多,融合的效果便越好。OpenCV提供了Subdiv2D類實(shí)現(xiàn)了Delaunay三角剖分算法,subdiv = cv2.Subdiv2D(rect),將68個(gè)特征點(diǎn)的位置插入subdiv,subdiv.insert§ ,獲取Delaunay三角列表:
trangleList = subdiv.getTriangleList() 最后調(diào)用cv2.line()將剖分后的結(jié)果畫出,
2.2 仿射變換
仿射變換,又稱仿射映射,是指在幾何中,一個(gè)向量空間進(jìn)行一次線性變換并接上一個(gè)平移,變換為另一個(gè)向量空間。仿射變換能夠保持圖像的“平直性”,包括旋轉(zhuǎn),縮放,平移,錯(cuò)切操作。一般而言,仿射變換矩陣為2*3的矩陣,第三列的元素起著平移的作用:
前面兩列的數(shù)字對(duì)角線上是縮放,其余為旋轉(zhuǎn)或者錯(cuò)切的作用。仿射變換是一種二維坐標(biāo)(x, y)到二維坐標(biāo)(xt, yt)的線性變換。數(shù)學(xué)表達(dá)式如下圖所示:
直觀的圖像表示就是這樣:
首先對(duì)之前得到的特征點(diǎn)進(jìn)行預(yù)處理。人臉特征點(diǎn)檢測(cè)算法得出的人臉68個(gè)特征點(diǎn)保存在本地的txt文件中。同時(shí),Delaunay三角剖分算法得到的三角形的索引結(jié)點(diǎn)也保存在本地的txt文件中。讀取人臉A的特征點(diǎn)points1,人臉B的特征點(diǎn)points2。因?yàn)橐笕诤系娜四槻灰欢ㄊ峭却笮?,所以我們?nèi)∫粋€(gè)平均值保存在points中。Points即為我們?nèi)诤虾蟮娜四樚卣鼽c(diǎn)所在位置。經(jīng)過(guò)三角剖分后,人臉被剖分成一個(gè)個(gè)三角形。我們從保存的三角形索引結(jié)點(diǎn)中循環(huán)讀取每一個(gè)三角形的索引點(diǎn),通過(guò)索引結(jié)點(diǎn)找到人臉A和人臉B的該三角形所對(duì)應(yīng)的三個(gè)特征點(diǎn)位置。取得的三角形以下稱三角形A,三角形B。取平均值的三角形稱為C。因?yàn)樽龇律渥儞Q只需要變換一個(gè)我們剖分形成的三角形,不需要變換整張圖片,所以我們可以求得該三角形的最小外接矩形,以提升變換效率,并減少計(jì)算量。
r = cv2.boundingRect(np.float32([t])) 返回的r為一個(gè)四元組,前兩個(gè)值為矩形左上角的坐標(biāo),后兩個(gè)值為矩形的長(zhǎng)和寬。因?yàn)橐谏厦娅@得的外接矩形中進(jìn)行仿射變換,所以原點(diǎn)從圖片的左上角點(diǎn)變成了外接矩形的左上角點(diǎn),從而要修改三角形的三點(diǎn)坐標(biāo)。
tRect.append(((t[i][0] - r[0]), (t[i][1] - r[1]))) t為預(yù)處理中獲得的三角形三個(gè)頂點(diǎn)坐標(biāo)。在上一步中,我們獲得了輸出矩形圖像。但是,我們對(duì)矩形區(qū)域內(nèi)的三角形感興趣。因此,我們使用fillConvexPoly創(chuàng)建一個(gè)掩模mask,用于遮蔽三角形外的所有像素。這個(gè)新的裁剪圖像最終可以使用輸出邊界矩形的左上角坐標(biāo)點(diǎn)置于輸出圖像中的正確位置。接下來(lái)就是通過(guò)仿射變換將三角形A,B變換到C的位置上。
warpImage1 = applyAffineTransform(img1Rect, t1Rect, tRect, size)warpImage2 = applyAffineTransform(img2Rect, t2Rect, tRect, size) ApplyAffineTransform是手寫的函數(shù),包括cv2.getAffineTransform,用來(lái)找到兩個(gè)三角形之間的仿射變換矩陣,cv2.warpAffine將上個(gè)函數(shù)獲得的矩陣應(yīng)用于圖像。
# Apply affine tranform calculated using srcTri and sdtTri to src and output an image of sizedef applyAffineTransform(src, srcTri, dstTri, size):??
?# Given a pair of triangles,find the affine transform. ??warpMat = cv2.getAffineTransform(np.float32(srcTri), np.float32(dstTri)) ?
?# Apply the Affine Transform just foundto the src image ?
?dst = cv2.warpAffine(src, warpMat, (size[0], size[1]), None, flags=cv2.INTER_LINEAR, ? ?
? ? ? ? ? ? ? ? ? ? borderMode=cv2.BORDER_REFLECT_101) ?
?return dst
2.3 圖像融合
將人臉剖分成一個(gè)個(gè)小三角形并仿射變換到既定的位置后,進(jìn)行圖片融合。簡(jiǎn)單來(lái)說(shuō),通過(guò)把圖像設(shè)置為不同的透明度,把兩張圖像融合為一張圖像(一般要求圖像需要是等尺寸大小的),公式如下圖所示:
仿射變換時(shí),我們將人臉A的三角形A,人臉B的三角形B仿射到三角形C上。如果不處理,三角形A和三角形B仿射后的圖像會(huì)疊加在C上。這里我們?cè)O(shè)置一個(gè)透明度參數(shù)alpha為0.5,兩張人臉各占一半。
imgRect = (1.0 - alpha) * warpImage1 + alpha * warpImage2 warpImage1,warpImage2為經(jīng)過(guò)仿射變換的圖像。最后一步,最后將用于遮蔽三角形外的所有像素mask與上個(gè)步驟輸出的圖片結(jié)果相乘就可以得到對(duì)應(yīng)區(qū)域的值了。 ? 得到融合后的人臉后,最后一步,就是將融合后的人臉交換到待交換的人臉上。? ??
3 人臉交換
人臉交換分為五個(gè)步驟:特征點(diǎn)檢測(cè),查找凸包,基于凸包三角剖分,仿射變換,無(wú)縫克隆。特征點(diǎn)檢測(cè),三角剖分和仿射變換之前的部分提及到,所以詳細(xì)介紹一下查找凸包和無(wú)縫克隆。
3.1 凸包算法
如下圖所示,所給平面上有點(diǎn)集V,包含p0到p12一共13個(gè)點(diǎn),過(guò)p0,p1,p3,p10,p13點(diǎn)作一個(gè)多邊形,點(diǎn)集V中所有點(diǎn)都包含在形成的這個(gè)多邊形上。如果當(dāng)這個(gè)多邊形是凸多邊形的時(shí)候,我們就叫它“凸包”。簡(jiǎn)單來(lái)說(shuō),點(diǎn)集的凸包即一個(gè)最小的凸多邊形使得點(diǎn)集中所有的點(diǎn)在該凸邊形內(nèi)或該凸邊形上。
凸包算法為什么會(huì)用在人臉交換中呢?人臉交換同樣需要特征點(diǎn)檢測(cè),同樣需要三角剖分,與人臉融合不同的是人臉交換是直接通過(guò)仿射變換將人臉A剖分后的三角形仿射到人臉B上。人臉融合剖分的三角形越多,融合效果越完美。 ? 人臉交換不同于融合,第一步只需要將人臉A貼到人臉B上,所以只需要求出68個(gè)特征點(diǎn)的凸包多邊形,對(duì)這個(gè)多邊形剖分即可。OpenCV便提供了求得這個(gè)凸包的函數(shù)cv2.convexHull()。人臉交換不同于融合,第一步只需要將人臉A貼到人臉B上,所以只需要求出68個(gè)特征點(diǎn)的凸包多邊形,對(duì)這個(gè)多邊形剖分即可, 仿射換臉核心代碼如下:
# Warps and alpha blends triangular regions from img1 and img2 to imgdef warpTriangle(img1, img2, t1, t2):
# Find bounding rectangle for each triangle r1 = cv2.boundingRect(np.float32([t1])) r2 = cv2.boundingRect(np.float32([t2]))
# Offset points by left top corner of the respective rectangles t1Rect = [] t2Rect = [] t2RectInt = [] for i in range(0, 3): t1Rect.append(((t1[i][0] - r1[0]), (t1[i][1] - r1[1]))) t2Rect.append(((t2[i][0] - r2[0]), (t2[i][1] - r2[1]))) t2RectInt.append(((t2[i][0] - r2[0]), (t2[i][1] - r2[1])))
# Get mask by filling triangle mask = np.zeros((r2[3], r2[2], 3), dtype=np.float32) cv2.fillConvexPoly(mask, np.int32(t2RectInt), (1.0, 1.0, 1.0), 16, 0);
# Apply warpImage to small rectangular patches img1Rect = img1[r1[1]:r1[1] + r1[3], r1[0]:r1[0] + r1[2]]
# img2Rect = np.zeros((r2[3], r2[2]), dtype = img1Rect.dtype) size = (r2[2], r2[3]) img2Rect = applyAffineTransform(img1Rect, t1Rect, t2Rect, size) img2Rect = img2Rect * mask
# Copy triangular region of the rectangular patch to the output image img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]] = img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]] * ( (1.0, 1.0, 1.0) - mask) img2[r2[1]:r2[1] + r2[3],
r2[0]:r2[0] + r2[2]] = img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]] + img2Rect 得到的結(jié)果,可以明顯看出膚色的差異。 ?
3.2 無(wú)縫融合
優(yōu)秀的技術(shù)就像魔法。優(yōu)秀的魔術(shù)師將物理學(xué)、心理學(xué)和古老的魔術(shù)相結(jié)合實(shí)現(xiàn)了圖像的無(wú)縫融合。圖像的編輯包括全局變化和局部變化,無(wú)縫融合是將我們所選中的局部區(qū)域無(wú)縫且無(wú)影響地融合到目標(biāo)圖像中。傳統(tǒng)上的工具來(lái)完成局部的剪切與融合,是通過(guò)克隆工具直接覆蓋那部分融合區(qū)域的內(nèi)容,因此如果選擇的區(qū)域色彩和明暗有明顯的差異,會(huì)導(dǎo)致明顯的邊縫,顯得突兀。無(wú)縫融合由此誕生。 ? 無(wú)縫融合的基本原理基于人的生物學(xué)特性,我們?nèi)搜厶焐蛯?duì)“突變”更為敏感。簡(jiǎn)單來(lái)說(shuō),比如突然從密閉的黑暗房間出來(lái),我們?nèi)搜蹠?huì)受到光線的刺激。但是如果我們漸變的適應(yīng)一下,就不會(huì)感受到光線的刺激。就像白紙上的黑色圖形,我們會(huì)感覺(jué)很“突?!薄M砣绻B續(xù)平滑的將這個(gè)圖像由白入灰再變黑,那么我們就感受不到這種突兀。無(wú)縫融合就是基于此生物學(xué)特性的魔法,雖然是將一張圖像融合到另一張圖像上,但是我們絲毫感覺(jué)不出“突?!?。 ? 這種無(wú)縫編輯和克隆方法的核心是數(shù)學(xué)工具―泊松方程,前提是需滿足在所選區(qū)域未知函數(shù)的拉普拉斯條件和它的Dirichlct邊界條件:未知函數(shù)的邊界值與目標(biāo)圖像中所選區(qū)域的邊界值相同。因?yàn)樵谶@兩個(gè)條件下方程的解是唯一的。
? 首先,心理學(xué)家Land和Mccan在1971年提出通過(guò)拉普拉斯算子的限制可以減緩漸變的梯度,當(dāng)把一幅圖像混淆到另一幅圖像上幾乎注意不到有什么影響。并且,泊松方程可以完成無(wú)縫地填滿目標(biāo)圖像中的選中區(qū)域。在數(shù)學(xué)上說(shuō)到底就是構(gòu)建方程組:Ax=b。然后通過(guò)求解這個(gè)方程組以得到每個(gè)像素點(diǎn)的值。矩陣A是一個(gè)系數(shù)矩陣,矩陣的每一行有五個(gè)非零元素,對(duì)應(yīng)于拉普拉斯算法的卷積核,而算法的關(guān)鍵在于怎么構(gòu)建方程組的b值 。首先,計(jì)算待融合圖像A和背景圖像B的梯度場(chǎng);然后計(jì)算融合圖像的梯度場(chǎng),計(jì)算完后將A的梯度場(chǎng)覆蓋到B的梯度場(chǎng)上;最后對(duì)梯度求偏導(dǎo)求得融合圖像的散度b,解系數(shù)方程Ax=b。雖然看起來(lái)涉及到許多數(shù)學(xué)知識(shí),實(shí)際上實(shí)現(xiàn)起來(lái)只要一個(gè)函數(shù)cv2.seamlessClone,這就是OpenCV(Computer Vision)。 當(dāng)然了,如果交換的人臉周圍是黑的,就比如下圖我們?nèi)诤系玫降闹虚g的人臉,人臉交換時(shí)人臉輪廓難免會(huì)包括周圍的黑色背景。所以,為了使無(wú)縫融合取得更好的效果,最好在圖片周圍加八個(gè)點(diǎn),將環(huán)境也粗略融合一下,這樣就可以避免人臉周圍黑色造成換臉后的“傷疤”。 ? 新加的這8個(gè)點(diǎn),可以通過(guò):
sp = img1.shape # [高|寬|像素值由三種原色構(gòu)成] #高寬色素 獲取圖片的高和寬,例如高的一半可以sp[0]/2表示,寬的一半sp[1]/2。 將這張人臉進(jìn)行人臉交換,可以有效防止周圍黑色環(huán)境無(wú)縫融合產(chǎn)生的“傷疤”。??
4 實(shí)驗(yàn)分析總結(jié)
從第一張圖來(lái)看,我們對(duì)兩張性格相同的人臉進(jìn)行融合,實(shí)驗(yàn)結(jié)果顯示本文提出的人臉融合技術(shù)可以實(shí)現(xiàn)人臉融合,且最后的融合結(jié)果具有高度的真實(shí)感,我們基本分辨不出這是融合的效果,初步達(dá)到了我們對(duì)人臉融合實(shí)現(xiàn)的要求。 ? 從第二張、第三張圖來(lái)看,我們對(duì)兩張性別不同、膚色不同的人臉進(jìn)行融合,并分別交換到這兩張性別不同的人臉上,從視覺(jué)效果上看,我們的算法依然取得了較好的效果,融合的人臉不論是交換在男性身上還是交換在女性身上都顯得非常自然,并且膚色也非常自然,性別,膚色并未對(duì)算法結(jié)果造成影響。
? 從第四張圖來(lái)看,我們選擇了兩張人臉大小不一的圖像來(lái)進(jìn)行融合,我們發(fā)現(xiàn)融合仍然具有高度的真實(shí)感。但是發(fā)現(xiàn)一點(diǎn)瑕疵,左邊的圖像由于燈光的照射使得右側(cè)臉頰有陰影,而我們的算法并不能判斷出這是由于燈光產(chǎn)生的陰影還是膚色,導(dǎo)致融合后陰影仍然存在,致使結(jié)果有些不自然,但并不影響整個(gè)融合的實(shí)現(xiàn),這個(gè)問(wèn)題也是在未來(lái)需要解決的。 ? 總的來(lái)說(shuō),實(shí)驗(yàn)結(jié)果證明本文提出的人臉融合實(shí)現(xiàn)的融合結(jié)果具有高度的真實(shí)感,基本實(shí)現(xiàn)了最初構(gòu)想,在效果上也達(dá)到了預(yù)期要求。但仍然還有需要改進(jìn)的方向: ? (1)消除燈光照射產(chǎn)生陰影對(duì)人臉融合的影響。上述第四張圖片由于燈光的照射使得人臉右側(cè)臉頰產(chǎn)生陰影,而我們提到的無(wú)縫融合只能將其也歸為膚色,導(dǎo)致融合后即使沒(méi)用光照也有陰影,導(dǎo)致實(shí)驗(yàn)效果不自然。方向有兩個(gè),一個(gè)是對(duì)圖像進(jìn)行預(yù)處理,消除光照產(chǎn)生的影響;另一個(gè)就是在融合過(guò)程中對(duì)陰影部分進(jìn)行處理。從可行上來(lái)看,對(duì)圖像進(jìn)行預(yù)處理顯得更加便于操作。 ? (2)消除頭發(fā),眼鏡等遮擋物對(duì)融合的影響。我們的算法是在人臉完全展示的狀態(tài)下進(jìn)行剖分并進(jìn)行融合。如果出現(xiàn)遮擋物,仍然會(huì)把遮擋物當(dāng)成人臉的一部分參與仿射變換并進(jìn)行融合,這同樣會(huì)影響實(shí)驗(yàn)結(jié)果。而隨著社會(huì)的發(fā)展,發(fā)型遮擋人臉或者飾品遮擋人臉的情況也比較常見(jiàn)。
編輯:黃飛
?
評(píng)論