C++-图像修复-inpaint函数(Alexandru Telea方法、基于Navier-Stokes方程的方法)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++-图像修复-inpaint函数(Alexandru Telea方法、基于Navier-Stokes方程的方法),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2723字,纯文字阅读大概需要4分钟。
内容图文
![C++-图像修复-inpaint函数(Alexandru Telea方法、基于Navier-Stokes方程的方法)](/upload/InfoBanner/zyjiaocheng/590/5bdfc568aa2f4d8c9ecbb76145bbbbbd.jpg)
函数原型C++:
void inpaint( InputArray src, InputArray inpaintMask, OutputArray dst,
double inpaintRadius, int flags )
1)InputArray类型的src,输入图像,填Mat类的对象即可,且需要8位单通道或者三通道图像;
2)InputArray类型的inpaintMask,修复掩膜,为8位的单通道图像。其中的非零像素表示需要修补的区域;
3)OutputArray类型的dst,函数调用后的运算结果存在这里,和源图片有一样的尺寸和类型;
4)double类型的inpaintRadius,需要修补的每个点的圆形领域,为修复算法的参考半径。
5)int类型的flags,修补方法的标识符,可以是:
INPAINT_NS: 基于Navier-Stokes方程的方法
INPATNT_TELEA: Alexandru Telea方法
下面粘贴一下测试的核心代码:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#define WINDOW_NAME0 "【原始图参考】" //为窗口标题定义的宏
#define WINDOW_NAME1 "【原始图】" //为窗口标题定义的宏
#define WINDOW_NAME2 "【修补后的效果图】" //为窗口标题定义的宏
Mat srcImage0, srcImage1, inpaintMask;
Point previousPoint(-1, -1);//原来的点坐标
static void On_Mouse(int event, int x, int y, int flags, void*)
{
//鼠标左键弹起消息
if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
previousPoint = Point(-1, -1);
//鼠标左键按下消息
else if (event == EVENT_LBUTTONDOWN)
previousPoint = Point(x, y);
//鼠标按下并移动,进行绘制
else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{
Point pt(x, y);
if (previousPoint.x < 0)
previousPoint = pt;
//绘制白色线条
// 同时在源图和掩模图 中绘制涂鸦;
line(inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0);
line(srcImage1, previousPoint, pt, Scalar::all(255), 5, 8, 0);
previousPoint = pt;
imshow(WINDOW_NAME1, srcImage1);
}
}
int main()
{
//1、载入原图并显示,初始化掩膜和灰度图
Mat srcImage = imread("1.png", 1);
if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; }
srcImage0 = srcImage.clone();
srcImage1 = srcImage.clone();
inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);
//显示原始图参考
imshow(WINDOW_NAME0, srcImage0);
//显示原始图
imshow(WINDOW_NAME1, srcImage1);
//设置鼠标回调消息
setMouseCallback(WINDOW_NAME1, On_Mouse, 0);
//轮询按键,根据不同的按键进行处理
while (1)
{
//获取按键键值
char c = (char)waitKey();
//键值为ESC,程序退出
if (c == 27)
break;
//键值为2,恢复成原始图像
if (c == '2')
{
inpaintMask = Scalar::all(0);
srcImage.copyTo(srcImage1);
imshow(WINDOW_NAME1, srcImage1);
}
//键值为1或者空格,进行图像修补操作
if (c == '1' || c == ' ')
{
Mat inpaintedImage;
inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
imshow(WINDOW_NAME2, inpaintedImage);
}
}
waitKey(0);
return 0;
}
原始图参考:
待修复图像:
修补后的效果图:
内容总结
以上是互联网集市为您收集整理的C++-图像修复-inpaint函数(Alexandru Telea方法、基于Navier-Stokes方程的方法)全部内容,希望文章能够帮你解决C++-图像修复-inpaint函数(Alexandru Telea方法、基于Navier-Stokes方程的方法)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。