您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何利用OpenCV實現圖像修復”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何利用OpenCV實現圖像修復”吧!
圖像修復技術應用在什么地方呢?
想想一下,我們有一張非常棒的相片,但是由于時間比較久遠,沒有電子版留底,而紙質版的又十分不便于保存。因此長采用掃描的方式獲得電子版。但是非常不幸,掃描過程中落入了一根頭發,或者是機器出現故障,對相片造成了影響,這個時候就可以通過圖像修復技術解決這個問題。
強大的OpenCV庫里集成了兩種用與圖像修復的方法
INPAINT_NS: 基于Navier-Stokes的圖像修復
該方法在2001年提出,其神奇之處竟然是基于流體力學理論提出的方法。根據其作者提出,我們需要解決的問題可以抽象成在一個鞋子圖片上有一個黑色的區域,通過填充黑色區域,使得最佳的恢復鞋子的樣子。
對于如何填補這個黑色區域,可以抽象成存在一條曲線,使得由A到B將黑色區域分開,并且保證在曲線的一側是藍色,另一側是白色。這個曲線應具有如下的約束:
保持邊緣特征
在平滑區域中保持顏色信息
通過構建一個偏微分方程來更新具有上訴約束的區域內的圖像強度,同時利用拉普拉斯算子估計圖像平滑度信息,并沿著等照度傳播。
由于這些方程與Navier-Stokes方程(流體力學中的方程,感興趣的小伙伴可以自行百度)相關且類似,因此可以通過流體力學中的方法進行求解。
由于小白對流體力學不是很了解,具體就不詳細解釋了,感興趣的小伙伴可以閱讀該論文了解詳情。
論文地址:http://www.math.ucla.edu/~bertozzi/papers/cvpr01.pdf
INPAINT_TELEA:基于快速行進方法的圖像修復
該方法中沒有使用拉普拉斯算子作為平滑度的估計,而是使用像素的已知圖像鄰域上的加權平均值來描述。同時利用鄰域像素和梯度恢復填充區域像素的顏色。
當像素被修復之后,通過快速行進方法更新邊界。
論文地址:
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 =像素周圍的鄰域補繪。通常,如果要修復的區域很薄,使用較小的值會產生較少的模糊。
flags: INPAINT_NS(基于Navier-Stokes的方法)或INPAINT_TELEA(基于快速行進的方法)
示例
左邊的第一個圖像是輸入圖像,第二個圖像是掩模,第三個圖像是INPAINT_TELEA的結果,最終結果是INPAINT_NS
關于這個圖片有一個小小的故事,1865年2月5日星期日,在華盛頓特區的加德納畫廊,亞歷山大·加德納拍攝了幾張總統的多鏡頭照片。在本屆會議結束之前,加德納請求為總統拍攝最后一個姿勢。他把相機拉得更近,拍了一張林肯頭部、肩膀和胸部的照片。但是玻璃板在這個時候突然破裂,對拍攝圖像產生影響。加德納小心翼翼地將它帶到了他的黑暗房間,制作一張相片,發現在林肯的臉上有一個不祥的裂縫。這張相片,即O-118,至今仍然存在。多年來,許多人認為這一裂縫是10周后林肯中彈的預言。
讓我們看一個更復雜的例子,在圖片上寫上英文單詞,之后通過opencv函數去修復該單詞。
左:帶有Scribbles的原始圖像。中:使用快速行進方法修復,右:使用Navier-Stokes方法修復。
該程序的源碼和使用的圖片鏈接為:
https://github.com/spmallick/learnopencv/tree/master/Image-Inpainting
感謝各位的閱讀,以上就是“如何利用OpenCV實現圖像修復”的內容了,經過本文的學習后,相信大家對如何利用OpenCV實現圖像修復這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。