Python-OpenCV中的cv2.inpaint()函數的使用
概念
修復是圖像插值。數字修復算法在圖像插值,照片恢復,縮放和超分辨率等方面具有廣泛的應用。
大多數人會在傢裡放一些舊的退化照片,上面有一些黑點,一些筆畫等。你有沒有想過恢復它?我們不能簡單地在繪畫工具中擦除它們,因為它將簡單地用白色結構替換黑色結構,這是沒有用的。在這些情況下,使用稱為圖像修復的技術。基本思路很簡單:用鄰近的像素替換那些壞標記,使其看起來像是鄰居(取自維基百科),考慮下面顯示的圖像:
庫函數
dst = cv2.inpaint(src,mask, inpaintRadius,flags)
參數是:
- src:輸入8位1通道或3通道圖像。
- inpaintMask:修復掩碼,8位1通道圖像。非零像素表示需要修復的區域。
- dst:輸出與src具有相同大小和類型的圖像。
- inpaintRadius:算法考慮的每個點的圓形鄰域的半徑。
- flags:
- INPAINT_NS基於Navier-Stokes的方法
- Alexandru Telea的INPAINT_TELEA方法
實現
為此目的設計瞭幾種算法,OpenCV提供瞭兩種算法。兩者都可以通過相同的函數訪問,cv2.inpaint()。
第一種算法基於Alexandru Telea於2004年發表的“基於快速行進方法的圖像修復技術”。它基於快速行進方法。考慮圖像中要修復的區域。算法從該區域的邊界開始,然後進入區域內,逐漸填充邊界中的所有內容。它需要在鄰近的像素周圍的一個小鄰域進行修復。該像素由鄰居中所有已知像素的歸一化加權和代替。選擇權重是一個重要的問題。對於靠近該點的那些像素,靠近邊界的法線和位於邊界輪廓上的像素,給予更多的權重。一旦像素被修復,它將使用快速行進方法移動到下一個最近的像素。 FMM確保首先修復已知像素附近的像素,這樣它就像手動啟發式操作一樣工作。使用標志cv2.INPAINT_TELEA啟用此算法。
第二種算法基於Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro於2001年撰寫的“Navier-Stokes,流體動力學和圖像和視頻修補”一文。該算法基於流體動力學並利用偏微分方程。基本原則是heurisitic。它首先沿著已知區域的邊緣行進到未知區域(因為邊緣是連續的)。它繼續等照片(連接具有相同強度的點的線,就像輪廓連接具有相同高度的點一樣),同時在修復區域的邊界處匹配漸變矢量。為此,使用來自流體動力學的一些方法。獲得顏色後,填充顏色以減少該區域的最小差異。使用標志cv2.INPAINT_NS啟用此算法。
代碼
我們需要創建一個與輸入圖像大小相同的掩碼,其中非零像素對應於要修復的區域。其他一切都很簡單。我的圖像因一些黑色筆畫而降級(我手動添加)。我用Paint工具創建瞭相應的筆觸,同時得到mask。
import numpy as np from matplotlib import pyplot as plt import cv2 img = cv2.imread('OpenCV_Logo_B.png') # input mask = cv2.imread('OpenCV_Logo_C.png',0) # mask dst_TELEA = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA) dst_NS = cv2.inpaint(img,mask,3,cv2.INPAINT_NS) plt.subplot(221), plt.imshow(img) plt.title('degraded image') plt.subplot(222), plt.imshow(mask, 'gray') plt.title('mask image') plt.subplot(223), plt.imshow(dst_TELEA) plt.title('TELEA') plt.subplot(224), plt.imshow(dst_NS) plt.title('NS') plt.tight_layout() plt.show()
這是原圖文件和掩碼文件:Pictures
輸出:
這是輸出。第一個是降級的OpenCV徽標,第二個圖片是運行FMM所需的掩碼。最後兩張照片是修補的結果。不確定,但我認為兩種修補方法之間沒有任何區別,至少對於當前輸入而言。
參考鏈接:
1、OpenCV Image Inpainting官方文檔 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_photo/py_inpainting/py_inpainting.html
2、https://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Image_reconstruction_Inpainting_Interpolation.php
到此這篇關於Python-OpenCV中的cv2.inpaint()函數的使用的文章就介紹到這瞭,更多相關OpenCV cv2.inpaint()函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android基於OpenCV實現圖像修復
- OpenCV圖像修復cv2.inpaint()的使用
- python中opencv圖像疊加、圖像融合、按位操作的具體實現
- Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的區別
- 使用python和opencv的mask實現摳圖疊加