0. 图片修复

opencv中给我们提供了一个用于修复图片的函数

1
2
3
4
5
6
7
void inpaint( InputArray src, InputArray inpaintMask,OutputArray dst, double inpaintRadius, int flags );

src : 表示输入的图像
inpaintMask: 掩膜,其实就是要修复哪些区域
dst : 表示修复输出的图像
inpaintRadius: 表示修复半径
flags: 表示修复时所使用的算法,有CV_INPAINT_TELEA和CV_INPAINT_NS可选,处理效果差不多

下面这里有一张我的示例图像,左边为待修复的图像,右边为修复之后的图像

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
图片修复
 */
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

Point prevPt;
Mat src,inpaintMask;

void onMouse(int event, int x, int y, int flags, void* userdata){
    if (event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON))
        prevPt = Point(-1, -1);
    else if (event == CV_EVENT_LBUTTONDOWN)
        prevPt = Point(x, y);
    else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
    {
        Point pt(x, y);
        if (prevPt.x < 0)
            prevPt = pt;
        line(inpaintMask, prevPt, pt, Scalar::all(255), 5, 8, 0);//mask

        // 使用inpaint函数进行图片修复
        inpaint(src, inpaintMask, src, 5, CV_INPAINT_TELEA);

        prevPt = pt;
        imshow("inpaint", src);
    }
}

int main(int argc,char** argv){
    string path = "/home/kaijun/Documents/resource/opencv/img/itheima_inpaint.jpg";
    src = imread(path,IMREAD_COLOR);
    // 定义窗口
    namedWindow("inpaint",WINDOW_NORMAL);
    // 定义鼠标事件
    setMouseCallback("inpaint",onMouse);
    // 显示原图
    imshow("inpaint",src);
    // 定义掩膜
    inpaintMask = Mat(src.size(),CV_8UC1);

    waitKey(0);
    return 0;
}