OpenCV中导向滤波介绍与应用
时间:2022-05-07
本文章向大家介绍OpenCV中导向滤波介绍与应用,主要内容包括OpenCV中导向滤波介绍与应用、OpenCV中导向滤波函数、代码演示、去噪声、边缘羽化、对比度提升、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
OpenCV中导向滤波介绍与应用
导向滤波介绍
导向滤波是使用导向图像作为滤波内容图像,在导向图像上实现局部线性函数表达,实现各种不同的线性变换,输出变形之后的导向滤波图像。根据需要,导向图像可以跟输入图像不同或者一致。假设I是导向图像、p是输入图像、q是导向滤波输出图像,导向滤波是作为局部线性模型描述导向图像I与输出图像q之间的关系。
导向滤波算法实现的一般步骤为:
- 读取导向图像I与输入图像P
- 输入参数 与 其中 表示窗口半径大小,单位是像素, 表示模糊程度
- 积分图计算I的均值与方差、输入图像的均值以及I与P的乘积IP
- 计算线性相关因子a与b
- a=(IP-meanImeanP)/(Var_I+ )
- b=meanP-ameanI
- 计算a与b的均值
- 使用均值得到导向滤波结果Q=meana*I+meanb
导向滤波最常用四个功能是:
- 边缘保留滤波
- 图像去噪声
- 图像边缘羽化
- 图像增强(对比度)
OpenCV中导向滤波函数
由于导向滤波计算均值与方差可以通过积分图查找快速得到,因此导向滤波的速度会很快,作为边缘保留滤波它比双线性滤波有明显的速度优势,OpenCV中在扩展模块ximgproc中实现了图像的导向滤波函数,相关API函数与参数解释如下:
void cv::ximgproc::guidedFilter (
InputArray guide,// 导向图像
InputArray src,// 输入下
OutputArray dst,//导向滤波输出
int radius,//窗口半径大小
double eps,// 模糊程度
int dDepth = -1// 输出图像深度
)
eps值越大图像模糊程度越大、半径radius值越大图像模糊程度越高。
代码演示
通过代码演示了导向滤波根据输入的导向图像不一样分别实现了图像滤波的边缘保留、去噪声、羽化、对比度提升功能。完整的演示代码如下:
#include <opencv2/opencv.hpp>
#include <opencv2/ximgproc.hpp>
#include <iostream>
using namespace cv;
using namespace cv::ximgproc;
using namespace std;
void guide_demo(Mat &guide, Mat &input, int r, double e);
void enhance_demo(Mat &guide, Mat &input, int r, double e);
int main(int argc, char** argv) {
Mat src = imread("D:/vcprojects/images/guide.png");
if (src.empty()) {
printf("could not load image...n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
namedWindow("output", CV_WINDOW_AUTOSIZE);
int r = 2;
double eps = 0.1;
int type = 0;
while (true) {
char c = waitKey(50);
printf("input digit : %dn", c);
if (c == 49) { // 边缘保留
type = 1;
}
else if (c == 50) {
type = 2;
}
else if (c == 51) {
type = 3;
}
else if (c == 52) { // 去噪
type = 4;
}
else if (c == 53) { // 羽化
type = 5;
}
else if (c == 54) { // 提升
type = 6;
}
else if (c == 27) {
break;
}
if (type == 0 || type == 1 || type == 2 || type == 3) {
guide_demo(src, src, pow(r, type), eps*eps * pow(r, type));
}
else if(type == 4){
Mat guide = imread("D:/vcprojects/images/gf_guide.png");
Mat input = imread("D:/vcprojects/images/gf_noise.png");
imshow("input", input);
guide_demo(guide, input, 8, 0.02*0.02);
}
else if (type == 5) {
Mat guide = imread("D:/vcprojects/images/twocat.png");
Mat input = imread("D:/vcprojects/images/twocat_mask.png", IMREAD_GRAYSCALE);
imshow("input", input);
guide_demo(guide, input, 60, 10e-6);
}
else {
Mat input = cv::imread("D:/vcprojects/images/demo.png");
input.convertTo(input, CV_32F, 1.0 / 255.0);
imshow("input", input);
int r = 16;
double eps = 0.1 * 0.1;
enhance_demo(input, input, r, eps);
}
}
waitKey(0);
return 0;
}
void guide_demo(Mat &guide, Mat &input, int r, double e) {
double eps = e * 255 * 255;
Mat dst;
guidedFilter(guide, input, dst, r, eps, -1);
imshow("output", dst);
}
void enhance_demo(Mat &guide, Mat &input, int r, double e) {
Mat dst;
guidedFilter(guide, input, dst, r, e, -1);
Mat result = (guide - dst) * 5 + dst;
imshow("output", result);
}
运行截图如下:
边缘保留
去噪声
边缘羽化
对比度提升
- 【C++概念】---vector用法
- 浅谈Orabbix监控指标(r6笔记第27天)
- Orabbix定制监控Oracle的简单配置(r6笔记第26天)
- 【java基础】 线程实例
- 记一次数据库的分析和优化建议(r6笔记第24天)
- linux (ubantu)安装最新版python3.6,以及直接安装anaconda
- 【java基础】匿名类
- 朴素贝叶斯法 2016年11月11日
- 11g中关于控制文件自动备份的改进(r6笔记第22天)
- Java基础(02)-15总结对象数组,集合Collection,集合List
- alert日志中的两种ORA错误分析(r6笔记第21天)
- 通过定制orabbix监控分析潜在的Oracle问题 (r6笔记第32天)
- 【C语言练手】C语言画太极图
- 关于奇怪的并行进程分析(一) (r6笔记第41天)
- 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 数组属性和方法