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