【OpenCV】- 图像修复

article/2025/10/15 16:45:28

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

文章目录

        • 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;
}

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

在这里插入图片描述

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

在这里插入图片描述


http://chatgpt.dhexx.cn/article/o4pjkxbG.shtml

相关文章

图像修复(Image Restoration)算法数据集详细介绍

目录 人脸数据集 1.Helen Face 2.CelebA (Celebrity Attribute) 3.CelebA-HQ 4.FFHQ&#xff08;Flickr-Faces-HQ&#xff09; 场景数据集 1.MS COCO (Common Objects in Context) 2.ImageNet 3.Places2 街景数据集 1.Paris StreetView 2.Cityscapes 纹理数据集 …

图像修复 : ICCV 2021 基于条件纹理和结构并行生成的图像修复【翻译】

声明&#xff1a;精简翻译&#xff0c;未完全校对 积压的存稿、好久没更文了、先发一篇这个代码很不错、推荐有兴趣的同学学习博主也写了对应的测评文章待发、点赞越多、发的越快如有同学&#xff0c;学有余力、可以转载这个文章&#xff08; 附原文地址即可 &#xff09;、校对…

Linux udhcpc/udhcpd 移植

参考文档&#xff1a; http://blog.chinaunix.net/uid-14704264-id-4272838.html https://www.cnblogs.com/chenfulin5/p/9481249.html 若系统busybox 自带了 udhcpc 和 udhcpd 工具 udhcpc 作为客户端工具&#xff0c;用于动态获取IP&#xff1b; udhcpd 作为服务器工具&…

udhcpc6的default.script

udhcpc6使用中遇到的问题 和udhcpc一样&#xff0c;udhcpc6是busybox中的一个工具&#xff0c;主要用来提供dhcpv6客户端服务。 在使用过程中遇到了一个问题&#xff0c;直接执行udhcpc6 -i eth0&#xff0c;可以看到打印信息中显示正在发送discover包&#xff0c;如果本地有…

UNIX source code-DHCP

文章目录 DHCP基础知识什么是DHCP为什么要使用DHCP IP地址分配机制工作原理报文类型基本步骤中继重用IP租赁期限 代码解析文件作用udhcpd.c结构体代码逻辑&#xff08;流程&#xff09; udhcpc.c结构体代码逻辑&#xff08;流程&#xff09; file.c结构体&#xff08;read_conf…

udhcpc 移植和使用

问题描述&#xff1a; busybox udhcpc获取IP&#xff0c;但没有自动将获取到的ip设置到网卡上&#xff0c;并且没有自动设置网关&#xff0c;路由表等。必须手动设置才能连接外网。 解决方案&#xff1a; udhcpc可以通过-s参数指定运行脚本&#xff0c;当获取到ip地址后&…

初始化ArrayList、List的两种方法

说明&#xff1a; 个人偏向第二种方法&#xff0c;适合没有服务器数据的情况下&#xff0c;做个简单的list来开发 方式一&#xff1a; ArrayList<String> list new ArrayList<String>();String str01 String("str01");String str02 String("str0…

Java 中初始化 List 集合的 6 种方式!

List 是 Java 开发中经常会使用的集合&#xff0c;你们知道有哪些方式可以初始化一个 List 吗&#xff1f;这其中不缺乏一些坑&#xff0c;今天栈长我给大家一一普及一下。 1、常规方式 List<String> languages new ArrayList<>(); languages.add("Java&qu…

java创建List时候 初始化赋值

在这之前 可能有的读者&#xff0c; 只知道数组初始化 时候的赋值。 String[] strings new String[]{"one","two","three"};当创建list时候&#xff0c;也许 你还会写过以下代码 正确的写法 List<String> list new ArrayList<>(…

初始化列表

前言 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; }; 虽然上述构造函数调…

Java 初始化 List 的几种方法

最常见的初始化 List 方法为&#xff1a; List<String> languages new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println(languages);但是实际上&#xff0c;我们并不会…

LIST集合初始化及常见方法

目录 1.ArrayList集合的初始化&#xff1a; 2.常用的List集合方法&#xff1a; 1.添加元素方法 2.查看&#xff08;遍历元素&#xff09;&#xff1a; 3.修改元素&#xff1a; 4.删除元素&#xff1a; 5.其他的常见方法&#xff1a; 1.ArrayList集合的初始化&#xff1a;…

微信小程序上传图片怎么限制大小

最近有一个微信小程序的项目&#xff0c;要求是上传多张图片&#xff0c;数量不能超过3张 &#xff0c;而且在php里因为上传图片被设置了只能上传2M&#xff0c;导致上传不成功&#xff0c;所以我在前端 设置一个函数&#xff0c;用了微信api(wx.chooseImage)获取图片&#xf…

微信小程序 import文件大小限制

微信小程序 import 引入外部文件 最大限制 超过 500k 时小程序会报错 当 import 引入的文件小于 500k 20200317补充: 后来有尝试了一下 echart ,发现引入的文件也大于500k,但是并没有出现报错, 我十分怀疑是json 的长度过长导致的, 如果有人知道是什么原因,希望不吝赐教.

【微信小程序】解决代码上传超过大小限制

问题描述 代码上传时失败&#xff0c;原因是大小超过限制 解决办法 一、图片等静态资源占用大&#xff0c;导致大小超限制 方法1&#xff1a;使用云开发提供的储存功能【推荐】 注意&#xff1a;要开通云开发功能&#xff0c;其次要在app.js中调用wx.cloud.init方法使用云开…

小程序分包Error: 分包大小超过限制,main package source

问题: 1、根据开发需求,项目基础模块开发完成后,在微信开发者工具上预览正常,点击"预览"的时候,提示分包大小超过限制。 如图: 上官网查了下,目前小程序分包大小有以下限制: 请参考:https://developers.weixin.qq.com/miniprogram/dev/framework/subpack…

uniapp下微信小程序超过2MB大小限制的解决方法

小程序开发者们看到这样的错误是不是很头疼&#xff1f; 我来总结一下解决这个问题的 方法 微信小程序超过2MB大小限制 1压缩静态文件大小2缩减大量重复的css代码3注释掉pages.json某些代码4程序分包5不要在uni.scss中引用样式&#xff01; 1压缩静态文件大小 举例&#xff0c…

小程序打包体积优化策略

背景 我们都知道微信小程序有包体积限制&#xff0c;整个小程序所有分包大小不超过 20M&#xff0c;单个分包/主包大小不能超过 2M。然而面对业务的不断更新迭代&#xff0c;代码和资源会越来越多&#xff0c;如果不尽早规划包体积的治理&#xff0c;势必有一天会对业务的发展…

【微信小程序】解决代码上传超过大小限制,小程序分包

微信小程序分包 小程序项目更新迭代&#xff0c;代码越来越大&#xff0c;超过了2M&#xff0c;小程序不能发布 快速解决方案&#xff0c;原来的页面跳转都不需要改&#xff0c;只需要改变app.json文件 原来app.json内容 {"pages": ["pages/ucenter/feedbac…

微信小程序页面数量限制问题

今天记录一下微信小程序关于页面栈不够用的解决方法&#xff0c;这个方法我是从小程序开发书中习得 1.问题 首先微信小程序中页面栈最多十层&#xff0c;也就意味着如果使用wx.navigateTo&#xff08;保留当前页面&#xff0c;跳转到应用内的某个页面&#xff09;方法&#x…