C++ OpenCV如何实现图像修复功能
C++ OpenCV如何实现图像修复功能
本篇文章给大家分享的是有关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);}elseif(event==EVENT_LBUTTONDOWN){prevPt=Point(x,y);}elseif(event==EVENT_MOUSEMOVE&&(flags&EVENT_FLAG_LBUTTON)){prevPt=Point(x,y);//绘制掩模图像circle(inpaintMask,prevPt,2,Scalar::all(255),-1);//imshow("inpaintMask",inpaintMask);//图像修复Matresult;inpaint(src,inpaintMask,result,1,INPAINT_NS);//imshow("image",result);}
如图为掩模图像,接下来使用inpaint就可以对图像进行修复了。
二、源码
#include<iostream>#include<opencv2/opencv.hpp>#include<opencv2/photo.hpp>usingnamespacecv;usingnamespacestd;/*voidinpaint(InputArraysrc,原图InputArrayinpaintMask,二进制掩模,指示要修复的像素OutputArraydst,目标图像doubleinpaintRadius,像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊intflagsINPAINT_NS或INPAINT_TELEA)*/Matsrc,inpaintMask;PointprevPt(-1,-1);staticvoidonMouse(intevent,intx,inty,intflags,void*){//使用鼠标响应事件在inpaintMask绘制掩模,用于图片修复if(event==EVENT_LBUTTONUP||!(flags&EVENT_FLAG_LBUTTON)){prevPt=Point(-1,-1);}elseif(event==EVENT_LBUTTONDOWN){prevPt=Point(x,y);}elseif(event==EVENT_MOUSEMOVE&&(flags&EVENT_FLAG_LBUTTON)){prevPt=Point(x,y);//绘制掩模图像circle(inpaintMask,prevPt,2,Scalar::all(255),-1);//imshow("inpaintMask",inpaintMask);//图像修复Matresult;inpaint(src,inpaintMask,result,1,INPAINT_NS);//imshow("image",result);}}intmain(){src=imread("girl.jpg");if(src.empty()){cout<<"NoImage!"<<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");return0;}
三、效果显示
如图为使用inpaint修复的效果,可以看出基本上将瑕疵都给去掉了。
以上就是C++OpenCV如何实现图像修复功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。