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

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

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

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

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

