/*利用已经被破坏区域的边缘, 颜色和结构 来繁殖和混合到破损的图像中
Void inpaint(
Inputarray src,//原图 八位单通道 或者三通道 必须
Inputarray inpainMask,//修复掩膜 八位单通道图像 非零表示修补
Outputarray dst,//输出图
Double inpaintRadius,// 需要修补点的圆形邻域,修复算法参考半径
Int flags//修补方法标识符
)
标识符 说明
INPAINT_NS 基于Navier-Stokes方程方法
INPAINT_TELEA Alexandru Telea方法
*/
#include
#include
#include
#include
using namespace std;
using namespace cv;
//*********************************
// 图像修补
//*********************************
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【修补后的效果图】"
Mat srcimage1, inpaintMask;
Point previousPoint(-1, -1);
static void On_Mouse(int event, int x, int y, int flags, void *)
{
if (event == EVENT_LBUTTONUP || !(flags&EVENT_FLAG_LBUTTON))
previousPoint = Point(-1, -1);
else if (event == EVENT_LBUTTONDOWN)
previousPoint = Point(x, y);
else if (event == EVENT_MOUSEMOVE && (flags&EVENT_FLAG_LBUTTON))
{
Point pt(x, y);
if (previousPoint.x < 0)
previousPoint = pt;
line(inpaintMask,
previousPoint,
pt,
Scalar::all(255),
5,
8,
0
);
line(srcimage1,
previousPoint,
pt,
Scalar::all(255),
5,
8,
0
);
previousPoint = pt;
imshow(WINDOW_NAME1, srcimage1);
}
}
int main()
{
//载入图片,初始化掩膜和灰度
Mat srcImage = imread("C:/Users/hasee-pc/Desktop/girl.jpg",-1);
srcimage1 = srcImage.clone();
inpaintMask = Mat::zeros(srcimage1.size(), CV_8U);
imshow(WINDOW_NAME1, srcimage1);
setMouseCallback(WINDOW_NAME1, On_Mouse, 0);
while (1)
{
char c = waitKey();
if (c == 27)
break;
if (c == '2')
{
inpaintMask=Scalar::all(0);
srcImage.copySize(srcimage1);
imshow(WINDOW_NAME1, srcimage1);
}
if (c == '1' || c == ' ')
{
Mat inpaintedImage;
inpaint(srcimage1,
inpaintMask,
inpaintedImage,
3,
INPAINT_TELEA
);
imshow(WINDOW_NAME2, inpaintedImage);
}
}
waitKey(0);
}