【編者按】近些年,基於深度學習的發展,計算機視覺在人工智能和深度學習的大背景下方興未艾,與此同時,當越來越多的應用場景被挖掘出來時,也意味著計算機視覺的發展前景將無比廣闊,其中圖像處理技術就是最熱門的應用之一,而最近一段時間,圖像處理技術中最受歡迎的必須是圖像修復功能,一鍵修復老照片等App應用,在社交網絡上掀起一股潮流。
作者 | 李秋鍵
責編 | 夕顏
出品 | CSDN(ID:CSDNnews)
圖像識別技術本身的原理並不複雜,信息的處理是這一技術的關鍵點所在。近年來,由於深度學習的發展,大大提高了圖像識別的準確率,深度學習通過大量圖像數據信息特徵的積累與分析,可自動完成特徵提取和圖像匹配等任務。最近一段時間,最受歡迎的必須是圖像修復功能。
早在文藝復興時期,人們就開始修復一些中世紀的藝術品,其目的在於通過填補一些裂縫來使畫面恢復原貌,這一工作就稱之為"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
cv2
/<code><code>import
numpy
as
np
/<code><code>path
=
"13.jpg"
/<code><code>img
=
cv2.imread(path)
/<code><code>hight,
width,
depth
=
img.shape[0:3]
/<code><code>#圖片二值化處理,把[240,
240
,
240
]~[255,
255
,
255
]以外的顏色變成0
/<code><code>thresh
=
cv2.inRange(img,
np.array([240,
240
,
240
]),
np.array([255,
255
,
255
]))
/<code><code>#創建形狀和尺寸的結構元素
/<code><code>kernel
=
np.ones((3,
3
),
np.uint8)
/<code>
2、擴張修復區域:
識別到修復區域並根據相鄰像素值進行擴張達到彌補像素值修復圖片的效果。cv2.inpaint函數主要涉及兩種算法。
一種算法是從該區域的邊界開始,然後進入區域內,逐漸填充邊界中的所有內容。它需要在鄰近的像素周圍的一個小鄰域進行修復。該像素由鄰居中所有已知像素的歸一化加權和代替。選擇權重是一個重要的問題。對於靠近該點的那些像素,靠近邊界的法線和位於邊界輪廓上的像素,給予更多的權重。
另一種是基於流體動力學並利用偏微分方程。基本原則是heurisitic。它首先沿著已知區域的邊緣行進到未知區域(因為邊緣是連續的)。它繼續等照片(連接具有相同強度的點的線,就像輪廓連接具有相同高度的點一樣),同時在修復區域的邊界處匹配漸變矢量。為此,使用來自流體動力學的一些方法。獲得顏色後,填充顏色以減少該區域的最小差異。
詳細代碼如下:
<code>#擴張待修復區域/<code><code>hi_mask = cv2.dilate(thresh, kernel, iterations=1
)/<code><code>specular = cv2.inpaint(img, hi_mask,5
, flags=cv2.INPAINT_TELEA)/<code><code>cv2.namedWindow("Image"
,0
)/<code><code>cv2.resizeWindow("Image"
,int
(width /2
),int
(hight /2
))/<code><code>cv2.imshow("Image"
, img)/<code><code>cv2.namedWindow("newImage"
,0
)/<code><code>cv2.resizeWindow("newImage"
,int
(width /2
),int
(hight /2
))/<code><code>a=cv2.imshow("newImage"
, specular)/<code><code>cv2.imwrite("43.jpg"
,specular)/<code><code>cv2.waitKey(0
)/<code><code>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
cv2/<code><code>import os/<code><code>import numpyas
np/<code><code>sta=0
/<code><code>for
filein
os.listdir("cut_test"
):/<code><code> sta=sta+1
/<code><code>"正在處理"
+"cut_test/"
+ file)/<code><code> img = cv2.imread("cut_test/"
+ file)/<code><code> /<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code><code>/<code>
2、圖像修復:
在擴張修復區域的基礎上外加調整像素值圖片處理。
其中腐蝕操作詳細如下:
定義了一個十字形結構元素 其實是一個矩陣,我們知道在圖片的腐蝕過程,對圖片的每個點,使用這個結構掃描每一個點,用結構元素與其覆蓋的二值圖像做“與”操作,如果都為1,結果圖像的該像素為1。否則為0,腐蝕處理的結果是使原來的二值圖像減小一圈。使用的函數:cv2.erode(img,kernel);
膨脹操作詳細如下:
使用同樣的結構,對圖片的每個點,使用這個結構掃描每一個點,用結構元素與其覆蓋的二值圖像做“與”操作,如果出現1,結果圖像的該像素為1。否則為0,腐蝕處理的結果是使原來的二值圖像擴大一圈。使用的函數:cv2.dilate(img,kernel)
詳細代碼如下:
<code># 擴張待修復區域/<code><code> hi_mask = cv2.dilate(dilate, kernel, iterations=1
)/<code><code> specular = cv2.inpaint(cropped, hi_mask, -5
, flags=cv2.INPAINT_NS)/<code><code> #合併/<code><code> htich = np.vstack((specular, img[479
:rows,0
:cols]))/<code><code>'''
/<code><code> blue=/<code><code> #獲取mask,調整lower中h控制顏色/<code><code> lower_blue=np.array([90
,10
,125
])/<code><code> upper_blue=np.array([135
,180
,255
])/<code><code> mask = cv2.inRange(hsv, lower_blue, upper_blue)/<code><code> erode=cv2.erode(mask,None
,iterations=1
)/<code><code> dilate=cv2.dilate(erode,None
,iterations=1
)/<code><code> #腐蝕膨脹/<code><code> erode=cv2.erode(mask,None
,iterations=1
)/<code><code> cv2.imshow('erode
',erode)/<code><code> dilate=cv2.dilate(erode,None
,iterations=1
)/<code><code> cv2.imshow('dilate
',dilate)/<code><code>for
iin
range(rows):/<code><code>for
jin
range(cols):/<code><code>if
dilate[i,j]==255
:/<code><code> blue.append([i,j])/<code><code>for
win
blue:/<code><code> x=w[0
]/<code><code> y=w[1
]/<code><code> img[x,y]=[255
,255
,255
]/<code><code>'''
/<code><code> cv2.imwrite("dels_test/"
+str
(sta) +".jpg"
, htich)/<code><code>'''
/<code><code> cv2.imshow('Mask
', img)/<code><code> cv2.waitKey(0
)/<code><code> cv2.destroyAllWindows/<code><code>'''
/<code>
最終效果如圖所示(右邊是修復效果):
怎麼樣?這修復效果還不錯吧?趕緊動手練起來,掌握一門千萬修圖師技能吧!
作者簡介
李秋鍵,CSDN 博客專家,CSDN達人課作者。碩士在讀於中國礦業大學,開發有taptap安卓武俠遊戲一部,vip視頻解析,文意轉換工具,寫作機器人等項目,發表論文若干,多次高數競賽獲獎等等。
☞當互聯網碼農遇見國企老同學
☞一個月面試近 20 家,拿下阿里 Offer!
☞華為海思超越高通,一季度國內佔有率第一;蘋果 iOS 13.5 優化 Face ID;Ruby 2.4 結束支持 | 極客頭條
☞AI圖像智能修復老照片,效果驚豔到我了
☞程序員內功修煉系列:10 張圖解談 Linux 物理內存和虛擬內存
☞當 DeFi 遇上 Rollup,將擦出怎樣的火花?