说明:图像修复可以解决类似噪声或者是镜头上的灰尘或水滴或者旧照片上面的划痕等。

文章目录

  • 1、实现图像修补:inpaint()函数
  • 2、opencv之鼠标响应函数
  • 3、示例程序

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

说明:图像修补技术由inpaint()函数实现,可以用来从扫描的照片中清除灰尘和划痕,或者从静态图像或视频去除不需要的物体

void inpaint(InputArray src,InputArray inpaintMask,OutputArray dst,double inpaintRadius,int flags)
  • 第一个参数:输入图像,即原图像

  • 第二个参数:修复掩膜,为8位的单通道图像。其中的非零像素表示需要修补的区域

  • 第三个参数:函数调用后的运算结果存在这里,和源图像有一样的尺寸和类型

  • 第四个参数:需要修补的每个点的圆形邻域,为修复算法的参考半径

  • 第五个参数:int类型的flags,修补方法标识符

2、opencv之鼠标响应函数

1)setMouseCallback()函数

void setMouseCallback(const string& winname,     //图像视窗名称MouseCallback onMouse,     //鼠标响应函数,监视到鼠标操作后调用并处理相应动作void* userdata = 0        //鼠标响应处理函数的ID,识别号
);

2)OnMouseAction()响应函数

void OnMouseAction(int event,int x,int y,int flags,void *user_data)
{// 自定义
}

3)参数 - Event

#define CV_EVENT_MOUSEMOVE 0             //滑动
#define CV_EVENT_LBUTTONDOWN 1           //左键点击
#define CV_EVENT_RBUTTONDOWN 2           //右键点击
#define CV_EVENT_MBUTTONDOWN 3           //中键点击
#define CV_EVENT_LBUTTONUP 4             //左键放开
#define CV_EVENT_RBUTTONUP 5             //右键放开
#define CV_EVENT_MBUTTONUP 6             //中键放开
#define CV_EVENT_LBUTTONDBLCLK 7         //左键双击
#define CV_EVENT_RBUTTONDBLCLK 8         //右键双击
#define CV_EVENT_MBUTTONDBLCLK 9         //中键双击

4)参数 - flags

#define CV_EVENT_FLAG_LBUTTON 1       //左鍵拖曳
#define CV_EVENT_FLAG_RBUTTON 2       //右鍵拖曳
#define CV_EVENT_FLAG_MBUTTON 4       //中鍵拖曳
#define CV_EVENT_FLAG_CTRLKEY 8       //(8~15)按Ctrl不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16     //(16~31)按Shift不放事件
#define CV_EVENT_FLAG_ALTKEY 32       //(32~39)按Alt不放事件

3、示例程序

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【修复图】"
Mat srcImage1, inpaintMask;
static void ShowHelpText();
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()
{system("color 2F");ShowHelpText();Mat srcImage = imread("E:\\Pec\\蜘蛛侠.jpg", -1);srcImage1 = srcImage.clone();inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);imshow(WINDOW_NAME1, srcImage);//设置鼠标回调消息setMouseCallback(WINDOW_NAME1, On_Mouse, 0);while (1){int c = waitKey();if ((char)c == 27)break;//按键2按下时,恢复源图if (c == '2'){inpaintMask = Scalar::all(0);srcImage.copyTo(srcImage1);imshow(WINDOW_NAME1, srcImage1);}//若检测到按键为1或者空格,则进行处理if ((char)c == '1' || (char)c == ' '){Mat inpaintedImage;inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);imshow(WINDOW_NAME2, inpaintedImage);}}return 0;
}
static void ShowHelpText()
{cout << "\n\t欢迎来到【图像修复】示例程序" << endl;cout << endl;cout << "\t\t在对图像操作之前,在【原始图】窗口进行适量绘制" << endl;cout << "\t\t按键操作如下:" << endl;cout << "\t\t\t按下按键【鼠标左键】-- 在图像绘制白条" << endl;cout << "\t\t\t按下按键【ESC】--退出程序" << endl;cout << "\t\t\t按下按键【1】 或者 【空格】--  图像修复" << endl;
}

左边是右边破环之后修复的图,可以观察到,左边修复那块有稍微的模糊,破坏程度不是很大。

不过如果我们大肆破坏,超过修复的限度,就会导致图像修复出现困难

【OpenCV】- 图像修复相关推荐

  1. opencv图像修复

    opencv图像修复 图像修复,一张利用原图,一张利用损坏位置的灰度图,进行图像修复,利用的是cv2.inpaint的函数. 原图: 滤波后的损坏位置的灰度图: 修复结果: 代码: import cv ...

  2. opencv 图像修复 inpaint()

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...

  3. OpenCV图像修复函数inpaint()

    前言 在实际应用或者是工程当中,经常需要对图像进行修复,在OpenCV中提供了能够对含有较少"污染"或者水印的图像进行修复的inpaint()函数 函数原型 void cv::in ...

  4. OpenCV——图像修复函数intpaint()使用详解

    函数原型: inpaint( src, inpaintMask,inpaintRange, flags ) 函数作用是用flags方法和inpaintMask掩膜在考虑每个点邻域圆形半径时修复图像sr ...

  5. 短视频去水印方法之-opencv进行批量图像修复

    目录 1. 新建并配置一个新的VS工程 2. 代码 3. 测试结果对比 环境:VS2019专业版(Microsoft Visual Studio Enterprise 2019) + opencv-3 ...

  6. 图像修复 图像补全_图像修复简介

    图像修复 图像补全 In practical applications, images are often corroded by noise. These noises are dust or wa ...

  7. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

  8. 使用Python,OpenCV进行去水印,图像修复

    图像修复是图像保存和图像恢复的一种形式,其历史可以追溯到1700年代,当时意大利威尼斯的公共图片修复总监彼得·爱德华兹(Pietro Edwards)应用这种科学方法来修复和保存著名作品(资料来源). ...

  9. 利用OpenCV实现图像修复(含源码链接)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前一段时间小白分享过关于图像修复技术介绍的推文(点击可以跳转),有 ...

  10. OpenCV中图像修复技术介绍与演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 现实中图像经常出现划伤或者被噪声腐蚀或 ...

最新文章

  1. 42张图详解 NAT : 换个马甲就能上网
  2. Github标星59.7k:用动画的形式呈现解LeetCode题目的思路
  3. QT学习:QPainter与QPainterPath
  4. 常用的MySQL图形化管理软件
  5. Java黑皮书课后题第7章:*7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目
  6. 艾伟也谈项目管理,我是如何带领团队开发项目的
  7. JAVA入门级教学之(异常机制的原理到底是什么)
  8. 【转载保存】lucene优秀文章整理
  9. 安卓qpythonttsspeak_当python遇到Android手机 那么,万物皆可盘
  10. 加装的硬盘进入后点不了文件夹_【装机帮扶站】第638期:空间不够,那就加加加!机械硬盘推荐~...
  11. 华为手机老是显示不到服务器,老显示连接不到服务器
  12. 查找在Git中删除文件的时间
  13. Asp.net 简单的站内搜索引擎
  14. 《51单片机C语言程序设计教程》涉及的细节问题笔记
  15. Python 批量下载SIGMOD,VLDB的论文 Mac OS
  16. python ljust()、center() 、rjust() 字符串填充左中右对齐
  17. 总体设计和数据库设计
  18. java不能安装_java环境安装之不能安装exe文件
  19. Java项目:房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp
  20. Lol的积分机制:埃罗(ELO)预算法详解

热门文章

  1. 接口中默认方法的重要作用
  2. 港科校友 | 香港科大EMBA刘礼华校友获评俄罗斯自然科学院院士
  3. 双机热备——上下层交换机负载分担
  4. 每日一练-10-求矩阵主对角线及副对角线元素的和
  5. 并发编程之循环屏障CyclicBarrier
  6. bsfl ecx,ecx
  7. 【Verilog基础】【总线协议】AHB和AHB-Lite的区别?AMBA2.0和AMBA3.0的区别?目前常见的几种AMBA协议内容?
  8. Intel® oneAPI Base Toolkit+Intel® oneAPI HPC Toolkit安装教程+环境变量设置
  9. java 如何实现多条件筛选,JAVA-日常工作解决的bug2-多选条件筛选
  10. redis学习之redis的发布和订阅