本系列博客主要分享Python在機器視覺/計算機視覺下的編程應用
cv2包是著名的視覺庫OpenCV的Python實現
圖像修復
很多時候遇到受損的圖片我們需要利用機器視覺的手段對其進行修復,opencv中提供了inpaint函數實現了這一功能。
1.先來看一個例子
- 首先讀入圖片:
import numpy as np
import cv2 as cv
img = cv.imread('src.jpg')
polluted = cv.imread('polluted.png',0)
分別是原圖和污損圖。
- 下面我們使用閾值分割來得到污損圖的掩膜:
_,mask = cv2.threshold(cv2.cvtColor(pllute,cv2.COLOR_BGR2GRAY),10,255,cv2.THRESH_BINARY_INV)
cv2.imshow('mask',mask);cv2.waitKey(1000);cv2.destroyAllWindows()
得到如下的掩膜圖;
- 最后調用函數對圖像進行修復
dst = cv.inpaint(polluted ,mask,3,cv.INPAINT_TELEA)
cv2.imshow('inpainted',dst)
cv2.imshow('src',src)
cv2.waitKey(0)
cv2.destroyAllWindows()
左圖是修復圖,右圖是原圖。
img from Animade
2.參數解析
圖像修復函數inpaint
主要參數如下:
inpaint(src, inpaintMask, inpaintRadius, flags[, dst]) -> dst
. 這是一個利用領域信息恢復圖像的函數.
.
. src 為輸入圖像
. inpaintMask 為單通道二值圖掩膜,其中非零位置為需要修復的位置
. dst 為輸出圖像,與輸入大小等同 .
. inpaintRadius 為領域大小,在修復時考慮周圍像素的范圍
. 修復方法的flag:
. - **INPAINT_NS** [Navier-Stokes based方法](https://ieeexplore.ieee.org/document/990497)
. - **INPAINT_TELEA** [Alexandru Telea方法](https://www.tandfonline.com/doi/abs/10.1080/10867651.2004.10487596)
.
3.原理實現
Navier-Stokes based方法
論文摘要:這種方法利用了經典流體動力學中的思想,將等照度線連續的從待修補區域周圍傳播到修補區域中去。主要的觀點在於將圖像強度視為了二維不可壓縮流的流函數(stream function),其中圖像強度的拉普拉斯量為流體的旋量、並將它通過矢量場定義的流函數輸運到待修補區域。最終得到的算法會通過連續照度來匹配受損區域的梯度矢量。它直接依賴於流體力學中的納維葉斯托克斯方程,具有較強的理論和數值優勢。
Fast Marching Method
這篇文章提出的是基於快速行進算法的圖像修復,其主要思想則是基於沿圖像梯度傳播平滑估計器。圖像的平滑主要來自於受損圖像領域的加權平均。同時將缺失的區域視為水平集,並用FMM(Fast Marching Method)來描述為圖像信息的傳播。
Image Prior
目前深度學習方法對於圖像修復也有了很大的進展
ref:
1.OpencvDoc:https://docs.opencv.org/3.4/df/d3d/tutorial_py_inpainting.html
2.Deeplearning:https://arxiv.org/pdf/1711.10925.pdf
3.Code:https://github.com/atiyo/deep_image_prior
4.Fast Marching:https://blog.csdn.net/seamanj/article/details/51991067