C++ OpenCV如何实现图像修复功能
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,本篇文章给大家分享的是有关C++ OpenCV如何实现图像修复功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言下面将使用OpenC
千家信息网最后更新 2024年11月14日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); } 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#include #include using namespace cv;using namespace std;/*void inpaint( InputArray src, 原图 InputArray inpaintMask, 二进制掩模,指示要修复的像素 OutputArray dst, 目标图像 double inpaintRadius, 像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊 int flags INPAINT_NS 或 INPAINT_TELEA )*/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如何实现图像修复功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
图像
像素
二进制
C++
事件
原图
指示
效果
鼠标
如图
功能
区域
图片
就是
更多
瑕疵
目标
知识
篇文章
邻域
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库硕士论文
北京恒通网络技术有限公司
威海迪尚互联网科技有限公司
搞软件开发的都是拿月薪吗
搭建微信平台服务器
web怎么发布服务器
有没有网络安全保障
联通猫主dns服务器是多少
cnrds数据库个人登录
网络技术培训方案
小学校园基站服务器
新九善互联网科技有限公司
javaweb访问数据库
svd数据库
access数据库怎么装
软件开发行业的成本有哪些
数据库表加索引
共享网络安全网络文明手抄报
广州尚通网络技术有限公司
服务器对外发包
移动网络技术是做什么的
什么叫网络安全与运维
软件开发平台公司哪家比较好
电脑云桌面签名服务器怎么删除
服务器怎么攻击
软件开发公立学校有哪几个
计算机网络技术插本专业课是什么
什么芯片做服务器好用
服务器linux多个网卡
服务器主机用什么接口