AI 圖像智能修復老照片,效果驚豔到我了(附代碼)

AI 圖像智能修復老照片,效果驚豔到我了(附代碼)

本文約2957字,建議閱讀9分鐘

本文介紹基於深度學習的發展,計算機視覺在人工智能和深度學習的大背景下方興未艾,其中圖像處理技術就是最熱門的應用之一。最近一段時間,圖像處理技術中最受歡迎的必須是圖像修復功能,一鍵修復老照片等App應用,在社交網絡上掀起一股潮流。

圖像識別技術本身的原理並不複雜,信息的處理是這一技術的關鍵點所在。近年來,由於深度學習的發展,大大提高了圖像識別的準確率,深度學習通過大量圖像數據信息特徵的積累與分析,可自動完成特徵提取和圖像匹配等任務。最近一段時間,最受歡迎的必須是圖像修復功能。

早在文藝復興時期,人們就開始修復一些中世紀的藝術品,其目的在於通過填補一些裂縫來使畫面恢復原貌,這一工作就稱之為"Inpainting"(修復,潤飾)或"Retouching"。M.Bertalmio首次提出許多圖像修復能被簡化為一個數學表達式,利用計算機能自動加以實現。圖像修復現已是計算機圖形學和計算機視覺中的一個研究熱點,在文物保護、影視特技製作、虛擬現實、多餘物體剔除(如視頻圖像中刪除部分人物、文字、小標題等)等方面有著重大的應用價值。

其中常見的修復方法有:

  • 偏微分方程的方法:Bertalmio採用偏微分方程(PDE)的方法進行圖像修復,取得了較好的效果。用戶需指定需要修復的區域,算法將待修補的區域邊界的等值線外部的信息沿輪廓法向擴散到中間待修補的象素上。該算法利用局部顏色的光滑度沿著等值線擴散,考慮了各向異性的擴散,以保證邊緣處的邊界連續,但該方法計算不穩定。
  • 整體變分方法和基於曲率的擴散模型:整體變分方法(TV,TotalVariational)採用了歐拉-拉格朗日方程和各向異性的擴散,基於曲率的擴散模型(CDD,Curvature-DrivenDiffusion)方法是整體變分方的一種擴展,在擴散過程中考慮了輪廓的幾何信息(曲率),可以處理較大的區域,但邊界處往往很模糊。
  • 高斯卷積核對圖像進行濾波的方法:利用了高斯卷積核對圖像進行濾波,能快速地修復破損區域,但該算法僅考慮了破損區域邊緣一週的圖像顏色值,使得其僅適用於破損區域為2-3個象素寬度的情形。
  • 紋理合成的方法:紋理合成的方法,能較好地去除圖像中的大塊汙斑,但由於算法運行時間不是與掩模區域成正比,而是與圖像大小成正比,因此修復時間相對較長。

而今天我們就將藉助Python實現我們的修圖效果

實驗前的準備

首先我們使用的python版本是3.6.5。所測試的系統有windows10,windows7,Linux系統以及蘋果系統。從這點也可以看出python多平臺和多拓展性、易於遷移的優點。

所使用的的python庫有cv2庫,目的是用來讀取圖片,處理圖片像素值和保存圖片等;numpy用來對讀取過來的像素值矩陣進行運算。

修復程序處理一的搭建

1、圖像處理第一步:

首先我們所藉助常用的OpenCV處理手段進行處理圖片。首先進行的是圖片二值化處理和創建結構元素,其中詳細代碼如下:

<code>import cv2import numpy as nppath = "13.jpg"img = cv2.imread(path)hight, width, depth = img.shape[0:3]#圖片二值化處理,把[240, 240, 240]~[255, 255, 255]以外的顏色變成0thresh = cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255]))#創建形狀和尺寸的結構元素kernel = np.ones((3, 3), np.uint8)/<code>

2、擴張修復區域:

識別到修復區域並根據相鄰像素值進行擴張達到彌補像素值修復圖片的效果。cv2.inpaint()函數主要涉及兩種算法。

一種算法是從該區域的邊界開始,然後進入區域內,逐漸填充邊界中的所有內容。它需要在鄰近的像素周圍的一個小鄰域進行修復。該像素由鄰居中所有已知像素的歸一化加權和代替。選擇權重是一個重要的問題。對於靠近該點的那些像素,靠近邊界的法線和位於邊界輪廓上的像素,給予更多的權重。

另一種是基於流體動力學並利用偏微分方程。基本原則是heurisitic。它首先沿著已知區域的邊緣行進到未知區域(因為邊緣是連續的)。它繼續等照片(連接具有相同強度的點的線,就像輪廓連接具有相同高度的點一樣),同時在修復區域的邊界處匹配漸變矢量。為此,使用來自流體動力學的一些方法。獲得顏色後,填充顏色以減少該區域的最小差異。

詳細代碼如下:

<code>#擴張待修復區域hi_mask = cv2.dilate(thresh, kernel, iterations=1)specular = cv2.inpaint(img, hi_mask, 5, flags=cv2.INPAINT_TELEA)cv2.namedWindow("Image", 0)cv2.resizeWindow("Image", int(width / 2), int(hight / 2))cv2.imshow("Image", img)cv2.namedWindow("newImage", 0)cv2.resizeWindow("newImage", int(width / 2), int(hight / 2))a=cv2.imshow("newImage", specular)cv2.imwrite("43.jpg",specular)cv2.waitKey(0)cv2.destroyAllWindows()/<code>

修復程序處理二的搭建

1、圖像處理第二步:

轉換成hsv值,根據hsv值判斷圖片的前景和後景。HSV是一種將RGB色彩空間中的點在倒圓錐體中的表示方法。HSV即色相(Hue)、飽和度(Saturation)、明度(Value),又稱HSB(B即Brightness)。色相是色彩的基本屬性,就是平常說的顏色的名稱,如紅色、黃色等。飽和度(S)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數值。明度(V),取0-max(計算機中HSV取值範圍和存儲的長度有關)。HSV顏色空間可以用一個圓錐空間模型來描述。圓錐的頂點處,V=0,H和S無定義,代表黑色。圓錐的頂面中心處V=max,S=0,H無定義,代表白色。其中主要用到的函數是cv2庫中的cv2.cvtColor()函數,將RGB圖像(在opencv中設計BGR圖像)轉換為HSV圖像用到了參數cv2.COLOR_BGR2HSV。

詳細代碼如下:

<code>import cv2import osimport numpy as npsta=0for file in os.listdir("cut_test"):    sta=sta+1    print("正在處理"+"cut_test/" + file)    img = cv2.imread("cut_test/" + file)    #img=cv2.imread('1.jpg')    rows,cols,channels = img.shape    cropped = img[0:479, 0:cols]    #轉換hsv    hsv=cv2.cvtColor(cropped,cv2.COLOR_BGR2HSV)    # 圖片二值化處理,把[240, 240, 240]~[255, 255, 255]以外的顏色變成0    thresh = cv2.inRange(hsv, np.array([90,10,125]), np.array([135,180,255]))    erode = cv2.erode(thresh, None, iterations=2)    dilate = cv2.dilate(erode, None, iterations=0)    # 創建形狀和尺寸的結構元素    kernel = np.ones((3, 3), np.uint8)/<code>

2、圖像修復:

在擴張修復區域的基礎上外加調整像素值圖片處理。

其中腐蝕操作詳細如下:

定義了一個十字形結構元素 其實是一個矩陣,我們知道在圖片的腐蝕過程,對圖片的每個點,使用這個結構掃描每一個點,用結構元素與其覆蓋的二值圖像做“與”操作,如果都為1,結果圖像的該像素為1。否則為0,腐蝕處理的結果是使原來的二值圖像減小一圈。使用的函數:cv2.erode(img,kernel);

膨脹操作詳細如下:

使用同樣的結構,對圖片的每個點,使用這個結構掃描每一個點,用結構元素與其覆蓋的二值圖像做“與”操作,如果出現1,結果圖像的該像素為1。否則為0,腐蝕處理的結果是使原來的二值圖像擴大一圈。使用的函數:cv2.dilate(img,kernel)

詳細代碼如下:

<code># 擴張待修復區域    hi_mask = cv2.dilate(dilate, kernel, iterations=1)    specular = cv2.inpaint(cropped, hi_mask, -5, flags=cv2.INPAINT_NS)    #合併    htich = np.vstack((specular, img[479:rows, 0:cols]))    '''    blue=[]    #獲取mask,調整lower中h控制顏色    lower_blue=np.array([90,10,125])    upper_blue=np.array([135,180,255])    mask = cv2.inRange(hsv, lower_blue, upper_blue)    erode=cv2.erode(mask,None,iterations=1)    dilate=cv2.dilate(erode,None,iterations=1)    #腐蝕膨脹    erode=cv2.erode(mask,None,iterations=1)    cv2.imshow('erode',erode)    dilate=cv2.dilate(erode,None,iterations=1)    cv2.imshow('dilate',dilate)    for i in range(rows):        for j in range(cols):            if dilate[i,j]==255:                blue.append([i,j])    for w in blue:        x=w[0]        y=w[1]        img[x,y]=[255,255,255]    '''    cv2.imwrite("dels_test/" + str(sta) + ".jpg", htich)'''    cv2.imshow('Mask', img)    cv2.waitKey(0)    cv2.destroyAllWindows()'''/<code>

最終效果如圖所示(右邊是修復效果):

AI 圖像智能修復老照片,效果驚豔到我了(附代碼)

怎麼樣?這修復效果還不錯吧?趕緊動手練起來,掌握一門千萬修圖師技能吧!

—完—

想要獲得更多數據科學領域相關動態,誠邀關注清華-青島數據科學研究院官方微信公眾平臺“ 數據派THU ”。


分享到:


相關文章: