OpenCV中图像修复技术介绍与演示
时间:2022-05-07
本文章向大家介绍OpenCV中图像修复技术介绍与演示,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
现实中图像经常出现划伤或者被噪声腐蚀或者有污渍点,对于这类图像可以通过修复(inpainting)相关的算法来说恢复损害的图像。一般情况下这些算法都是基于污染区域的周围已知的颜色和结构,通过繁殖和混合重新生成填充污染区域。OpenCV中实现的图像修复算法有两种。
- 基于Navier-Stokes的修复方法
- 基于图像梯度的快速匹配方法又称(Telea法)
对应的两个枚举类型分别如下:
- CV_INPAINT_NS
- CV_INPAINT_TELEA
在OpenCV3.1.0中对应的API方法为inpaint
- src参数表示八位单通道或者三通道的图像
- inpaintMask参数表示8位单通道的图像,非零像素区域表示要修复区域
- dst参数表示修复后的图像,大小类型跟输入图像src一致
- inpaintRadius参数表示修复位置点周围的半径大小
- flags参数表示使用的是哪种修复方法,必须是上述提到两种方法之一。
#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace cv;using namespace std;int main(int argc, char** argv) { Mat src = imread("D:/gloomyfish/topstar.png"); if (src.empty()) { printf("could not load image...n"); return -1; } namedWindow("污染图像", CV_WINDOW_AUTOSIZE); imshow("污染图像", src); // 获取mask Mat mask; inRange(src, Scalar(0, 0, 250), Scalar(0, 0, 255), mask); imshow("mask image", mask); // 修复 Mat dst; inpaint(src, mask, dst, 3, CV_INPAINT_TELEA); namedWindow("修复图像", CV_WINDOW_AUTOSIZE); imshow("修复图像", dst); waitKey(0); return 0;}
效果演示
应用实战 - 图像去水印
随便从天涯上面找了一张图像,显示如下:
提取水印文字【天涯社区】四个字得到结果如下:
这样的水印区域作为模板如果直接去修复的话,效果不是很好,原因在于【天涯社区】四个水印文字是雕刻体,除了白色区域外,它周围还有一圈灰度区域,所以通过图像形态学操作膨胀得到如下结果:
然后直接调用修复API即可实现去水印,得到无水印图像显示如下:
水印文字【天涯社区】已经不见啦!
对应的演示代码如下:
// 获取水印mask图像 Mat wm; // 水印文字 imshow("文字水印", src); inRange(src, Scalar(240, 240, 240), Scalar(255, 255, 255), wm); // 形态学操作 Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); morphologyEx(wm, wm, MORPH_DILATE, kernel, Point(-1, -1), 2); imshow("mask22", wm); // 去水印结果 Mat tywwm; inpaint(src, wm, tywwm, 3, CV_INPAINT_TELEA); imshow("去水印结果", tywwm);
- 表单控件的副产品——查询控件
- 表单控件续(1)——应用接口来简化和分散代码
- 通过自定义配置实现插件式设计
- 让IoC动态解析自定义配置(提供基于Unity的实现)
- 如何让ASP.NET默认的资源编程方式支持非.ResX资源存储
- 在VS中通过建立依赖关系使文件结构更清晰
- 一个关于ConfigurationManager.GetSecion方法的小问题
- 追踪记录每笔业务操作数据改变的利器——SQLCDC
- 一个完整的用于追踪数据改变的解决方案
- C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- 通过内存分析工具来证明字符串驻留机制
- 如果在BackgroundWorker运行过程中关闭窗体…
- 从数据到代码——基于T4的代码生成方式
- 解决T4模板的程序集引用的五种方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pymysql使用(二)
- NIO实现群聊功能,手动实现聊天室
- 一键实现自动化部署(灰度发布)实践
- 一文读懂递归算法—程序员必会算法之一
- 原来在Android中请求权限也可以有这么棒的用户体验
- Linux系统SSH(Secure Shell Protocol)服务
- 全网最火Java面试题
- Redis数据备份,容灾恢复手段
- Sublime Text的使用
- JVM垃圾回收机制和算法详解
- 使用 zabbix 监控 tomcat(包含jvm监控)
- Python open 读和写
- Linux系统SSH服务之 sshkey密钥认证实战
- Redis工作中常用命令,看这一篇就够了
- String、StringBuffer、StringBuiler深入分析,看这一篇就够了