实现图像修补、物体去除: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); }
效果演示: