本篇文章给大家分享的是有关C++ OpenCV如何实现图像修复功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
前言
下面将使用OpenCV C++ 对有瑕疵的图像进行修复。OpenCV 提供了inpaint API可进行图像修复。
一、OpenCV inpaint
原图如图所示。本案例的需求是希望能够将图像上的红线给消除。OpenCV 提供的inpaint API能够实现这个效果。
void inpaint(
InputArray src, 原图
InputArray inpaintMask, 二进制掩模,指示要修复的像素
OutputArray dst, 目标图像
double inpaintRadius, 像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊
int flags INPAINT_NS 或 INPAINT_TELEA
)
使用这个API最重要的就是生成一张二进制掩模图像(要修复的地方)。我们可以使用鼠标响应事件完成。
//使用鼠标响应事件在 inpaintMask 绘制掩模,用于图片修复if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON)){prevPt = Point(-1, -1);}else if (event == EVENT_LBUTTONDOWN){prevPt = Point(x, y);}else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)){prevPt = Point(x, y);//绘制掩模图像circle(inpaintMask, prevPt, 2, Scalar::all(255), -1);//imshow("inpaintMask", inpaintMask);//图像修复Mat result;inpaint(src, inpaintMask, result, 1, INPAINT_NS);//imshow("image", result);}
如图为掩模图像,接下来使用inpaint就可以对图像进行修复了。
二、源码
#include <iostream>#include<opencv2/opencv.hpp>#include<opencv2/photo.hpp>using namespace cv;using namespace std;Mat src, inpaintMask;Point prevPt(-1, -1);static void onMouse(int event, int x, int y, int flags, void*){//使用鼠标响应事件在 inpaintMask 绘制掩模,用于图片修复if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON)){prevPt = Point(-1, -1);}else if (event == EVENT_LBUTTONDOWN){prevPt = Point(x, y);}else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)){prevPt = Point(x, y);//绘制掩模图像circle(inpaintMask, prevPt, 2, Scalar::all(255), -1);//imshow("inpaintMask", inpaintMask);//图像修复Mat result;inpaint(src, inpaintMask, result, 1, INPAINT_NS);//imshow("image", result);}}int main(){src = imread("girl.jpg");if (src.empty()){cout << "No Image!" << endl;system("pause");return -1;}namedWindow("image", WINDOW_AUTOSIZE);imshow("image", src);inpaintMask = Mat::zeros(src.size(), CV_8U); //二进制掩模,指示要修复的像素setMouseCallback("image", onMouse, NULL);waitKey(0);destroyAllWindows();system("pause");return 0;}
三、效果显示
如图为使用inpaint修复的效果,可以看出基本上将瑕疵都给去掉了。
以上就是C++ OpenCV如何实现图像修复功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。