OpenCV-Python教程:57.圖像修復

基礎

你們可能家里都會有一些老照片已經有黑點啊,劃痕啊等。你有想過修復它們么?我們不能簡單的在繪圖工具里把他們擦除了就完了。因為這樣只是把黑色的東西變成白色的而已,實際上沒用。在這種情況下,會用到一種技術叫圖像修復。基本的思想很簡單:用周圍的像素替換壞掉的像素,這樣看上去就和周圍一樣了。比如下面這張:

很多算法被設計來干這個,OpenCV提供了兩個,可以用同一個函數來訪問: cv2.inpaint()

第一個算法是基于論文"An Image Inpainting Technique Based on the Fast Marching Method"。是基于快速匹配方法的。假設圖像里的一個區域要修復。算法從這個區域的邊界開始,逐漸地進入區域,把邊界內的所有東西填充上。它取要修復的部分周圍的一個像素周圍的一小片鄰居。這個像素被周圍已知的像素的標準加權和替換掉。選擇權重是很重要的。要修復的點周圍像素的權重較高。和正常邊界近的,還有在邊界輪廓上的像素的權重較高。當像素被修復以后,它會通過快速匹配方法(FMM)移動到最近的像素。FMM保證那些已知像素周圍的像素首先被修復,所以這個就像人工啟發式的操作一樣。這個算法使用標志cv2.INPAINT_TELEA開啟。

第二個算法基于論文"Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting".這個算法基于流體動力學和偏微分方程。基本原則是啟發式。它首從已知區域先沿著邊緣到未知區域訪問(由于邊緣應該是連續的)。在匹配邊要修復區域邊界的梯度向量時持續畫等值線(把相同亮度的點用線連起來,類似于輪廓線)。這時候用到流體動力學。之后會填充顏色以減小最小方差。這個算法用標志cv2.INPAINT_NS啟用。

編碼

我們需要創建和輸入圖像相同大小的掩圖,需要修復的區域對應的像素要非0.剩下的就簡單了。我的圖像被一些黑色劃痕給破壞了(實際上是我自己加的)。我用繪圖工具對應的標記出來。

import numpy as np
import cv2

img = cv2.imread('messi_2.jpg')
mask = cv2.imread('mask2.png',0)

dst = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

看下面的結果。第一個圖片是輸入圖像,第二個是掩圖,第三個是用第一種算法的結果,最后一張是第二種算法的結果。

END

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容