当前位置: 首页 > news >正文

这个何同学不一般——导向滤波

滤波器的种类

显式定义的线性移不变LTI滤波器有高斯滤波器,拉普拉斯滤波器,Sobel算子,用在图像平滑,锐化,边缘检测,特征提取中。

这些LTI滤波器的参数有的是手工定义的如sobel算子,有的是求解Poisson方程的过程中得到的,比如高动态范围HDR,图像拼接,图像matting(抠图),在这些应用中,滤波器的核被隐式定义为homogenous Laplacian matrix的逆。但共同点是滤波器参数和图像内容是无关的,并且是平移不变的。

双边滤波器

LTI的不变性指的是滤波器核在不同位置处参数是相同的,所以也不会根据图像内容做出调整。而在很多应用中,输出都是和输入密切关联的,比如图像上色,图像抠图,所以我们需要额外的信息作为参考。

具体的实现方法有两种,一种是最优化的方法,通过优化一个二次方程quadratic function,在输出与引导图直接添加约束,通过求解一个稀疏矩阵得到结果,在这个过程中实际隐式定义了一个移变的滤波器核。这种方法性能好,但是耗时长。

第二种方法是显示定义滤波器核。双边滤波就是最成功的一个,它同时考虑了邻域像素(加权),还考虑了引导图中灰度值的相似性。从公式上看就是两个高斯的乘积,一个高斯是正常的和像素坐标相关的,另外一个是和对应位置的像素值有关。

双边滤波可以在平滑的同时保留边缘,不需要迭代,复杂度暴力实现的话是O(r^2),直方图或者积分图可以达到O(1)。但是更严重的问题是可能出现梯度失真,产生梯度反转的人造现象gradient reversal artifacts。

联合双边滤波

双边滤波虽然考虑了图像内容,但仍然是自身的图像。联合双边滤波是在双边滤波的基础上引入了guidance image I,这样滤波器参数由I决定,得到的参数就是 translation-variant 的。在具体参数的确定上,沿用的还是双边滤波高斯权重的思路,表达式结构是两个e指数的乘积,两个e指数分别代表空间的相似度和灰度值上的相似度。所以当引导图就是输入图时,联合双边滤波退化为双边滤波。

导向滤波

导向滤波其实是何恺明为了解决暗通道去雾的一个计算过程提出的一种滤波方法。这里假设带雾的图是干净图和雾图的加权融合:

其中雾图也就是透射率图(Transmission Map),可以通过暗通道先验粗略得到:暗通道不仅仅是“通道间取最小”,还包含了“局部区域内取最小”的空间操作。在代码实现中,第一步通常用np.min(image, axis=2)实现,而第二步通常通过形态学腐蚀(cv2.erode)或最小值滤波(min-filter)来高效完成。

但是这样得到的Transmission Map还是太粗糙,不仅有很多噪点,而且在物体的边缘处会出现严重的“块效应(Blocking Artifacts)”“光晕效应(Halo)”。所以就需要导向滤波进一步加工。下面最右就是导向滤波之后的效果:

如果我们想要滤波的同时保留边缘,很自然地会想到先使用边缘检测器得到边缘图,滤波的时候就可以以此作为参考。导向滤波其实也一样,导向滤波有一个十分重要的假设:输出是导向图的局部线性变换。

这样就保证了引导图和滤波后的图梯度相同,最起码也是线性相关的,即实现了“保边”:

特别地,可以将原图作为guidance image,此时的结果输出就是保留边缘的平滑结果,在这个过程中其实就利用了guidance image中的结构信息。

作为边缘保持滤波器,导向滤波效果更好,速度快,时间线性复杂度,计算复杂度与滤波器核尺寸无关。引导滤波可以保留边缘,但是不会有人工效应,而且它还和matting Lapalacian 矩阵有关,复杂度和像素点的数目呈线性。但更重要的是导向滤波还有其他用处,与matting Laplacian matrix有理论联系,可以用在图像去噪,HDR,detail 平滑/增强等领域中。

求解系数

和普通的滤波器一样,导向滤波的输出q也是输入原始图像p的线性加权和,只不过加权函数是关于引导图的线性函数。

为了确定线性模型的系数a和b,使用了最小二乘滤波/维纳滤波的思想。维纳假定线性滤波器的输入为有用信号和噪声之和:

两者均为广义平稳过程且知它们的二阶统计特性,根据最小均方误差准则(滤波器的输出信号与需要信号之差的均方值最小),求得了最佳线性滤波器的参数:

计算位置i处的权重参数a和b,需要假定a,b在窗口为的范围内是常数,这样就可以使用上面的公式求解。但这样就造成每个像素点位置会属于多个窗口,而每个窗口会计算一组a,b,所以每个像素都会经历多组a,b的滤波之后再求均值,即便如此,我们仍然可以认为q的梯度和I的梯度是呈正比的。

式子中还有一个正则项,避免系数a过大。所以求线性模式参数的过程是线性岭回归的过程:认为噪声是加性噪声,同时以参数a的L2范数作为正则项。

a的解,整体形式是引导图与输入图的协方差与引导图方差的比值,可以看作是输入图p与引导图I的相关性。b则是在p的均值滤波的基础上结合引导图的均值做一个补偿。

像双边滤波一样保边

即便引导图是原图,引导滤波也有保留边缘的特性,这一点怎么理解呢?由公式可以看出,当I=p,输入图的均值和引导图的均值相等,a,b公式可以写为下面的样子:

如果窗口位于平坦区域,方差远小于epslion,a=0,b=avg(p),滤波效果相当于均值滤波

如果位于边缘区域,协方差/方差很大,a=1,b=0,所以在这个位置没有进行平均,可以保持边缘。

这样正则系数控制了滤波平滑的程度,正则系数越大,越容易平滑,正则系数越大,则越接近保留边缘。事实上,正则系数相当于双边滤波器中的range variance参数。除了正则系数,还有窗口大小的参数,这样构成了两级的平均值滤波器。窗口大小参数r相当于双边滤波器中的space variance。

但是不会梯度反转

图像增强的一般流程是这样的:input经过保边滤波得到base layer,base layer和input相减得到detail,对detail放大后再加在base layer上。

在双边滤波中,base layer会和input不一致,因为在边缘的地方range kernel会不可靠,base layer会更sharp,detail在减法时就会出现负数,而之后的放大操作会把这个误差放大。

而在导向滤波中,保证了系数a一直是小于1的,所以原始信号减去滤波结果一直的大于0的,所以也就不会出现梯度的反转。

还可以细化边缘mask

既然导向滤波的输出是导向图的线性关系,当滤波的输入图是图像分割mask,导向图是原图时,可以通过导向滤波将结构细节传递给分割mask,这时导向滤波就作为了Structure-Transferring Filtering。

实现代码

代码的关键就是求引导图与输入图的协方差矩阵和引导图的方差图。

设X和Y是两个随机变量,它们各自的期望分别是E(X)和E(Y)。那么X和Y的协方差定义为:

Cov(X,Y)=E[(X-E(X))(Y-E(Y))]

利用期望的线性性质,可以展开上式得到:

Cov(X,Y)=E(XY)-E(X)E(Y)

具体到图像,均值和加窗都可以使用blur运算得到,元素相乘直接使用矩阵对应元素相乘。计算得到a,b之后再加窗:

void guidedFilter(cv::Mat& guidiance, cv::Mat& src, cv::Mat& dst, const int r, float eps) { // Convert to float cv::Mat p, I; src.convertTo(p, CV_32F); guidiance.convertTo(I, CV_32F); ​ // Guided Filtering const cv::Size wsz(r, r); cv::Mat pm, Im, Ipm, IIm; cv::blur(p, pm, wsz); cv::blur(I, Im, wsz); cv::blur(p.mul(I), Ipm, wsz); cv::blur(I.mul(I), IIm, wsz); ​ cv::Mat a, b, am, bm; a = (Ipm- pm.mul(Im)) / (IIm - Im.mul(Im) + eps); b = pm- a.mul(Im); cv::blur(a, am, wsz); cv::blur(b, bm, wsz); ​ dst = am.mul(I) + bm; dst.convertTo(dst, CV_8U); }

reference:

https://kaiminghe.github.io/eccv10/eccv10ppt.pdf

https://arxiv.org/pdf/1505.00996.pdf

Guided Image Filtering | IEEE Journals & Magazine | IEEE Xplore

机器学习| 算法笔记-线性回归(Linear Regression) - 知乎

导向滤波 - 知乎

https://github.com/atilimcetin/guided-filter/blob/master/guidedfilter.cpp

https://link.springer.com/content/pdf/10.1007/978-3-642-15549-9_1.pdf

http://www.jsqmd.com/news/824606/

相关文章:

  • 戴尔笔记本风扇控制终极指南:3种智能模式轻松掌控散热与噪音
  • 2024年第二季度:10款必装的Hyper终端增强插件终极推荐
  • 录播姬:如何轻松录制mikufans直播并解决常见问题?
  • 2026北京离婚调解律师综合测评排名及专业解析 - 外贸老黄
  • 液压传感器哪家质量更加靠谱?东莞南力综合实力雄厚收获业内好评 - 品牌速递
  • 基于SpringBoot3和JDK17,集成H2数据库和jpa
  • AI写论文后怎么降AIGC率?6个实用技巧帮你轻松过审
  • 终极指南:LZ4测试隔离与沙箱环境清理的10个技巧
  • 2026微型压力传感器品牌排行榜单 东莞南力品质靠谱立足精密测控领域 - 品牌速递
  • Bashfuscator社区生态完整指南:如何参与项目贡献和获取技术支持
  • 挣脱国外技术桎梏 广州晶石石英式动态称重传感器彰显国货硬实力 - 品牌速递
  • BilibiliDown:专业级B站视频下载工具,高效构建个人媒体库
  • 如何3步永久保存QQ空间十年回忆:GetQzonehistory数据备份实战指南
  • 开源电动汽车远程监控系统:实时监控、警报、控制一应俱全,还能掌控个人数据!
  • 终极指南:如何使用Trigger.dev任务优先级API智能调整任务执行顺序
  • 一行 Python 代码,在Windows上解决跨设备大文件传输难题
  • 告别金融数据壁垒:如何用AKTools一键打通多语言财经数据接口
  • 数据探索神器:fg-data-profiling相关性矩阵深度解读终极指南 [特殊字符]
  • 石英式动态称重传感器10大排行,广州晶石实力上榜 - 品牌速递
  • Obsidian Importer技术深度解析:跨平台笔记迁移的架构设计与实现原理
  • 三星 7 月将推首款智能眼镜 Galaxy Glasses,或三季度上市并关联多设备
  • 软工组队作业
  • 基于飞思卡尔MCU的血糖仪设计:从芯片选型到低功耗实现的嵌入式医疗设备开发详解
  • Task发展历程:从简单任务运行器到现代自动化工具的完整演进史
  • OpenClaw智能排障技能:基于规则引擎的自动化故障诊断实践
  • Rust PostgreSQL实战:postgres异步驱动深度解析
  • 20260515
  • 嵌入式按键驱动设计:基于比特位状态机与异步回调的轻量级解决方案
  • 阿里2026年Q1财报:净利润近乎清零,AI与外卖双线作战前景几何?
  • 【软考高级架构】论文范文09——论服务网格(Service Mesh)架构的应用