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

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

首先按住鼠标左键将待修复区域框出来。

修复的而效果确实比上面的方法要好!

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

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. XML 特殊字符处理和 CDATA
  2. mysql百万数据写入_mysql 百万级数据查找,并写入txt文件
  3. Android项目导出jar包的小技巧
  4. sw二次开发 python_基于C#的SolidWorks二次开发.doc
  5. linux添加自己的键盘映射,Linux 键盘映射
  6. “人人都是数据科学家从新开始用Python学习数据科学的完整教程P1
  7. sip账号服务器,如何解决“sip账号未登录” ?
  8. python将图片转为矢量图
  9. manjaro设置字体_Manjaro 常用配置
  10. iOS定位-核心定位框架CLLocation
  11. Qt 之 QQ系统表情—实现动态显示效果
  12. 微信公众号怎么申请注册?看这一篇就够了
  13. UniApp引入极光推送
  14. 低功耗MCU的选择方法
  15. Java基础:volatile详解
  16. python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...
  17. 50种响应式web设计的奇妙工具
  18. 关于 AlphaBlend 和 32bpp 的反锯齿图标
  19. 通达信l2接口公式数据共享的意义
  20. java写的网络版斗地主_Java实现简单的斗地主游戏

热门文章

  1. 《士兵突击》能让你学到什么
  2. python雪花_用 Python 实现雪花效果
  3. Linux下的lds链接脚本二
  4. 【51 Nod 1326】遥远的旅途
  5. vue + iview + select + 本地搜索或远程搜索
  6. rz命令上传文件乱码,无关be参数
  7. ARM使用术语清除(flush)和清理(clean)表示对cache的两种基本操作
  8. Velocity是什么?
  9. linux忘了用户名和密码_Linux 服务器忘记用户名密码的找回办法总结linux操作系统 -电脑资料...
  10. Raki的读paper小记:Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks