0030-用OpenCV的inpaint函式做影象的汙點修復
阿新 • • 發佈:2018-11-16
OpenCV提供了inpaint函式做影象的汙點修復,它是基於畫素鄰域計算進行的修復,原型如下:
C++: void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)
引數意義如下:
src:需要進行修復的影象
inpaintMask:掩碼影象,和src一樣大小,非0畫素點表示為需要修復的點
dst:輸出影象
inpaintRadius:演算法使用的鄰域大小
flags:演算法選擇,有兩個值,當值為INPAINT_NS時,代表使用的是Navier-Stokes提出的修復演算法;當值為INPAINT_TELEA時,代表使用的是lexandru Telea提出的修復演算法。示例程式碼如下
程式碼中用到的影象下載連結:http://pan.baidu.com/s/1i47cbVR 密碼:rqat
//opencv版本:OpenCV3.0 //VS版本:VS2013 //Author:qxsf321.net #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgproc/types_c.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/highgui/highgui_c.h> #include <opencv2/photo/photo.hpp> #include <opencv2/photo/photo_c.h> #include <iostream> using namespace cv; using namespace std; bool g_bDrawing = false; Point g_CurrPoint, g_OrgPoint; int g_nThick = 5, g_nBlue = 255, g_nGreen = 255, g_nRed = 0; int g_nImageOneValue = 49; Mat srcImage; Mat grayImage; Mat maskImage; void onMouse(int event, int x, int y, int flag, void *param) { //onMouse函式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0030獲取 //onMouse函式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0030獲取 //onMouse函式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0030獲取 } int main() { srcImage = imread("a_zhu.jpg"); //用一個變數來儲存原影象 Mat g_srcImage; srcImage.copyTo(g_srcImage); //為掩膜圖分配空間 maskImage.create(srcImage.size(), CV_8UC1); maskImage = Scalar::all(0); namedWindow("【滑鼠事件視窗】"); setMouseCallback("【滑鼠事件視窗】", onMouse, 0); namedWindow("【線條顏色設定視窗】", 0); createTrackbar("thick", "【線條顏色設定視窗】", &g_nThick, 100, 0); createTrackbar("Blue", "【線條顏色設定視窗】", &g_nBlue, 255, 0); createTrackbar("Green", "【線條顏色設定視窗】", &g_nGreen, 255, 0); createTrackbar("Red", "【線條顏色設定視窗】", &g_nRed, 255, 0); char key; while (1) { imshow("【滑鼠事件視窗】", srcImage); key = waitKey(); if (key == 27) break; //如果檢測到鍵值是1 則恢復為原圖 if (key == '1') { g_srcImage.copyTo(srcImage); maskImage = Scalar::all(0); imshow("【滑鼠事件視窗】", srcImage); } //如果檢測到空格 則開始執行影象修復 Mat dstImage; dstImage.create(srcImage.size(), srcImage.type()); if (key == ' ') { inpaint(srcImage, maskImage, dstImage, 3, INPAINT_TELEA); imshow("【修補後的影象】", dstImage); } } return 0; }
執行結果截圖如下: