網(wǎng)絡(luò)信息時代為了注明圖片出處,大部分圖像都存在水印,去除圖片水印最常用的方法就是Photoshop,但是作為計算機視覺工程師我們可以開發(fā)在即去水印專用小工具。
在Opencv中有一個現(xiàn)成的函數(shù)inpaint
CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask,
OutputArray dst, double inpaintRadius, int flags );
根據(jù)選擇中區(qū)域的鄰域修復圖像區(qū)域
@param src 輸入灰度圖或彩色圖.
@param inpaintMask 修復區(qū)域的掩摸圖像.
@param dst 輸出圖像.
@param inpaintRadius 每一個點修復時需要考慮周圍區(qū)域的的范圍
@param flags 選用的具體修復算法.
關(guān)于采用的具體修復算法,我也查了一些資料
flag設(shè)置為INPAINT_TELEA時是一種快速區(qū)域匹配方法,從圖像區(qū)域的邊界開始逐漸進入?yún)^(qū)域,根據(jù)周圍區(qū)域的權(quán)重進行修復,為人工啟發(fā)式操作,具體方法可以參見論文"An Image Inpainting Technique Based on the Fast Marching Method"
flag設(shè)置為INPAINT_NS時采用流體動力學和偏微分方差的方法,從已知區(qū)域沿邊緣進入未知區(qū)域,使顏色最小方差最小化。具體方法可以參見論文Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting"
為了驗證方法的有效性,我找了如下圖所示的帶水印的圖像。
首先通過灰度轉(zhuǎn)化、閾值分割、膨脹等方法獲取到圖像水印區(qū)域。
然后調(diào)用opencv的修復函數(shù)即可完成圖像修復。
Mat Img = imread("Img.jpg");//讀取源圖像
Mat GrayImage, MaskImage;
cvtColor(Img, GrayImage, CV_BGR2GRAY);
threshold(GrayImage, MaskImage, 220, 255, THRESH_BINARY);//閾值分割得到水印區(qū)域
dilate(MaskImage, MaskImage, getStructuringElement(MORPH_RECT, Size(5, 5)));//水印區(qū)域膨脹
Mat PaintImg;
inpaint(Img, MaskImage, PaintImg, 20, INPAINT_NS);//去水印
imshow("原圖像", Img);
imshow("修復圖像", PaintImg);
原圖像
去水印后的圖像