学习内容:
1、图像修补
学习产出:
1、图像修补
图像的修补技术由inpaint函数实现,它可以用来从扫描的照片中清除灰尘和划痕,或者从静态图像或视屏中去除不需要的物体。
void inpaint( InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags )
1)InputArray类型的src,输入图像,填Mat类的对象即可,且需要8位单通道或者三通道图像;
2)InputArray类型的inpaintMask,修复掩膜,为8位的单通道图像。其中的非零像素表示需要修补的区域;
3)OutputArray类型的dst,函数调用后的运算结果存在这里,和源图片有一样的尺寸和类型;
4)double类型的inpaintRadius,需要修补的每个点的圆形领域,为修复算法的参考半径。
5)int类型的flags,修补方法的标识符,可以是:
INPAINT_NS: 基于Navier-Stokes方程的方法
INPATNT_TELEA: Alexandru Telea方法
————————————————
原文链接:https://blog.csdn.net/qq_27396861/article/details/87785339
#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 previousPoint(-1, -1);
static void On_Mouse(int event, int x, int y, int flags, void*);
int main(int argc, char** argv)
{
Mat srcimage = imread("resources/under.png", IMREAD_UNCHANGED);
if (!srcimage.data) { cout << "读取图片错误" << endl; return false; }
srcimage1 = srcimage.clone();
inpaintMask = Mat::zeros(srcimage1.size(), CV_8U);
imshow(window_name1, srcimage1);
setMouseCallback(window_name1, On_Mouse, 0);
while (true)
{
char c = (char)waitKey();
if (c == 27) { break; }
if (c == '2')
{
inpaintMask = Scalar::all(0);
srcimage.copyTo(srcimage1);
imshow(window_name1, srcimage1);
}
if (c == '1' || c == ' ')
{
Mat inpaintedImage;
inpaint(srcimage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
imshow(window_name2, inpaintedImage);
}
}
return 0;
}
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);
}
}