本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

在实际应用或者工程中,图像常常会收到噪声的干扰,例如在拍照时镜头上存在灰尘或者飞行的小动物,这些干扰会导致拍摄到的图像出现部分内容被遮挡的情况。对于较为久远的图像,可能只有实体图像而没有数字存储形式的底板,因此相片在保存和运输过程中可能产生划痕,导致图像中信息的损坏和丢失。

图像修复技术就是利用图像中损坏区域边缘的像素,根据像素值的大小以及像素间的结构关系,估计出损坏区域可能的像素排列,从而去除图像中受污染的区域。图像修复不仅可以去除图像中得“划痕”,还可以去除图像中得水印、日期等。

OpenCV 4提供了能够对含有较少污染或者水印的图像进行修复的inpaint()函数,该函数的函数原型在代码清单8-26中给出。

代码清单8-26 inpaint()函数清单
1.  void cv::inpaint(InputArray  src,
2.                       InputArray  inpaintMask,
3.                       OutputArray  dst,
4.                       double  inpaintRadius,
5.                       int  flags
6.                       )
  • src:输入待修复图像,当图像为单通道时,数据类型可以是CV_8U、CV_16U或者CV_32F,当图像为三通道时数据类型必须是CV_8U。
  • inpaintMask:修复掩模,数据类型为CV_8U的单通道图像,与待修复图像具有相同的尺寸。
  • dst:修复后输出图像,与输入图像具有相同的大小和数据类型。
  • inpaintRadius:算法考虑的每个像素点的圆形邻域半径。
  • flags:修复方法标志,可以选择的参数及含义在表8-7给出

该函数利用图像修复算法对图像中指定的区域进行修复,函数无法判定哪些区域需要修复,因此在使用过程中需要明确指出需要修复的区域。函数的第一个参数是需要修复的图像,该函数可以对灰度图像和彩色图像进行修复。修复灰度图像时,图像的数据类型可以为CV_8U、CV_16U或者CV_32F;修复彩色图像时,图像的数据类型只能为CV_8U。第二个参数是修复掩码,即指定图像中需要修复的区域,该参数输入量是一个与图像具有相同尺寸的数据类型为CV_8U的单通道图像,图像中非0像素表示需要修复的区域。函数的第三个 参数是修复后的输出图像,与输入图像具有相同的大小和数据类型。第四个参数表示修复算法考虑的每个像素点的圆形邻域半径。最后一个参数表示修复图像方法标志,可以选择的参数及含义在表8-7给出。

该函数虽然可以对图像受污染区域进行修复,但是需要借助污染边缘区域的像素信息,离边缘区域越远的像素估计出的准确性越低,因此如果受污染区域较大,修复的效果就会降低。

表8-7 inpaint()函数修复图像算法可选择标志

标志参数 简记 含义
INPAINT_NS 0 基于Navier-Stokes算法修复图像
INPAINT_TELEA 1 基于Alexandru Telea算法修复图像

为了了解函数的使用方法以及图像修复的效果,在代码清单8-27中给出了图像修复的示例程序。程序中分别对污染较轻和较严重的两张图像进行修复,首先计算每张图像需要修复的掩码图像,之后利用inpaint()函数对图像进行修复,程序输出结果如图8-18和图8-19所示,通过结果可以看出污染区域较细并且较为稀疏的情况下图像修复效果较好,污染区域较为密集时修复效果较差。

代码清单8-27 myInpaint.cpp图像修复
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.
4.  using namespace cv;
5.  using namespace std;
6.
7.  int main()
8.  {9.      Mat img1 = imread("inpaint1.png");
10.     Mat img2 = imread("inpaint2.png");
11.     if (img1.empty()||img2.empty())
12.     {13.         cout << "请确认图像文件名称是否正确" << endl;
14.         return -1;
15.     }
16.     imshow("img1", img1);
17.     imshow("img2", img2);
18.
19.     //转换为灰度图
20.     Mat img1Gray, img2Gray;
21.     cvtColor(img1, img1Gray, COLOR_RGB2GRAY, 0);
22.     cvtColor(img2, img2Gray, COLOR_RGB2GRAY, 0);
23.
24.     //通过阈值处理生成Mask掩模
25.     Mat img1Mask, img2Mask;
26.     threshold(img1Gray, img1Mask, 245, 255, THRESH_BINARY);
27.     threshold(img2Gray, img2Mask, 245, 255, THRESH_BINARY);
28.
29.     //对Mask膨胀处理,增加Mask面积
30.     Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
31.     dilate(img1Mask, img1Mask, Kernel);
32.     dilate(img2Mask, img2Mask, Kernel);
33.
34.     //图像修复
35.     Mat img1Inpaint, img2Inpaint;
36.     inpaint(img1, img1Mask, img1Inpaint, 5, INPAINT_NS);
37.     inpaint(img2, img2Mask, img2Inpaint, 5, INPAINT_NS);
38.
39.     //显示处理结果
40.     imshow("img1Mask", img1Mask);
41.     imshow("img1修复后", img1Inpaint);
42.     imshow("img2Mask", img2Mask);
43.     imshow("img2修复后", img2Inpaint);
44.     waitKey();
45.     return 0;
46. }

图8-18 myInpaint.cpp程序中污染条纹较细较稀疏时修复结果 图8-19 myInpaint.cpp程序中污染条纹较稠密时修复结果

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】均值滤波
【OpenCV 4开发详解】方框滤波
【OpenCV 4开发详解】高斯滤波
【OpenCV 4开发详解】可分离滤波
【OpenCV 4开发详解】中值滤波
【OpenCV 4开发详解】边缘检测原理
【OpenCV 4开发详解】Scharr算子
【OpenCV 4开发详解】Laplacian算子
【OpenCV 4开发详解】Canny算法
【OpenCV 4开发详解】图像距离变换
【OpenCV 4开发详解】图像连通域分析
【OpenCV 4开发详解】图像腐蚀
【OpenCV 4开发详解】图像膨胀
【OpenCV 4开发详解】形态学应用
【OpenCV 4开发详解】检测直线
【OpenCV 4开发详解】直线拟合
【OpenCV 4开发详解】直线检测
【OpenCV 4开发详解】轮廓发现与绘制
【OpenCV 4开发详解】轮廓面积与长度
【OpenCV 4开发详解】图像矩的计算与应用
【OpenCV 4开发详解】点集拟合
【OpenCV 4开发详解】QR二维码检测
【OpenCV 4开发详解】分割图像——漫水填充法
【OpenCV 4开发详解】分割图像——分水岭法
【OpenCV 4开发详解】分割图像——Grabcut图像分割
【OpenCV 4开发详解】分割图像——Mean-Shift分割算法
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】图像修复相关推荐

  1. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. 【OpenCV 4开发详解】分割图像——Grabcut图像分割

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. 【OpenCV 4开发详解】图像二值化

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. 【OpenCV 4开发详解】图像膨胀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】图像腐蚀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】图像距离变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】图像连通域分析

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】图像噪声的种类与生成

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. 传感器可以让智能手机测量生命体征
  2. SAP MM 影响Vendor主数据维护界面的字段选择的四大因素?
  3. javaWeb实现文件上传与下载 (转)
  4. mysql数据库,创建只读用户
  5. oracle dg物理和逻辑,Oracle DG 物理Standby环境搭建
  6. Linux实战案例(4)CentOS清除用户登录记录和命令历史方法
  7. 10月Web服务器调查:Apache下降 Ngnix攀升
  8. 【IOS】Target membership
  9. 小米手环无法模拟门卡_颜值与功能得到全面升级,小米手环4 NFC版上手体验
  10. 【Jmeter篇】导出Jmeter脚本及查看接口响应时间
  11. Storm集群安装Version1.0.1开启Kerberos
  12. 如何在Windows CMD的一行中运行两个命令?
  13. 好好讲一讲:到底什么是Java架构师(含福利放送,名额有限)
  14. java 内部类_Java内部类总结
  15. SAP软件财务月结之往来重分类
  16. 工作表冻结前两行_冻结所有工作表宏
  17. 网络信息安全之信息系统安全保障
  18. 电脑连不上网,浏览器网页打不开,但qq微信能发消息
  19. python如何用for循环写九九乘法表
  20. excel学习-数据透视图(插入+设置样式+加公司logo+设置logo大小+删除表中多余东西)

热门文章

  1. TIOBE 2月编程语言排行榜:Python逼近C,Groovy重回TOP 20
  2. 年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关
  3. 上海大学建了一个“突发事件语料库”,包括地震、恐怖袭击等5大类
  4. 达沃斯群英纵论人工智能,核心观点汇总
  5. AI一分钟 | Yann LeCun怒批机器人Sophia:招摇撞骗;李嘉诚:我比较保守,只投了1亿港币到比特币终端市场
  6. AI一分钟 | 马斯克再放豪言:我要造的AI的芯片“全球最棒”;刚上路就被叫停,可能是美国对快递机器人最严厉的打击
  7. 如何优雅地用TensorFlow预测时间序列:TFTS库详细教程
  8. Kafka 原理以及分区分配策略剖析
  9. 程序员无休止加班的真正原因
  10. Google 出品的 Java 编码规范,值得借鉴!