《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补
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 图像轮廓与图像分割修复(六)图像修补相关推荐
- 原创 OpenCV3编程入门 学习笔记(总)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...
- OpenCV3编程入门 学习笔记(总)
OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...
- Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)
若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV
邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...
- 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步
文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...
- Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题
这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...
- Opencv3编程入门学习笔记(二)之显式创建Mat对象
以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...
- 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓
第8章 图像轮廓与图像分割修复 8.1 查找并绘制轮廓 8.1.1 寻找轮廓:findContours()函数 1.作用:在二值图像中寻找轮廓 2.函数原型: void findcontours(In ...
- 01.Java 编程入门学习笔记20210307
Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...
最新文章
- nginx已添加systemctl,但不能开机自启动问题
- 什么是T4级数据中心
- FileItem API详解及演示
- 测试 | 测试:你会这些命令吗?
- ASP.NET Core 中间件Diagnostics使用 异常和错误信息
- 【Luogu2142】【模板】高精度减法
- CakePHP 2.x CookBook 中文版 第七章 模型 之 数据校验
- ES+Redis+MySQL,这个高可用架构设计太顶了!
- Atitit 外出活动实名制条例sak令[2018]第920号 《外出活动实名制管理条例》 SAK安全部令 第920号 现发布《外出活动实名制管理条例》,自2018年9月1日起施行。
- ASsd固态测试软件数据,128G固态硬盘各项测试数据评测报告
- 美元符号 ($) 在 jQuery 中是什么意思?
- exagear安装java_exagear模拟器怎么使用 exagear模拟器使用方法安装教程
- 小米5.0以上设备最完美激活xposed框架的流程
- Request method XXX not supported
- Unity下计步器Pedometer算法的实现
- python操作xslx/xsl出现‘\xa0‘和读取时间变成float类型的处理办法
- C++ 打印pid和tid
- html桌面日历功能,jQuery简单带记事功能的日历插件
- Java怎么用月薪计算年薪_java计算工资
- 2021年中国太阳能电池(光伏电池)行业市场供需及进出口情况:太阳能电池出口均价为8.89美元/个[图]
热门文章
- 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
- 2022-2028年中国非溶聚丁苯橡胶行业市场竞争态势及发展前景分析报告
- HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)
- leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法
- 各种优化算法公式快速回忆优化器-深度学习
- 手把手从零开始搭建k8s集群超详细教程
- TVM代码生成codegen
- TinyML-TVM如何驯服TinyML
- 使用NVIDIA GRID vPC支持视频会议和算力工具
- 推理芯片的性能建立在优化的存储子系统设计上