c++ opencv实现区域填充_帮你解锁一个新技能,opencv完美媲美PS,图片PS,我们代码实现...
很多時候,我們相中了一張圖片,怎奈圖片上面有水印,不會PS的我們該如何來處理圖片,這里小編介紹一下一下opencv的cv2.inpaint的圖片修復函數,使用此cv2.inpaint函數,可以完美匹配PS。
OpenCV提供了兩種算法。兩者都可以通過相同的函數訪問,cv2.inpaint()
圖片修復
opencv圖片修復算法
第一種算法基于Alexandru Telea于2004年發表的“基于快速行進方法的圖像修復技術”。它基于快速行進方法。考慮圖像中要修復的區域。算法從該區域的邊界開始,然后進入區域內,逐漸填充邊界中的所有內容。它需要在鄰近的像素周圍的一個小鄰域進行修復。該像素由鄰居中所有已知像素的歸一化加權和代替。選擇權重是一個重要的問題。對于靠近該點的那些像素,靠近邊界的法線和位于邊界輪廓上的像素,給予更多的權重。一旦像素被修復,它將使用快速行進方法移動到下一個最近的像素。 FMM確保首先修復已知像素附近的像素,這樣它就像手動啟發式操作一樣工作。使用標志cv2.INPAINT_TELEA啟用此算法。
第二種算法基于Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro于2001年撰寫的“Navier-Stokes,流體動力學和圖像和視頻修補”一文。該算法基于流體動力學并利用偏微分方程。基本原則是heurisitic。它首先沿著已知區域的邊緣行進到未知區域(因為邊緣是連續的)。它繼續等照片(連接具有相同強度的點的線,就像輪廓連接具有相同高度的點一樣),同時在修復區域的邊界處匹配漸變矢量。為此,使用來自流體動力學的一些方法。獲得顏色后,填充顏色以減少該區域的最小差異。使用標志cv2.INPAINT_NS啟用此算法。
PS
圖片修復代碼實現
opencv實現圖片的修復,主要使用cv2.inpaint()函數
output = cv2.inpaint(image, mask,inpaintRadius, flags=flags)
image:輸入8位1通道或3通道圖像
mask:修復掩碼,8位1通道圖像
output:輸出與image具有相同大小和類型的圖像
inpaintRadius:算法考慮的每個點的圓形鄰域的半徑
flags:
INPAINT_NS基于Navier-Stokes的方法
Alexandru Telea的INPAINT_TELEA方法
了解了cv2.inpaint的函數,就可以使用代碼來實現opencv圖片的修復了
import cv2
#flags = cv2.INPAINT_TELEA
flags = cv2.INPAINT_NS
image = cv2.imread('examples/1.png')
mask = cv2.imread('examples/mask1.png')
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
output = cv2.inpaint(image, mask,3, flags=flags)
cv2.imshow("Image", image)
cv2.imshow("mask", mask)
cv2.imshow("Output", output)
cv2.waitKey(0)
首先我們設計cv2.inpaint函數的flags,這里有2種方式,可以自行嘗試
使用cv2.imread函數來讀取原始圖片以及圖片的mask圖片
利用cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)函數把圖片BGR空間轉換為灰度圖片
然后使用cv2.inpaint函數進行圖片的修復
最后我們顯示圖片
修復的照片
總結
以上是生活随笔為你收集整理的c++ opencv实现区域填充_帮你解锁一个新技能,opencv完美媲美PS,图片PS,我们代码实现...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数返回值_Python中函
- 下一篇: a标签传值到另一个页面_前端开发入门——