AI 圖像智能修復(fù)老照片,效果驚艷到我了!| 附代碼
近些年,基于深度學(xué)習(xí)的發(fā)展,計(jì)算機(jī)視覺(jué)在人工智能和深度學(xué)習(xí)的大背景下方興未艾,與此同時(shí),當(dāng)越來(lái)越多的應(yīng)用場(chǎng)景被挖掘出來(lái)時(shí),也意味著計(jì)算機(jī)視覺(jué)的發(fā)展前景將無(wú)比廣闊,其中圖像處理技術(shù)就是最熱門的應(yīng)用之一,而最近一段時(shí)間,圖像處理技術(shù)中最受歡迎的必須是圖像修復(fù)功能,一鍵修復(fù)老照片等App應(yīng)用,在社交網(wǎng)絡(luò)上掀起一股潮流。

圖像識(shí)別技術(shù)本身的原理并不復(fù)雜,信息的處理是這一技術(shù)的關(guān)鍵點(diǎn)所在。近年來(lái),由于深度學(xué)習(xí)的發(fā)展,大大提高了圖像識(shí)別的準(zhǔn)確率,深度學(xué)習(xí)通過(guò)大量圖像數(shù)據(jù)信息特征的積累與分析,可自動(dòng)完成特征提取和圖像匹配等任務(wù)。最近一段時(shí)間,最受歡迎的必須是圖像修復(fù)功能。
?
早在文藝復(fù)興時(shí)期,人們就開始修復(fù)一些中世紀(jì)的藝術(shù)品,其目的在于通過(guò)填補(bǔ)一些裂縫來(lái)使畫面恢復(fù)原貌,這一工作就稱之為"Inpainting"(修復(fù),潤(rùn)飾)或"Retouching"。M.Bertalmio首次提出許多圖像修復(fù)能被簡(jiǎn)化為一個(gè)數(shù)學(xué)表達(dá)式,利用計(jì)算機(jī)能自動(dòng)加以實(shí)現(xiàn)。圖像修復(fù)現(xiàn)已是計(jì)算機(jī)圖形學(xué)和計(jì)算機(jī)視覺(jué)中的一個(gè)研究熱點(diǎn),在文物保護(hù)、影視特技制作、虛擬現(xiàn)實(shí)、多余物體剔除(如視頻圖像中刪除部分人物、文字、小標(biāo)題等)等方面有著重大的應(yīng)用價(jià)值。
其中常見(jiàn)的修復(fù)方法有:
偏微分方程的方法:Bertalmio采用偏微分方程(PDE)的方法進(jìn)行圖像修復(fù),取得了較好的效果。用戶需指定需要修復(fù)的區(qū)域,算法將待修補(bǔ)的區(qū)域邊界的等值線外部的信息沿輪廓法向擴(kuò)散到中間待修補(bǔ)的象素上。該算法利用局部顏色的光滑度沿著等值線擴(kuò)散,考慮了各向異性的擴(kuò)散,以保證邊緣處的邊界連續(xù),但該方法計(jì)算不穩(wěn)定。
整體變分方法和基于曲率的擴(kuò)散模型:整體變分方法(TV,TotalVariational)采用了歐拉-拉格朗日方程和各向異性的擴(kuò)散,基于曲率的擴(kuò)散模型(CDD,Curvature-DrivenDiffusion)方法是整體變分方的一種擴(kuò)展,在擴(kuò)散過(guò)程中考慮了輪廓的幾何信息(曲率),可以處理較大的區(qū)域,但邊界處往往很模糊。
高斯卷積核對(duì)圖像進(jìn)行濾波的方法:利用了高斯卷積核對(duì)圖像進(jìn)行濾波,能快速地修復(fù)破損區(qū)域,但該算法僅考慮了破損區(qū)域邊緣一周的圖像顏色值,使得其僅適用于破損區(qū)域?yàn)?-3個(gè)象素寬度的情形。
紋理合成的方法:紋理合成的方法,能較好地去除圖像中的大塊污斑,但由于算法運(yùn)行時(shí)間不是與掩模區(qū)域成正比,而是與圖像大小成正比,因此修復(fù)時(shí)間相對(duì)較長(zhǎng)。
而今天我們就將借助Python實(shí)現(xiàn)我們的修圖效果。
實(shí)驗(yàn)前的準(zhǔn)備
首先我們使用的python版本是3.6.5。所測(cè)試的系統(tǒng)有windows10,windows7,Linux系統(tǒng)以及蘋果系統(tǒng)。從這點(diǎn)也可以看出python多平臺(tái)和多拓展性、易于遷移的優(yōu)點(diǎn)。
所使用的的python庫(kù)有cv2庫(kù),目的是用來(lái)讀取圖片,處理圖片像素值和保存圖片等;numpy用來(lái)對(duì)讀取過(guò)來(lái)的像素值矩陣進(jìn)行運(yùn)算。
修復(fù)程序處理一的搭建
1、圖像處理第一步:
首先我們所借助常用的OpenCV處理手段進(jìn)行處理圖片。首先進(jìn)行的是圖片二值化處理和創(chuàng)建結(jié)構(gòu)元素,其中詳細(xì)代碼如下:
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]))#創(chuàng)建形狀和尺寸的結(jié)構(gòu)元素kernel = np.ones((3, 3), np.uint8)
2、擴(kuò)張修復(fù)區(qū)域:
識(shí)別到修復(fù)區(qū)域并根據(jù)相鄰像素值進(jìn)行擴(kuò)張達(dá)到彌補(bǔ)像素值修復(fù)圖片的效果。cv2.inpaint()函數(shù)主要涉及兩種算法。
一種算法是從該區(qū)域的邊界開始,然后進(jìn)入?yún)^(qū)域內(nèi),逐漸填充邊界中的所有內(nèi)容。它需要在鄰近的像素周圍的一個(gè)小鄰域進(jìn)行修復(fù)。該像素由鄰居中所有已知像素的歸一化加權(quán)和代替。選擇權(quán)重是一個(gè)重要的問(wèn)題。對(duì)于靠近該點(diǎn)的那些像素,靠近邊界的法線和位于邊界輪廓上的像素,給予更多的權(quán)重。
另一種是基于流體動(dòng)力學(xué)并利用偏微分方程?;驹瓌t是heurisitic。它首先沿著已知區(qū)域的邊緣行進(jìn)到未知區(qū)域(因?yàn)檫吘壥沁B續(xù)的)。它繼續(xù)等照片(連接具有相同強(qiáng)度的點(diǎn)的線,就像輪廓連接具有相同高度的點(diǎn)一樣),同時(shí)在修復(fù)區(qū)域的邊界處匹配漸變矢量。為此,使用來(lái)自流體動(dòng)力學(xué)的一些方法。獲得顏色后,填充顏色以減少該區(qū)域的最小差異。
詳細(xì)代碼如下:
#擴(kuò)張待修復(fù)區(qū)域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()
修復(fù)程序處理二的搭建
1、圖像處理第二步:
轉(zhuǎn)換成hsv值,根據(jù)hsv值判斷圖片的前景和后景。HSV是一種將RGB色彩空間中的點(diǎn)在倒圓錐體中的表示方法。HSV即色相(Hue)、飽和度(Saturation)、明度(Value),又稱HSB(B即Brightness)。色相是色彩的基本屬性,就是平常說(shuō)的顏色的名稱,如紅色、黃色等。飽和度(S)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數(shù)值。明度(V),取0-max(計(jì)算機(jī)中HSV取值范圍和存儲(chǔ)的長(zhǎng)度有關(guān))。HSV顏色空間可以用一個(gè)圓錐空間模型來(lái)描述。圓錐的頂點(diǎn)處,V=0,H和S無(wú)定義,代表黑色。圓錐的頂面中心處V=max,S=0,H無(wú)定義,代表白色。其中主要用到的函數(shù)是cv2庫(kù)中的cv2.cvtColor()函數(shù),將RGB圖像(在opencv中設(shè)計(jì)BGR圖像)轉(zhuǎn)換為HSV圖像用到了參數(shù)cv2.COLOR_BGR2HSV。
詳細(xì)代碼如下:
import cv2import osimport numpy as npsta=0for file in os.listdir("cut_test"):sta=sta+1+ file)img = cv2.imread("cut_test/" + file)#img=cv2.imread('1.jpg')= img.shapecropped = img[0:479, 0:cols]#轉(zhuǎn)換hsvhsv=cv2.cvtColor(cropped,cv2.COLOR_BGR2HSV)# 圖片二值化處理,把[240, 240, 240]~[255, 255, 255]以外的顏色變成0thresh = 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)# 創(chuàng)建形狀和尺寸的結(jié)構(gòu)元素kernel = np.ones((3, 3), np.uint8)
2、圖像修復(fù):
在擴(kuò)張修復(fù)區(qū)域的基礎(chǔ)上外加調(diào)整像素值圖片處理。
其中腐蝕操作詳細(xì)如下:
定義了一個(gè)十字形結(jié)構(gòu)元素 其實(shí)是一個(gè)矩陣,我們知道在圖片的腐蝕過(guò)程,對(duì)圖片的每個(gè)點(diǎn),使用這個(gè)結(jié)構(gòu)掃描每一個(gè)點(diǎn),用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果都為1,結(jié)果圖像的該像素為1。否則為0,腐蝕處理的結(jié)果是使原來(lái)的二值圖像減小一圈。使用的函數(shù):cv2.erode(img,kernel);
膨脹操作詳細(xì)如下:
使用同樣的結(jié)構(gòu),對(duì)圖片的每個(gè)點(diǎn),使用這個(gè)結(jié)構(gòu)掃描每一個(gè)點(diǎn),用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果出現(xiàn)1,結(jié)果圖像的該像素為1。否則為0,腐蝕處理的結(jié)果是使原來(lái)的二值圖像擴(kuò)大一圈。使用的函數(shù):cv2.dilate(img,kernel)
詳細(xì)代碼如下:
# 擴(kuò)張待修復(fù)區(qū)域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,調(diào)整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()'''
最終效果如圖所示(右邊是修復(fù)效果):

怎么樣?這修復(fù)效果還不錯(cuò)吧?趕緊動(dòng)手練起來(lái),掌握一門千萬(wàn)修圖師技能吧!
??????
(更多精彩值得期待……)
在公眾號(hào)后臺(tái)對(duì)話框輸入以下關(guān)鍵詞
查看更多優(yōu)質(zhì)內(nèi)容!
Java?|?大數(shù)據(jù)?|?機(jī)器學(xué)習(xí)?|?算法
前端?|?英語(yǔ)?|?5G?|?區(qū)塊鏈
深度學(xué)習(xí)?|?Python?
最近熱文:
1、史上最全的Java面試題總結(jié),總共200頁(yè)!2、自從來(lái)了個(gè)實(shí)習(xí)生妹子,辦公室的畫風(fēng)就變樣了3、內(nèi)部披露!最新互聯(lián)網(wǎng)大廠的薪資和職級(jí)一覽4、最新2020年5月份編程語(yǔ)言排行榜詳情5、如何在面試中介紹自己的項(xiàng)目經(jīng)驗(yàn)?
? ??
