Opencv--图像修复

article/2025/10/15 15:12:06

Opencv–图像修复

前言

在实际应用中,我们的图像常常会被噪声腐蚀,这些噪声或是镜头上的灰尘或水滴,或是旧照片的划痕,或者是图像遭到人为的涂画(比如马赛克)或者图像的部分本身已经损坏。如果我们想让这些受到破坏的额图片尽可能恢复到原样,Opencv能帮我们做到吗?

OpenCV真的有这个妙手回春的功能!别以为图像修补的工作只能用PS或者美图秀秀那些软件去做,其实由程序员自己写代码去做更加高效!

图像修复技术的原理是什么呢?

简而言之,就是利用那些已经被破坏的区域的边缘, 即边缘的颜色和结构,根据这些图像留下的信息去推断被破坏的信息区的信息内容,然后对破坏区进行填补 ,以达到图像修补的目的。

OpenCV中就是利用inpaint()这个函数来实现修复功能的。

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

第一个参数src,输入的单通道或三通道图像;

第二个参数inpaintMask,图像的掩码,单通道图像,大小跟原图像一致,inpaintMask图像上除了需要修复的部分之外其他部分的像素值全部为0;

第三个参数dst,输出的经过修复的图像;

第四个参数inpaintRadius,修复算法取的邻域半径,用于计算当前像素点的差值;

第五个参数flags,修复算法,有两种:INPAINT_NS 和I NPAINT_TELEA;

函数实现关键是图像掩码的确定,可以通过阈值筛选或者手工选定,按照这个思路,用三种方法生成掩码,对比图像修复的效果。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

#include <imgproc\imgproc.hpp>
#include <highgui\highgui.hpp>
#include <photo\photo.hpp>using namespace cv;//全区域阈值处理+Mask膨胀处理
int main()
{Mat imageSource = imread("lol17.png");if (!imageSource.data){return -1;}imshow("原图", imageSource);Mat imageGray;//转换为灰度图cvtColor(imageSource, imageGray, CV_RGB2GRAY, 0);Mat imageMask = Mat(imageSource.size(), CV_8UC1, Scalar::all(0));//通过阈值处理生成Maskthreshold(imageGray, imageMask, 240, 255, CV_THRESH_BINARY);Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//对Mask膨胀处理,增加Mask面积dilate(imageMask, imageMask, Kernel);//图像修复inpaint(imageSource, imageMask, imageSource, 5, INPAINT_TELEA);imshow("Mask", imageMask);imshow("修复后", imageSource);waitKey();
}

下面就是修复效果,感觉很不错吧!不过仔细一看,感觉跟原图还是发生了一些差异,比如图中剑圣头上的那颗亮点,颜色发生了变化。这个就是修复后的副作用!毕竟作出了修复,付点代价还是要的。受损是由于是图像全区域做阈值处理获得的掩码,图像上部分区域也被当做掩码对待,导致部分图像受损。
在这里插入图片描述
有些图片可能就会修复得很好,比如以下这幅,你根本看不出哪里有明显的副作用。

在这里插入图片描述
是不是所有受损的图片都能较好地还原呢?那当然不是,有些图片受损太严重的,或者在某些复杂区域受损的,OpenCV也很难帮你修复过来。

比如以下这幅,因为受损有些区域在一些很复杂的位置,所以修复起来效果不怎么样。
在这里插入图片描述
上面提到其他无辜的而区域会受损,这个问题能解决一下吗?可以的,那就得自己定义一块需要修复的而区域,不需要修复的区域我们不动它就是了。

#include <imgproc/imgproc.hpp>
#include <highgui/highgui.hpp>
#include <core/core.hpp>
#include <photo/photo.hpp>using namespace cv;Point ptL, ptR; //鼠标画出矩形框的起点和终点
Mat imageSource, imageSourceCopy;
Mat ROI; //原图需要修复区域的ROI//鼠标回调函数
void OnMouse(int event, int x, int y, int flag, void *ustg);//鼠标圈定区域阈值处理+Mask膨胀处理
int main()
{imageSource = imread("lol17.png");if (!imageSource.data){return -1;}imshow("原图", imageSource);setMouseCallback("原图", OnMouse);waitKey();
}
void OnMouse(int event, int x, int y, int flag, void *ustg)
{if (event == CV_EVENT_LBUTTONDOWN){ptL = Point(x, y);ptR = Point(x, y);}if (flag == CV_EVENT_FLAG_LBUTTON){ptR = Point(x, y);imageSourceCopy = imageSource.clone();rectangle(imageSourceCopy, ptL, ptR, Scalar(255, 0, 0));imshow("原图", imageSourceCopy);}if (event == CV_EVENT_LBUTTONUP){if (ptL != ptR){ROI = imageSource(Rect(ptL, ptR));imshow("ROI", ROI);waitKey();}}//单击鼠标右键开始图像修复if (event == CV_EVENT_RBUTTONDOWN){imageSourceCopy = ROI.clone();Mat imageGray;cvtColor(ROI, Gray, CV_RGB2GRAY); //转换为灰度图Mat imageMask = Mat(ROI.size(), CV_8UC1, Scalar::all(0));//通过阈值处理生成Maskthreshold(imageGray, imageMask, 235, 255, CV_THRESH_BINARY);Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));dilate(imageMask, imageMask, Kernel);  //对Mask膨胀处理inpaint(ROI, imageMask, ROI, 9, INPAINT_TELEA);  //图像修复imshow("Mask", imageMask);imshow("修复后", imageSource);}
}

这种方法就需要我们人为地画出要修复的区域,这样就不会影响区域之外的图像了。

首先按住鼠标左键将待修复区域框出来。
在这里插入图片描述
修复的而效果确实比上面的方法要好!

总而言之,图像修复技术在一些简单,颜色单调的图像上进行修复得到的而效果是相当好的,而在一些细节或者复杂的部分进行修复,得到的复原图像的效果就比较一般了。比如在一些背景部分进行修复效果都不错,而在边缘细节上的修复就能看出问题了!
在这里插入图片描述


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

相关文章

数字图像处理之图像修复

目录 目标 实验 主函数&#xff1a;加噪声&#xff0c;扭曲原始图片&#xff0c;使用滤波器修复图片 子函数1&#xff1a;中心化图片 子函数2&#xff1a;加高斯噪声 子函数3&#xff1a;维纳反卷积滤波器 子函数4&#xff1a;逆滤波器 实验结果 原始图片&#xff0c;退化…

图像修复模型——TV模型

1. 参考文献 2. TV图像修复模型 2.1 TV模型 % demo_TV.m % Author: HSW % Date: 2015/3/25 % HARBIN INSTITUTE OF TECHNOLOGY % % set matlab close all; clear all; clc;options.null 0; % read image Img imread(Image\butterfly.bmp); % Img imread(Image\peppers.bmp…

图像修复 学习笔记

目录 局部卷积&#xff08;PConv&#xff09;图像修复 Pconv torch 实现&#xff1a; 局部卷积&#xff08;PConv&#xff09;图像修复 本文提出了局部卷积&#xff08;PConv&#xff09;层来处理不规则孔。图1显示了使用建议的PConv的一些修复结果。看样子还不错&#xff0…

基于改进Criminisi算法的图像修复

1、内容简介 略 516-可以交流、咨询、答疑 2、内容说明 摘 要&#xff1a;针对 Criminisi算法难以获得理想的修复效果&#xff0c;且存在修复时间过长等缺陷&#xff0c;提出一种改进 Criminisi算法的 图像修复算法。改进优先权计算方式找到最优待修复块&#xff0c;完善最优…

图像修复简介

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达推荐阅读 42个pycharm使用技巧&#xff0c;瞬间从黑铁变王者Google C项目编程风格指南 (中文版) 分享在实际应用中&#xff0c;图像经常被噪声腐蚀。这些噪音是镜头上的灰…

Halcon图像修复

1.之前研究OpenCV的图像修复时&#xff0c;知道Opencv提供的inpaint API能够实现这个效果。 void inpaint( InputArray src, 原图 InputArray inpaintMask, 二进制掩模&#xff0c;指示要修复的像素 OutputArray dst, 目标图像 double inpaintRadius, 像素周围的邻域补绘。…

图像修复

转自&#xff1a;https://blog.csdn.net/moxibingdao/article/details/107075598 本文继 去雨去雾去模糊篇 和 图像增强与图像恢复篇 之后&#xff0c;继续盘点CVPR 2020 中低层图像处理技术&#xff0c;本篇聚焦于图像修复&#xff08;Image Inpainting&#xff09;。 示例如…

CVPR 2020 论文大盘点-图像修复Inpainting篇

转自&#xff1a;https://mp.weixin.qq.com/s?__bizMzIwMTE1NjQxMQ&mid2247519592&idx2&sn3a0598c9f52e47929678a572ea451d98&chksm96f0ff3ca187762a107b4b9194e862b757d3d943ec399b35cbb7576cd92ee55cc648d7121ac3&scene21#wechat_redirect 本文继 去雨…

图像修复介绍

图像修复是一种利用缺损图像中已知部分的信息预测缺损区域的内容&#xff0c;允许使用替代内容取填充目标区域的技术。其最终目的是保证修复后的图像整体结构连贯统一&#xff0c;修复区域边缘处过渡自然&#xff0c;修复内容细节丰富合理&#xff0c;最好能够使观察者无法分辨…

【OpenCV】- 图像修复

说明&#xff1a;图像修复可以解决类似噪声或者是镜头上的灰尘或水滴或者旧照片上面的划痕等。 文章目录 1、实现图像修补&#xff1a;inpaint()函数2、opencv之鼠标响应函数3、示例程序 1、实现图像修补&#xff1a;inpaint()函数 说明&#xff1a;图像修补技术由inpaint()函数…

图像修复(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; }; 虽然上述构造函数调…