您好,登錄后才能下訂單哦!
這篇文章主要介紹Python-OpenCV中的cv2.inpaint()函數(shù)怎么用,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
修復(fù)是圖像插值。數(shù)字修復(fù)算法在圖像插值,照片恢復(fù),縮放和超分辨率等方面具有廣泛的應(yīng)用。
大多數(shù)人會在家里放一些舊的退化照片,上面有一些黑點(diǎn),一些筆畫等。你有沒有想過恢復(fù)它?我們不能簡單地在繪畫工具中擦除它們,因?yàn)樗鼘⒑唵蔚赜冒咨Y(jié)構(gòu)替換黑色結(jié)構(gòu),這是沒有用的。在這些情況下,使用稱為圖像修復(fù)的技術(shù)?;舅悸泛芎唵危河绵徑南袼靥鎿Q那些壞標(biāo)記,使其看起來像是鄰居(取自維基百科),考慮下面顯示的圖像:
dst = cv2.inpaint(src,mask, inpaintRadius,flags)
參數(shù)是:
src:輸入8位1通道或3通道圖像。
inpaintMask:修復(fù)掩碼,8位1通道圖像。非零像素表示需要修復(fù)的區(qū)域。
dst:輸出與src具有相同大小和類型的圖像。
inpaintRadius:算法考慮的每個點(diǎn)的圓形鄰域的半徑。
flags:
INPAINT_NS基于Navier-Stokes的方法
Alexandru Telea的INPAINT_TELEA方法
為此目的設(shè)計(jì)了幾種算法,OpenCV提供了兩種算法。兩者都可以通過相同的函數(shù)訪問,cv2.inpaint()。
第一種算法基于Alexandru Telea于2004年發(fā)表的“基于快速行進(jìn)方法的圖像修復(fù)技術(shù)”。它基于快速行進(jìn)方法。考慮圖像中要修復(fù)的區(qū)域。算法從該區(qū)域的邊界開始,然后進(jìn)入?yún)^(qū)域內(nèi),逐漸填充邊界中的所有內(nèi)容。它需要在鄰近的像素周圍的一個小鄰域進(jìn)行修復(fù)。該像素由鄰居中所有已知像素的歸一化加權(quán)和代替。選擇權(quán)重是一個重要的問題。對于靠近該點(diǎn)的那些像素,靠近邊界的法線和位于邊界輪廓上的像素,給予更多的權(quán)重。一旦像素被修復(fù),它將使用快速行進(jìn)方法移動到下一個最近的像素。 FMM確保首先修復(fù)已知像素附近的像素,這樣它就像手動啟發(fā)式操作一樣工作。使用標(biāo)志cv2.INPAINT_TELEA啟用此算法。
第二種算法基于Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro于2001年撰寫的“Navier-Stokes,流體動力學(xué)和圖像和視頻修補(bǔ)”一文。該算法基于流體動力學(xué)并利用偏微分方程?;驹瓌t是heurisitic。它首先沿著已知區(qū)域的邊緣行進(jìn)到未知區(qū)域(因?yàn)檫吘壥沁B續(xù)的)。它繼續(xù)等照片(連接具有相同強(qiáng)度的點(diǎn)的線,就像輪廓連接具有相同高度的點(diǎn)一樣),同時在修復(fù)區(qū)域的邊界處匹配漸變矢量。為此,使用來自流體動力學(xué)的一些方法。獲得顏色后,填充顏色以減少該區(qū)域的最小差異。使用標(biāo)志cv2.INPAINT_NS啟用此算法。
我們需要創(chuàng)建一個與輸入圖像大小相同的掩碼,其中非零像素對應(yīng)于要修復(fù)的區(qū)域。其他一切都很簡單。我的圖像因一些黑色筆畫而降級(我手動添加)。我用Paint工具創(chuàng)建了相應(yīng)的筆觸,同時得到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徽標(biāo),第二個圖片是運(yùn)行FMM所需的掩碼。最后兩張照片是修補(bǔ)的結(jié)果。不確定,但我認(rèn)為兩種修補(bǔ)方法之間沒有任何區(qū)別,至少對于當(dāng)前輸入而言。
以上是“Python-OpenCV中的cv2.inpaint()函數(shù)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。