【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;
函数实现关键是图像掩码的确定,可以通过阈值筛选或者手工选定,按照这个思路,用三种方法生成掩码,对比图像修复的效果。
#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);}
}
这种方法就需要我们人为地画出要修复的区域,这样就不会影响区域之外的图像了。
首先按住鼠标左键将待修复区域框出来。
然后对框出来的区域点击鼠标右键,就可以进行修复了。
修复的而效果确实比上面的方法要好!
总而言之,图像修复技术在一些简单,颜色单调的图像上进行修复得到的而效果是相当好的,而在一些细节或者复杂的部分进行修复,得到的复原图像的效果就比较一般了。比如在一些背景部分进行修复效果都不错,而在边缘细节上的修复就能看出问题了!
原文:https://www.cnblogs.com/skyfsm/p/6888213.html
刚开始理解的时候,有个点一直没有理解到,针对整个图片如何检测破损的地方呢?
原来是,先检测破损的地方,之后再修复
【OpenCV系列】图像修复技术相关推荐
- OpenCV中图像修复技术介绍与演示
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 现实中图像经常出现划伤或者被噪声腐蚀或 ...
- OpenCV探索之路(十):图像修复技术
在实际应用中,我们的图像常常会被噪声腐蚀,这些噪声或是镜头上的灰尘或水滴,或是旧照片的划痕,或者是图像遭到人为的涂画(比如马赛克)或者图像的部分本身已经损坏.如果我们想让这些受到破坏的额图片尽可能恢复 ...
- OpenCV精进之路(九):图像轮廓和图像分割修复——图像修复技术
在实际应用中,我们的图像常常会被噪声腐蚀,这些噪声或是镜头上的灰尘或水滴,或是旧照片的划痕,或者是图像遭到人为的涂画(比如马赛克)或者图像的部分本身已经损坏.如果我们想让这些受到破坏的额图片尽可能恢复 ...
- 利用OpenCV实现图像修复(含源码链接)
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前一段时间小白分享过关于图像修复技术介绍的推文(点击可以跳转),有 ...
- opencv系列-图像清晰度评价
opencv系列-图像清晰度评价 1,换了opencv3.4,用来测试 2,opencv好评呀 图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差:在 ...
- Python+OpenCV:图像修复(Image Inpainting)
Python+OpenCV:图像修复(Image Inpainting) 理论 Most of you will have some old degraded photos at your home ...
- 使用OpenCV进行图像修复、Navier-Stokes、INPAINT_TELEA,专栏:各种openCV实践的案例
专栏连接:openCV练习-各种openCV实践的案例 前言 使用OpenCV进行图像修复,在ps里面有现成的功能,但是今天使用代码尝试了下,感觉效果还不错. 这个代码对比较细长的划痕.破损修复的效果 ...
- python修片_python 用opencv实现图像修复和图像金字塔
我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音,笔画等.基本思路很简单:用相邻像素替换那些坏标记,使其看起来像邻域. cv2.inpaint() cv2.INPAINT_TELEA cv2. ...
- DeepNude已迅速下线,来看看它涉及的图像修复技术
导读:本文会探讨一些image/text/random-to-image的神经网络模型,仅供学习交流之用,也欢迎分享你的技术解决方案. 作者:yuanxiaosc 来源:Github.大数据文摘 原文 ...
最新文章
- 小众编程语言同样值得你关注
- Linux下的awk用法详解
- Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略
- 中国靶材行业投资价值与发展机遇研究报告2022版
- TypeScript 的 type predicates
- caffe 中的一些参数介绍
- 精讲23种设计模式-策略模式~聚合短信服务和聚合支付服务
- Python创建cvs文件,包含标签和图片数据
- c语言谭浩强第六章答案,C语言谭浩强版本第6章课后练习题答案..doc
- 在线文件(Word、Excel、PPT、PDF)预览
- JAVA项目中遇到URLEncoder URLDecoder编码解码问题
- windows系统下压力测试工具(cpu使用率,内存使用率,磁盘使用率,磁盘空间)
- 新瓶装老酒--近期APT32(海莲花)组织攻击活动样本分析
- WebView打不开或者显示异常可能原因
- 负反馈放大器电路详解
- nrf51822代码流程(从main展开)
- 数据恢复软件如何恢复电脑删除的文件
- ARM 汇编指令 DCD
- JS中删除数组中的元素
- MVVM框架之avalon学习笔记(1)
热门文章
- 【3dsmax】20180904基础知识整理(3)
- 【正点原子FPGA连载】第三十章 基于OV5640的PL以太网视频传输实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
- 魔兽怀旧服怎么找不到服务器,魔兽世界怀旧服服务器断开连接解决方法 魔兽世界怀旧服服务器断开连接怎么办...
- Edsger Dijkstra经典言论
- 原则与执着:暴雪王牌总结游戏研发得失成败
- 久久为功,华为云助力软件行业高效创新
- Cesium中通过Primitive显示大量的点以及点的运动
- Proxifier设置代理
- 暗黑破坏神3 --野蛮人 防御装备选择篇(二)
- python 删除excel空白行和空白列