使用Python,OpenCV进行去水印,图像修复
圖像修復(fù)是圖像保存和圖像恢復(fù)的一種形式,其歷史可以追溯到1700年代,當(dāng)時(shí)意大利威尼斯的公共圖片修復(fù)總監(jiān)彼得·愛德華茲(Pietro Edwards)應(yīng)用這種科學(xué)方法來修復(fù)和保存著名作品(資料來源)。
圖像修復(fù)技術(shù)顯著提高了圖像繪畫的質(zhì)量,使我們能夠:
- 恢復(fù)舊的,降級的照片
- 修復(fù)因損壞和老化而缺少區(qū)域的照片
- 遮罩并從圖像中刪除特定對象(并以美觀的方式進(jìn)行)
今天,我們將研究OpenCV開箱即用提供的兩種圖像修復(fù)算法。 要了解如何使用OpenCV和Python執(zhí)行圖像修復(fù),請繼續(xù)閱讀!
1. Python,OpenCV內(nèi)置的修復(fù)算法
- cv2.INPAINT_TELEA:基于快速行進(jìn)方法的圖像修復(fù)技術(shù)(Telea,2004年)
- cv2.INPAINT_NS:Navier-stokes,流體動(dòng)力學(xué)以及圖像和視頻修復(fù)(Bertalmío等,2001)
倆種修復(fù)算法簡述:引自openCV 文檔:
cv2.INPAINT_TELEA 簡稱Telea,基于快速行進(jìn)方法(Fast Marching Method,簡稱FMM)考慮圖像中要修復(fù)的區(qū)域。算法從該區(qū)域的邊界開始,并進(jìn)入該區(qū)域內(nèi)部,然后逐漸填充邊界中的所有內(nèi)容。在要修復(fù)的鄰域上的像素周圍需要一個(gè)小的鄰域。用附近所有已知像素的歸一化加權(quán)總和替換該像素。權(quán)重的選擇很重要。那些位于該點(diǎn)附近,邊界法線附近的像素和那些位于邊界輪廓線上的像素將獲得更大的權(quán)重。修復(fù)像素后,將使用快速行進(jìn)方法將其移動(dòng)到下一個(gè)最近的像素。
FMM確保首先修復(fù)已知像素附近的那些像素,以便像手動(dòng)啟發(fā)式操作一樣工作。
cv2.INPAINT_NS: 基于流體動(dòng)力學(xué)(fluid dynamics)并利用偏微分方程(partial differential equations)?;驹硎菃l(fā)式的。它首先沿著邊緣從已知區(qū)域移動(dòng)到未知區(qū)域(因?yàn)檫吘壥沁B續(xù)的)。它延續(xù)了等距線(isophotes)(線條連接具有相同強(qiáng)度的點(diǎn),就像輪廓線連接具有相同高程的點(diǎn)一樣),同時(shí)在修復(fù)區(qū)域的邊界匹配梯度矢量(gradient vectors)。為此使用了一些流體動(dòng)力學(xué)方法。獲得它們后,將填充顏色以減少該區(qū)域的最小差異。
- 在使用OpenCV應(yīng)用修復(fù)時(shí),我們需要提供兩個(gè)圖像,
output = cv2.inpaint(image, mask, radius,flags) 返回是修復(fù)后的圖像 - image:我們希望修復(fù)和恢復(fù)的輸入圖像。該圖像以某種方式被“損壞”,我們需要應(yīng)用修復(fù)算法對其進(jìn)行修復(fù)。
- maks:遮罩圖像,高亮出了圖像中被損壞的區(qū)域。該圖像應(yīng)具有與輸入圖像相同的空間尺寸(寬度和高度)。非零像素對應(yīng)于應(yīng)該修復(fù)(即固定)的區(qū)域,而零像素被認(rèn)為是“正?!辈⑶也恍枰迯?fù);
- radius:修復(fù)半徑以像素為單位(算法考慮的每個(gè)修補(bǔ)點(diǎn)的圓形鄰域)
- flags:修復(fù)的算法(cv2.INPAINT_TELEA or cv2.INPAINT_NS)
手動(dòng)干預(yù)是使用OpenCV內(nèi)置的修復(fù)算法的主要限制之一。每次都需要我們提供與原圖寬高一致且突出顯示被毀壞區(qū)域的mask圖。每次手動(dòng)去構(gòu)建mask是一個(gè)乏味而冗繁的過程,可以利用機(jī)器學(xué)習(xí)訓(xùn)練全卷積模型等去“學(xué)習(xí)以修復(fù)”,來解決這個(gè)問題。
2. python內(nèi)置算法修復(fù)效果對比
1. 使用FMM方法得到的mask,原圖,輸出的修復(fù)圖像
應(yīng)用快速前進(jìn)方法??梢钥吹轿谋疽殉晒h除,但是您可以看到許多圖像偽像,尤其是在高紋理區(qū)域,例如混凝土人行道和皮帶。
2. 使用Navier Stokes修復(fù)
左側(cè)原圖,中間mask蒙版,右側(cè)顯示了Navier-Stokes修復(fù)方法的輸出。通過使用這種OpenCV修復(fù)方法,我們已經(jīng)能夠部分修復(fù)損壞的舊照片。
3. 最后一個(gè)示例
左邊是原始圖像,中間是相應(yīng)的蒙版。 可以看到mask蒙版有兩個(gè)區(qū)域,我們將嘗試“修復(fù)”:右下角的水印,圓形區(qū)域?qū)?yīng)于其中一棵樹。
在此示例中,我們將OpenCV修復(fù)視為一種從圖像中刪除對象的方法,其結(jié)果可以在底部看到。不幸的是,結(jié)果并不如我們期望的那樣好。我們希望刪除的樹顯示為圓形模糊,而水印也模糊。
3. 怎么提升水印修復(fù)的效果
OpenCV內(nèi)置的修復(fù)算法的最大問題之一是它們需要人工干預(yù),這意味著我們必須手動(dòng)提供希望修復(fù)和恢復(fù)的遮罩區(qū)域。
手動(dòng)提供口罩很繁瑣-有沒有更好的方法? 其實(shí)有。
使用基于深度學(xué)習(xí)的方法,包括全卷積神經(jīng)網(wǎng)絡(luò)和生成對抗網(wǎng)絡(luò)(GANs),我們可以“學(xué)習(xí)修補(bǔ)”。 這些網(wǎng)絡(luò):
- 要求零人工干預(yù)
- 可以生成自己的訓(xùn)練數(shù)據(jù)
- 產(chǎn)生比傳統(tǒng)計(jì)算機(jī)視覺修復(fù)算法更美觀的結(jié)果
基于深度學(xué)習(xí)的修復(fù)算法不在本教程的范圍內(nèi),但將在以后的博客文章中介紹。
參考:
- https://www.pyimagesearch.com/2020/05/18/image-inpainting-with-opencv-and-python/
總結(jié)
以上是生活随笔為你收集整理的使用Python,OpenCV进行去水印,图像修复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 他来了,请闭眼电视剧百度云资源1080P
- 下一篇: 使用Python,OpenCV和Houg