1. 概念
利用那些已经被破坏的区域的边缘,即边缘的颜色和结构,繁殖和混合到损坏的图像,以达到图像修补的目的。
2.图像修补:inpaint()函数
图像修补函数inpaint函数实现,它可以用来从描述的照片中清除灰尘和划痕,或者从静态图像或视频中去除不需要的物体。函数原型如下:
void inpaint(InputArray src,InputArray inpaintMask,OutputArray dst,double inpaintRadius,int flags)
- 第二个参数:inpaintMask修复掩模,为8为的单通道图像。
- 第四个参数:double 类型的inpaintRadius需要修补的每个点的圆形邻域。为修补算法的参考半径
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/photo/photo.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//定义窗口标题定义的宏
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【修补后的效果图】"
//全局变量声明
Mat srcImage1, inpaintMask;
//原来的坐标点
Point reviousPoint(-1, -1);
//on_Mouse()函数
static void on_Mouse(int event, int x, int y, int flags, void *)
{
//鼠标左键弹起的消息
if (event == EVENT_LBUTTONUP || !(flags &EVENT_FLAG_LBUTTON))
reviousPoint = Point(-1, -1);
//鼠标左键按下消息
else if (event == EVENT_LBUTTONDOWN)
reviousPoint = Point(x, y);
//鼠标按下并移动,进行绘制
else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{
Point pt(x, y);
if (reviousPoint.x < 0)
reviousPoint = pt;
line(inpaintMask, reviousPoint, pt, Scalar::all(255), 5, 8, 0);
line(srcImage1, reviousPoint, pt, Scalar::all(255), 5, 8, 0);
reviousPoint = pt;
imshow(WINDOW_NAME1, srcImage1);
}
}
//main()函数
int main()
{
//载入原始图像,并进行掩模的初始化
Mat srcImage = imread("1.jpg", 1);
if (!srcImage.data)
{
printf("读取文件错误~!\n");
return false;
}
srcImage1 = srcImage.clone();
inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);
//显示原始图
imshow(WINDOW_NAME1, srcImage1);
//设置鼠标回调函数
setMouseCallback(WINDOW_NAME1, on_Mouse, 0);
//轮询按键
while (1)
{
//获取按键
char c = (char)waitKey();
//退出
if (c == 27)
break;
//按键值为2,恢复原始图像
if (c == '2')
{
inpaintMask = Scalar::all(0);
srcImage.copyTo(srcImage1);
imshow(WINDOW_NAME1, srcImage1);
}
if (c == ' ' || c == '1')
{
Mat inpaintedImage;
inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
imshow(WINDOW_NAME2, inpaintedImage);
}
}
return 0;
}