opencv —— inpaint 图像修补、去除指定区域物体

实现图像修补、物体去除:inpaint 函数

void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags);

  • src,输入图像,即源图像,填 Mat 类对象即可。但需是 8 位单通道或三通道图像。
  • inpaintMask,修复掩膜,为 8 位单通道图像。其中非零像素为需要修补的区域。
  • dst,输出图像,需要和源图像有相同的尺寸和类型。
  • inpaintRadius,圆形邻域半径。
  • flags,修补方法的标识符,两种选择:
标识符 说明
INPAINT_TELEA 基于 Navier-Stokes 方程的方法
INPAINT_NS Alexandru Telea 方法

代码示例:

//该程序功能为:消除鼠标选择的矩形区域内的物体
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat src, back, dst;
Point pre, now;
bool draw = false;
RNG rngs = { 12345 };
Scalar colors;
void on_mouse(int event, int x, int y, int flags, void *param) {//鼠标操作响应函数
    switch (event){
    case EVENT_LBUTTONDOWN://按下左键
        draw = true;
        pre = Point(x, y);
        break;
    case EVENT_MOUSEMOVE://鼠标移动
        if (draw) {
            Mat tem = dst.clone();
            now = Point(x, y);
            colors = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255));
            rectangle(tem, pre, now, colors);
            imshow("dst", tem);
        }
        break;
    case EVENT_LBUTTONUP://左键抬起
        draw = false;
        rectangle(back, pre, now, Scalar(255), -1);//在 修复掩膜 图像中绘制选择区域
        inpaint(dst, back, dst, 3, INPAINT_TELEA);//修复图像
        imshow("dst", dst);
        break;
    }
}
int main() {
    src = imread("C:/Users/齐明洋/Desktop/示例图片/1.jpg");
    imshow("src", src);

    namedWindow("dst");
    dst = src.clone();
    imshow("dst", dst);
    back = Mat::zeros(src.size(), CV_8UC1);//修复掩膜
    setMouseCallback("dst", on_mouse);//https://www.cnblogs.com/bjxqmy/p/11914601.html
    
    waitKey(0);
}

效果演示:

原文地址:https://www.cnblogs.com/bjxqmy/p/12372136.html