8.6 图像修补

基本思想:
  利用已经被破坏区域的边缘,即边缘的颜色和结构,繁殖和混合到损坏的图像中,达到图像修补的目的。

8.6.1 实现图像修补:inpaint()函数

1.作用:
  用来从扫描的照片中清除灰尘和划痕,从静态图像或视频中去除不需要的物体
2.函数原型:

void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)

3.参数说明:
(1)输入图像,8位单通道或三通道
(2)修复掩模,8位单通道,其中的非零像素表示需要修补区域
(3)修补后图像
(4)需要修补的每个点的圆形区域,为修复算法的参考半径
(5)修补方法的标识符,可取值:
  1)INPAINT_NS:基于Navier-Stokes方程的方法
  2)INPAINT_TELEA:Alexandru Telea方法

8.6.2 综合示例

/*程序说明:鼠标绘制白色线条破坏原图像图像键盘按键【1】启动进行图像修复按键【2】恢复原始图像
*/#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【修复效果图】"
//全局变量
Mat g_srcImage, g_inpaintMask;
Point previousPoint(-1, -1); //原来的点坐标
//全局函数
static void on_Mouse(int event, int x, int y, int flags, void*);
static void ShowHelpText();int main()
{//显示帮助文字ShowHelpText();//载入原图并显示Mat srcImage = imread("Night.jpg");if (!srcImage.data){printf("载入原图失败~!\n");return false;}imshow(WINDOW_NAME1, srcImage);//初始化掩模g_srcImage = srcImage.clone();g_inpaintMask = Mat::zeros(g_srcImage.size(), CV_8U);//设置鼠标回调消息setMouseCallback(WINDOW_NAME1, on_Mouse, 0);//按键轮询while (1){//获取按键键值char c = (char)waitKey();//键值为ESC,程序退出if (c == 27) break;//键值为2,恢复原始图像if (c == '2'){g_inpaintMask = Scalar::all(0);srcImage.copyTo(g_srcImage);imshow(WINDOW_NAME1, g_srcImage);}//键值为1,进行图像修复if (c == '1'){Mat inpaintedImage;inpaint(g_srcImage, g_inpaintMask, inpaintedImage, 3, INPAINT_TELEA);imshow(WINDOW_NAME2, inpaintedImage);}}return 0;
}
//鼠标回调函数
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(g_inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0);line(g_srcImage, previousPoint, pt, Scalar::all(255), 5, 8, 0);previousPoint = pt;imshow(WINDOW_NAME1, g_srcImage);}
}
static void ShowHelpText()
{printf("\n\t欢迎来到【图像修复】示例程序~\n");printf("\n\t请再进行图像修复操作之前,在【原始图】窗口中进行适量的绘制\n");printf("\n\t按键操作说明:\n");printf("\t\t\t键盘按键【1】--进行图像修复\n");printf("\t\t\t键盘按键【2】--恢复原始图\n");printf("\t\t\t键盘按键【ESC】--退出程序\n");
}

运行效果:


《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补相关推荐

  1. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  2. OpenCV3编程入门 学习笔记(总)

    OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...

  3. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)

    若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...

  4. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  5. 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

    邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...

  6. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  7. Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题

    这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...

  8. Opencv3编程入门学习笔记(二)之显式创建Mat对象

    以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...

  9. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓

    第8章 图像轮廓与图像分割修复 8.1 查找并绘制轮廓 8.1.1 寻找轮廓:findContours()函数 1.作用:在二值图像中寻找轮廓 2.函数原型: void findcontours(In ...

  10. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

最新文章

  1. nginx已添加systemctl,但不能开机自启动问题
  2. 什么是T4级数据中心
  3. FileItem API详解及演示
  4. 测试 | 测试:你会这些命令吗?
  5. ASP.NET Core 中间件Diagnostics使用 异常和错误信息
  6. 【Luogu2142】【模板】高精度减法
  7. CakePHP 2.x CookBook 中文版 第七章 模型 之 数据校验
  8. ES+Redis+MySQL,这个高可用架构设计太顶了!
  9. Atitit 外出活动实名制条例sak令[2018]第920号 《外出活动实名制管理条例》     SAK安全部令 第920号 现发布《外出活动实名制管理条例》,自2018年9月1日起施行。
  10. ASsd固态测试软件数据,128G固态硬盘各项测试数据评测报告
  11. 美元符号 ($) 在 jQuery 中是什么意思?
  12. exagear安装java_exagear模拟器怎么使用 exagear模拟器使用方法安装教程
  13. 小米5.0以上设备最完美激活xposed框架的流程
  14. Request method XXX not supported
  15. Unity下计步器Pedometer算法的实现
  16. python操作xslx/xsl出现‘\xa0‘和读取时间变成float类型的处理办法
  17. C++ 打印pid和tid
  18. html桌面日历功能,jQuery简单带记事功能的日历插件
  19. Java怎么用月薪计算年薪_java计算工资
  20. 2021年中国太阳能电池(光伏电池)行业市场供需及进出口情况:太阳能电池出口均价为8.89美元/个[图]

热门文章

  1. 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
  2. 2022-2028年中国非溶聚丁苯橡胶行业市场竞争态势及发展前景分析报告
  3. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)
  4. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法
  5. 各种优化算法公式快速回忆优化器-深度学习
  6. 手把手从零开始搭建k8s集群超详细教程
  7. TVM代码生成codegen
  8. TinyML-TVM如何驯服TinyML
  9. 使用NVIDIA GRID vPC支持视频会议和算力工具
  10. 推理芯片的性能建立在优化的存储子系统设计上