OpenCV学习2-----使用inpaint函数进行图像修复
Posted hellowOOOrld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV学习2-----使用inpaint函数进行图像修复相关的知识,希望对你有一定的参考价值。
安装opencv时,在opencv的安装路径下,
sources\\samples\\cpp\\ 路径里面提供了好多经典的例子,很值得学习。
这次的例子是利用inpaint函数进行图像修复。
CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags );
其中
InputArray src 表示要修复的图像,
InputArray inpaintMask表示修复模板,
OutputArray dst 表示修复后的图像,
double inpaintRadius 表示修复的半径,
int flags 表示修复使用的算法 。 opencv提供了两种选择 CV_INPAINT_TELEA 和 CV_INPAINT_NS。
感觉两种算法修复效果都还不错,但是都需要事先准备修复模板mask,也就是inpaintMask 这个参数。
例子里面用鼠标在图片上划线,划线的同时也更新了mask,而真正应用的时候需要事先设计好这个mask。
文末有最终效果图。
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/photo/photo.hpp" #include <iostream> using namespace cv; using namespace std; static void help() { cout << "\\nCool inpainging demo. Inpainting repairs damage to images by floodfilling the damage \\n" << "with surrounding image areas.\\n" "Using OpenCV version %s\\n" << CV_VERSION << "\\n" "Usage:\\n" "./inpaint [image_name -- Default fruits.jpg]\\n" << endl; cout << "Hot keys: \\n" "\\tESC - quit the program\\n" "\\tr - restore the original image\\n" "\\ti or SPACE - run inpainting algorithm\\n" "\\t\\t(before running it, paint something on the image)\\n" << endl; } Mat img, inpaintMask; Point prevPt(-1, -1); static void onMouse(int event, int x, int y, int flags, void*) { 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 line(img, prevPt, pt, Scalar::all(255), 5, 8, 0); prevPt = pt; imshow("image", img); } } int main(int argc, char** argv) { char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg"; Mat img0 = imread(filename, -1); if (img0.empty()) { cout << "Couldn\'t open the image " << filename << ". Usage: inpaint <image_name>\\n" << endl; return 0; } help(); namedWindow("image", 1); img = img0.clone(); inpaintMask = Mat::zeros(img.size(), CV_8U);//mask imshow("image", img); setMouseCallback("image", onMouse, 0); for (;;) { char c = (char)waitKey(); if (c == 27) break; if (c == \'r\') { inpaintMask = Scalar::all(0); img0.copyTo(img); imshow("image", img); } if (c == \'i\' || c == \' \') { Mat inpainted; //inpaint(img, inpaintMask, inpainted, 3, CV_INPAINT_TELEA);//CV_INPAINT_NS inpaint(img, inpaintMask, inpainted, 3, CV_INPAINT_TELEA); imshow("inpainted image", inpainted); } } return 0; }
图1 原图
图2 CV_INPAINT_NS 算法修复效果图
图3 CV_INPAINT_TELEA 算法修复效果图
以上是关于OpenCV学习2-----使用inpaint函数进行图像修复的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV学习2-----使用inpaint函数进行图像修复
Python,OpenCV中的图像修复——cv2.inpaint()
两种Python基于OpenCV的固定位置半透明水印去除方案
Image inpainting based on deep learning - A review图像修复 2021 最新综述