OpenCV-Python 圖像修補 | 六十

目標

在本章中,

  • 我們將學習如何通過一種稱為“修復”的方法消除舊照片中的小噪音,筆畫等。
  • 我們將看到OpenCV中的修復功能。

基礎

你們大多數人家裡都會有一些舊的舊化照片,上面有黑點,一些筆觸等。你是否曾經想過將其還原?我們不能簡單地在繪畫工具中擦除它們,因為它將簡單地用白色結構代替黑色結構,這是沒有用的。在這些情況下,將使用一種稱為圖像修復的技術。基本思想很簡單:用附近的像素替換那些不良區域,使其看起來和鄰近的協調。考慮下面顯示的圖像(摘自Wikipedia):

OpenCV-Python 圖像修補 | 六十

基於此目的設計了幾種算法,OpenCV提供了其中兩種。 兩者都可以通過相同的函數進行訪問,cv.inpaint()

第一種算法基於Alexandru Telea在2004年發表的論文“基於快速行進方法的圖像修補技術”。它基於快速行進方法。考慮圖像中要修復的區域。算法從該區域的邊界開始,並進入該區域內部,首先逐漸填充邊界中的所有內容。在要修復的鄰域上的像素周圍需要一個小的鄰域。該像素被附近所有已知像素的歸一化加權總和所代替。權重的選擇很重要。那些位於該點附近,邊界法線附近的像素和那些位於邊界輪廓線上的像素將獲得更大的權重。修復像素後,將使用快速行進方法將其移動到下一個最近的像素。FMM確保首先修復已知像素附近的那些像素,以便像手動啟發式操作一樣工作。通過使用標誌cv.INPAINT_TELEA啟用此算法。

第二種算法基於Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro在2001年發表的論文“ Navier-Stokes,流體動力學以及圖像和視頻修補”。該算法基於流體動力學並利用了 偏微分方程。基本原理是啟發式的。它首先沿著邊緣從已知區域移動到未知區域(因為邊緣是連續的)。它延續了等距線(線連接具有相同強度的點,就像輪廓線連接具有相同高程的點一樣),同時在修復區域的邊界匹配梯度矢量。為此,使用了一些流體動力學方法。獲得它們後,將填充顏色以減少該區域的最小差異。通過使用標誌

cv.INPAINT_NS啟用此算法。

代碼

我們需要創建一個與輸入圖像大小相同的掩碼,其中非零像素對應於要修復的區域。其他一切都很簡單。我的圖像因一些黑色筆畫而舊化(我手動添加了)。我使用“繪畫”工具創建了相應的筆觸。

<code>

import

numpy

as

np

import

cv2

as

cv img = cv.imread(

'messi_2.jpg'

) mask = cv.imread(

'mask2.png'

,

0

) dst = cv.inpaint(img,mask,

3

,cv.INPAINT_TELEA) cv.imshow(

'dst'

,dst) cv.waitKey(

0

) cv.destroyAllWindows()/<code>

請參閱下面的結果。第一張圖片顯示了降級的輸入。第二個圖像是掩碼。第三個圖像是第一個算法的結果,最後一個圖像是第二個算法的結果。

OpenCV-Python 圖像修補 | 六十

附加資源

  1. Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro. "Navier-stokes, fluid dynamics, and image and video inpainting." In Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on, vol. 1, pp. I-355. IEEE, 2001.
  2. Telea, Alexandru. "An image inpainting technique based on the fast marching method." Journal of graphics tools 9.1 (2004): 23-34.

練習

  1. OpenCV一個有關修復的交互式示例,samples/python/inpaint.py,請嘗試一下。
  2. 幾個月前,我觀看了有關Content-Aware Fill的視頻,Content-Aware Fill是Adobe Photoshop中使用的一種先進的修復技術。在進一步的搜索中,我發現GIMP中已經存在相同的技術,但名稱不同,為“ Resynthesizer”(你需要安裝單獨的插件)。我相信你會喜歡這項技術的。


分享到:


相關文章: