Python实现快速的风格迁移
目錄
- 一、什么是風(fēng)格遷移?
- 二、風(fēng)格遷移算法實(shí)現(xiàn)步驟
- 三、風(fēng)格遷徙算法代碼實(shí)現(xiàn)
- 四、代碼運(yùn)行流程
- 五、風(fēng)格遷徙算法效果展示與分析
- 六、思維擴(kuò)展
- 參考資料
- 注意事項(xiàng)
一、什么是風(fēng)格遷移?
??所謂的遷移比較簡單,即輸入包含兩個圖片,一張source圖片,一張target圖片,風(fēng)格遷移的目的是將source圖片上面的色彩遷移到target圖像中,從而形成一張新的圖片,它在現(xiàn)實(shí)場景中具有較多的應(yīng)用,比較經(jīng)典的應(yīng)用是手機(jī)照相機(jī)中的濾鏡。下面展示了一張樣例圖片。
二、風(fēng)格遷移算法實(shí)現(xiàn)步驟
- 步驟1-輸入source和target圖像。源圖像包含希望目標(biāo)圖像模擬的顏色空間。在上面的實(shí)例中,左側(cè)的日落圖像是源圖像,中間的圖像是目標(biāo)圖像,右側(cè)的圖像是應(yīng)用于目標(biāo)的源的顏色空間;
- 步驟2-將source圖像和target圖像轉(zhuǎn)換為LAB*顏色空間。LAB顏色空間模型的感知均勻性,其中少量的顏色值變化也應(yīng)產(chǎn)生相對相等的顏色重要性變化。LAB顏色空間在模仿人類如何解釋顏色方面比標(biāo)準(zhǔn)的RGB顏色空間做得更好,正如您將要看到的,它在顏色轉(zhuǎn)換方面具有很好的效果;
- 步驟3-將source圖像和target圖像的通道劃分開來;
- 步驟4-計(jì)算source圖像和target圖像的每個LAB*通道的平均值和標(biāo)準(zhǔn)偏差;
- 步驟5-從目標(biāo)通道中減去目標(biāo)圖像的LAB*通道的平均值;
- 步驟6-按目標(biāo)圖像的標(biāo)準(zhǔn)偏差除以源圖像的標(biāo)準(zhǔn)偏差,再乘以目標(biāo)通道的比例縮放目標(biāo)通道;
- 步驟7-加上source圖像的LAB*通道的均值;
- 步驟8-將處理后的值變換到[0,255]的范圍內(nèi);
- 步驟9-將source圖像和target圖像的通道合并起來;
- 步驟10-從LAB顏色空間變換回RGB空間。
三、風(fēng)格遷徙算法代碼實(shí)現(xiàn)
# coding=utf-8# 導(dǎo)入python包 import cv2 import argparse import numpy as npdef color_transfer(source, target):# 從RGB空間轉(zhuǎn)換到LAB空間中source = cv2.cvtColor(source, cv2.COLOR_BGR2LAB).astype("float32")target = cv2.cvtColor(target, cv2.COLOR_BGR2LAB).astype("float32")# 計(jì)算source和target圖像的統(tǒng)計(jì)信息,即均值和方差等(lMeanSrc, lStdSrc, aMeanSrc, aStdSrc, bMeanSrc, bStdSrc) = image_stats(source)(lMeanTar, lStdTar, aMeanTar, aStdTar, bMeanTar, bStdTar) = image_stats(target)# 將目標(biāo)圖像的L、a、b通道劃分開來并減去對應(yīng)的均值(l, a, b) = cv2.split(target)l -= lMeanTara -= aMeanTarb -= bMeanTar# 分別對L、a、b通道進(jìn)行標(biāo)準(zhǔn)化操作l = (lStdTar / lStdSrc) * la = (aStdTar / aStdSrc) * ab = (bStdTar / bStdSrc) * b# 加上均值l += lMeanSrca += aMeanSrcb += bMeanSrc# 將處理的結(jié)果限制在[0,255]的空間內(nèi)l = np.clip(l, 0, 255)a = np.clip(a, 0, 255)b = np.clip(b, 0, 255)# 將L、a、b通道合并起來并將其轉(zhuǎn)化回RGB顏色空間transfer = cv2.merge([l, a, b])transfer = cv2.cvtColor(transfer.astype("uint8"), cv2.COLOR_LAB2BGR)# 返回最終的變換結(jié)果return transferdef image_stats(image):# 計(jì)算每一個通道的均值和方差值(l, a, b) = cv2.split(image)(lMean, lStd) = (l.mean(), l.std())(aMean, aStd) = (a.mean(), a.std())(bMean, bStd) = (b.mean(), b.std())# 返回對應(yīng)的統(tǒng)計(jì)信息return (lMean, lStd, aMean, aStd, bMean, bStd)if __name__ == '__main__':ap = argparse.ArgumentParser()ap.add_argument("-s", "--source", required = True, help = "Path to the source image")ap.add_argument("-t", "--target", required = True, help = "Path to the target image")args = vars(ap.parse_args())source = cv2.imread(args["source"])target = cv2.imread(args["target"])taransform = color_transfer(source, target)source1 = cv2.resize(source, target.shape[0:2])target1 = cv2.resize(target, target.shape[0:2])taransform1 = cv2.resize(taransform, target.shape[0:2])result = np.hstack([source1, target1, taransform1])cv2.imwrite("transform4.png", result)cv2.imshow("transform", result)cv2.waitKey(0)四、代碼運(yùn)行流程
- 步驟1-打開一個cmd界面;
- 步驟2-cd /d xxx 切換到代碼所在的路徑,xxx表示代碼的具體路徑;
- 步驟3-python color_transform.py -s source.jpg -t target.jpg 執(zhí)行代碼,默認(rèn)會保存結(jié)果到當(dāng)前路徑中。
五、風(fēng)格遷徙算法效果展示與分析
??上圖展示了該算法的風(fēng)格遷移效果。每一行表示一個測試樣本,第1行表示的是source圖像,其主要提供色彩空間信息;第2列表示的是target圖像,其主要提供內(nèi)容;第3列表示風(fēng)格遷徙的結(jié)果,即將source的風(fēng)格遷徙到target中,形成了一幅新的圖像,這個效果其實(shí)就類似于美顏工具中的濾鏡,哈哈,看了這篇文章你也能自己開發(fā)一個自己的濾鏡庫啦。
六、思維擴(kuò)展
??該算法是思路是2001年提出的,整個算法具有速度快和效果好的優(yōu)點(diǎn),該算法具有一個缺點(diǎn),即它依賴于全局顏色統(tǒng)計(jì),因此具有相似像素強(qiáng)度值的大區(qū)域會顯著影響平均值(從而影響整體顏色傳遞)。為了很好的解決這個缺點(diǎn),我們可以從以下的兩個方面進(jìn)行改進(jìn)。
- 改進(jìn)思路1-計(jì)算源圖像在一個較小的感興趣區(qū)域(ROI)中的平均值和標(biāo)準(zhǔn)偏差,你希望模擬其顏色,而不是使用整個圖像。采用這種方法將使您的平均值和標(biāo)準(zhǔn)偏差更好地表示您想要使用的顏色空間。
- 改進(jìn)思路2-將k-均值聚類算法應(yīng)用到這兩個圖像中。你可以對LAB*顏色空間中每個圖像的像素強(qiáng)度進(jìn)行聚類,然后使用歐幾里得距離確定兩個圖像之間最相似的質(zhì)心。然后只計(jì)算每個區(qū)域內(nèi)的統(tǒng)計(jì)信息。同樣,這將使平均值和標(biāo)準(zhǔn)偏差產(chǎn)生更“局部”的影響,并有助于緩解全球統(tǒng)計(jì)數(shù)據(jù)的過度表示問題。當(dāng)然,缺點(diǎn)是這種方法明顯較慢,因?yàn)槟悻F(xiàn)在已經(jīng)添加了一個昂貴的集群步驟。
參考資料
[1] 參考鏈接
[2] 參考論文鏈接
注意事項(xiàng)
[1] 該博客是本人原創(chuàng)博客,如果您對該博客感興趣,想要轉(zhuǎn)載該博客,請與我聯(lián)系(qq郵箱:1575262785@qq.com),我會在第一時間回復(fù)大家,謝謝大家的關(guān)注.
[2] 由于個人能力有限,該博客可能存在很多的問題,希望大家能夠提出改進(jìn)意見。
[3] 如果您在閱讀本博客時遇到不理解的地方,希望您可以聯(lián)系我,我會及時的回復(fù)您,和您交流想法和意見,謝謝。
[4] 本文測試的圖片可以通過該鏈接進(jìn)行下載。網(wǎng)盤鏈接- 提取碼:vuxv。
[5] 本人業(yè)余時間承接各種本科畢設(shè)設(shè)計(jì)和各種小項(xiàng)目,包括圖像處理(數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等)、matlab仿真、python算法及仿真等,有需要的請加QQ:1575262785詳聊!!!
總結(jié)
以上是生活随笔為你收集整理的Python实现快速的风格迁移的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信猎手怎么用?微信猎手使用详细教程
- 下一篇: Python+Opencv寻找图像中最亮