利用OpenCV實現(xiàn)圖像修復(fù)(含源碼鏈接)
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
前一段時間小白分享過關(guān)于圖像修復(fù)技術(shù)介紹的推文(點擊可以跳轉(zhuǎn)),有小伙伴后臺咨詢能不能分享一下關(guān)于圖像修復(fù)的項目或者程序。今天小白帶著滿滿的誠意,帶來了通過OpenCV實現(xiàn)圖像修復(fù)的C++代碼與Python代碼。
?
圖像修復(fù)技術(shù)應(yīng)用在什么地方呢?
?
想想一下,我們有一張非常棒的相片,但是由于時間比較久遠,沒有電子版留底,而紙質(zhì)版的又十分不便于保存。因此長采用掃描的方式獲得電子版。但是非常不幸,掃描過程中落入了一根頭發(fā),或者是機器出現(xiàn)故障,對相片造成了影響,這個時候就可以通過圖像修復(fù)技術(shù)解決這個問題。
?
強大的OpenCV庫里集成了兩種用與圖像修復(fù)的方法
?
INPAINT_NS: 基于Navier-Stokes的圖像修復(fù)
該方法在2001年提出,其神奇之處竟然是基于流體力學理論提出的方法。根據(jù)其作者提出,我們需要解決的問題可以抽象成在一個鞋子圖片上有一個黑色的區(qū)域,通過填充黑色區(qū)域,使得最佳的恢復(fù)鞋子的樣子。

對于如何填補這個黑色區(qū)域,可以抽象成存在一條曲線,使得由A到B將黑色區(qū)域分開,并且保證在曲線的一側(cè)是藍色,另一側(cè)是白色。這個曲線應(yīng)具有如下的約束:
保持邊緣特征
在平滑區(qū)域中保持顏色信息
通過構(gòu)建一個偏微分方程來更新具有上訴約束的區(qū)域內(nèi)的圖像強度,同時利用拉普拉斯算子估計圖像平滑度信息,并沿著等照度傳播。
?
由于這些方程與Navier-Stokes方程(流體力學中的方程,感興趣的小伙伴可以自行百度)相關(guān)且類似,因此可以通過流體力學中的方法進行求解。
由于小白對流體力學不是很了解,具體就不詳細解釋了,感興趣的小伙伴可以閱讀該論文了解詳情。
論文地址:http://www.math.ucla.edu/~bertozzi/papers/cvpr01.pdf
?
INPAINT_TELEA:基于快速行進方法的圖像修復(fù)
該方法中沒有使用拉普拉斯算子作為平滑度的估計,而是使用像素的已知圖像鄰域上的加權(quán)平均值來描述。同時利用鄰域像素和梯度恢復(fù)填充區(qū)域像素的顏色。
當像素被修復(fù)之后,通過快速行進方法更新邊界。
論文地址:
https://pdfs.semanticscholar.org/622d/5f432e515da69f8f220fb92b17c8426d0427.pdf
?
相關(guān)API介紹
C++:
void inpaint(
????Mat&src,
????Mat& inpaintMask,
????Mat& dst,
????double inpaintRadius,
????int flags)Python:
dst =cv2.inpaint(
????src,
????inpaintMask,
????inpaintRadius,
????flags)?
其中各參數(shù)的含義如下:
src?=源圖像
inpaintMask?=二進制掩碼,指示要修復(fù)的像素。
DST?=目標圖像
inpaintRadius?=像素周圍的鄰域補繪。通常,如果要修復(fù)的區(qū)域很薄,使用較小的值會產(chǎn)生較少的模糊。
flags:INPAINT_NS(基于Navier-Stokes的方法)或INPAINT_TELEA(基于快速行進的方法)
?
示例

左邊的第一個圖像是輸入圖像,第二個圖像是掩模,第三個圖像是INPAINT_TELEA的結(jié)果,最終結(jié)果是INPAINT_NS
?
關(guān)于這個圖片有一個小小的故事,1865年2月5日星期日,在華盛頓特區(qū)的加德納畫廊,亞歷山大·加德納拍攝了幾張總統(tǒng)的多鏡頭照片。在本屆會議結(jié)束之前,加德納請求為總統(tǒng)拍攝最后一個姿勢。他把相機拉得更近,拍了一張林肯頭部、肩膀和胸部的照片。但是玻璃板在這個時候突然破裂,對拍攝圖像產(chǎn)生影響。加德納小心翼翼地將它帶到了他的黑暗房間,制作一張相片,發(fā)現(xiàn)在林肯的臉上有一個不祥的裂縫。這張相片,即O-118,至今仍然存在。多年來,許多人認為這一裂縫是10周后林肯中彈的預(yù)言。
?
讓我們看一個更復(fù)雜的例子,在圖片上寫上英文單詞,之后通過opencv函數(shù)去修復(fù)該單詞。

左:帶有Scribbles的原始圖像。中:使用快速行進方法修復(fù),右:使用Navier-Stokes方法修復(fù)。
?
該程序的源碼和使用的圖片鏈接為:
https://github.com/spmallick/learnopencv/tree/master/Image-Inpainting
好消息,小白學視覺團隊的知識星球開通啦,為了感謝大家的支持與厚愛,團隊決定將價值149元的知識星球現(xiàn)時免費加入。各位小伙伴們要抓住機會哦!

交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

