OpenCV学习笔记(十七):图像修补:inpaint()

inpaint()函数

使用区域邻域在图像中还原选定区域。

void inpaint(
InputArray src,             // 表示要修复的图像,8位三通道或三通道
InputArray inpaintMask,     // 表示修复模板(掩模),8位单通道,非零区域为修补区域
OutputArray dst,            // 表示修复后的图像
double inpaintRadius,       // 表示该算法所考虑的需要修补的每个点的圆形邻域的圆形领域半径。
int flags                   // 表示修复使用的算法    // CV_INPAINT_TELEA  Alexandru Telea 算法 .// CV_INPAINT_NS 基于 Navier-Stokes 方程的算法
);

感觉两种算法修复效果都还不错,但是都需要事先准备修复模板mask,也就是inpaintMask 这个参数。
例子里面用鼠标在图片上划线,划线的同时也更新了mask,而真正应用的时候需要事先设计好这个mask。

示例:

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;#define WINDOW_NAME0 "【原始图参考】"        //为窗口标题定义的宏
#define WINDOW_NAME1 "【原始图】"        //为窗口标题定义的宏
#define WINDOW_NAME2 "【修补后的效果图】"        //为窗口标题定义的宏 Mat srcImage0,srcImage1, inpaintMask;
Point previousPoint(-1,-1);//原来的点坐标int main()
{//输出一些帮助信息printf("\n\n\n\t欢迎来到【图像修复】示例程序~\n");printf(  "\n\t请在进行图像修复操作之前,在【原始图】窗口中进行适量的绘制""\n\n\t按键操作说明: \n\n""\t\t【鼠标左键】-在图像上绘制白色线条\n\n""\t\t键盘按键【ESC】- 退出程序\n\n""\t\t键盘按键【1】或【SPACE】-进行图像修复操作 \n\n"   );//1、载入原图并显示,初始化掩膜和灰度图Mat srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/inpaint.jpg", 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, CV_INPAINT_TELEA);imshow(WINDOW_NAME2, inpaintedImage);}}waitKey(0);return 0;
}
static void On_Mouse( int event, int x, int y, int flags, void* )
{//鼠标左键弹起消息if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON) )previousPoint = Point(-1,-1);//鼠标左键按下消息else if( event == CV_EVENT_LBUTTONDOWN )previousPoint = Point(x,y);//鼠标按下并移动,进行绘制else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_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);}
}

结果:

CV_INPAINT_TELEA 算法:

CV_INPAINT_NS 算法:

OpenCV学习笔记(十七):图像修补:inpaint()相关推荐

  1. OpenCV学习笔记(十七)——K均值聚类

    当我们要预测的是一个离散值时,做的工作就是"分类".机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个"簇(cluster)".它的重要特点是在 ...

  2. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  3. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  4. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  5. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  6. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  7. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

  8. OpenCV学习笔记五-图像混合

    将两张图片混合 P6 图像混合 #include<iostream> #include<opencv2/opencv.hpp>using namespace std; usin ...

  9. Opencv学习笔记四——图像形态学操作

    需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...

  10. (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用

    1.腐蚀 概述:腐蚀掉图像的细节.若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除. 下面所说的"值"可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高. ...

最新文章

  1. PowerDesigner 15 进行 数据库反转到 数据库模型
  2. C# Interlocked 笔记
  3. 什么是软件测试架构师?
  4. 8个最好的Linux平台商业智能(BI)软件
  5. MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全
  6. [转]C#操作XML方法详解
  7. 1284:摘花生《信息学奥赛一本通》
  8. 怎样进行大数据的入门级学习
  9. C++基础::string
  10. Material UI 4.10 Skeleton 骨架
  11. 查看IIS哪个应用程序池占用CPU过高
  12. 多条件查找并计算机,EXCEL 多条件求和、多条件计数、多条件查找
  13. 接口(interface、implement)
  14. bitbucket 代码备份
  15. 李开复:中国创业有四大优势
  16. C语言switch语句无break
  17. 混沌系统的matlab仿真可行性,超混沌系统的电路仿真及其自适应同步
  18. django前端页面下拉选择框默认值设置
  19. APM的3DR无线数传的安装和调试
  20. 联想微型计算机怎么进入bios,联想怎么进入bios图文教程

热门文章

  1. Power Bi:DAX函数总结
  2. 自定义_如何自定义协议
  3. 一款三搭_冬日穿搭指南!照着这八条万能公式穿,让你不冻还有型_
  4. 领域应用 | 大众点评搜索基于知识图谱的深度学习排序实践
  5. 基于TextRank算法的文本摘要(附Python代码)
  6. 中文词语概念上下位图谱项目
  7. 百年诺奖的那些争议与放弃
  8. 基于位置的知识图谱链接预测
  9. spring boot 配置文件加密数据库用户名/密码
  10. 腾讯-地图:腾讯位置服务