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如何实现图像修复功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

发布于 2022-01-10 23:47:58
收藏
分享
海报
0 条评论
63
上一篇:springboot注解Aspect的实现方案是什么 下一篇:实现VMware虚拟机走主机代理上网的步骤是什么
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码