Opencv4 学习十九图像修补------2019年寒假休息在家看书

前言

将被噪声腐蚀的图像或本身受损的图像修复(Inpainting),就是图像修复技术。利用已经被破坏区域的边缘的颜色和结果,繁殖和混合到损坏的图像中,以达到图像修补的效果。

void inpaint( InputArray src,//输入图像
        InputArray inpaintMask,//修复掩模,非零区域为待修复区域
        OutputArray dst, //输出图像
        double inpaintRadius, //需要修补的每个点的圆形邻域
        int flags );//

                                                             修补方法的标识符

标识符 说明
INPAINT_NS 基于Navier-Stokes方程的方法
INPAINT_TELEA Alexandru Telea方法
#include
#include

#define WIN_FORMER "【修补前】"
#define WIN_LATER "【修补后】"

using namespace std;
using namespace cv;


Mat g_Src, g_Mask;
Point preP(-1, -1);

static void on_mouse(int event, int x, int y, int flags, void*) {

	if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
		preP = Point(-1, -1);
	else if (event == EVENT_LBUTTONDOWN)
		preP = Point(x, y);
	else if (event == EVENT_MOUSEMOVE && (flags&EVENT_FLAG_LBUTTON)) {
		Point o(x, y);
		if (preP.x < 0 || preP.y < 0)
			preP = o;

		line(g_Mask, preP, o, Scalar::all(255), 5, LINE_8);
		line(g_Src, preP, o, Scalar::all(255), 5, LINE_8);
		preP = o;
		imshow(WIN_FORMER, g_Src);
	}

}

int main() {

	Mat src = imread("E:/File/aaa.png");
	if (src.empty()) {
		cout << "cannot load image...";
		system("pause");
	}
	imshow(WIN_FORMER ,src);

	g_Src = src.clone();
	g_Mask = Mat::zeros(g_Src.size(), CV_8UC1);

	setMouseCallback(WIN_FORMER, on_mouse, 0);

	while (true) {

		char c = waitKey(0);
		if (c == 27)
			break;

		if (c == '2') {
			g_Mask = Scalar::all(0);
			g_Src = src.clone();
			imshow(WIN_FORMER, g_Src);
		}
		if (c == ' ') {
			Mat image;
			inpaint(g_Src, g_Mask, image, 3, INPAINT_TELEA);
			imshow(WIN_LATER, image);
		}

	}

	destroyAllWindows();;
}

Opencv4 学习十九图像修补------2019年寒假休息在家看书_第1张图片

参考:《Opencv3编程入门》

你可能感兴趣的:(#,Opencv4)