Bilateral Filter

最近在看图像风格化的论文的时候,频繁遇到 Bilateral Filter。google 一波后,发现并不是什么不得了的东西,但它的思想却很有借鉴意义。

简介

Bilateral Filter,中文又称「双边滤波器」。相比以往那些仅仅使用位置信息进行滤波的 filter,Bilateral Filter 还考虑了颜色信息,可以保证边缘部分不会被过滤。

简单来说,一般的 filter 都是基于这样的公式进行滤波的:
\[ h(x)=k_{d}^{-1}{(x)}\iint_\infty^\infty{f(\zeta)c(\zeta, x)} d\zeta \]

其中,\(k_{d}^{-1}{(x)}\) 是权重之和,\(f(\zeta)\) 可以理解为单个像素,\(c(\zeta, x)\) 可以理解为位置权重。

翻译成程序员可以理解的语言,大概是这样:

for (int i = -r; i <= r; i++) {
  for (int j = -r; j <= +r; j++) {
    newpixel += pixel[row+i][col+j] * c[i][j];
    k += c[i][j];
  }
}
pixel[row][col] = newPixel / k;

高斯函数也属于这类 filter。

但这种 filter 有一个缺点:各向同性(不知道这个理解对不对)。用这种滤波器,每个点受邻居的影响是一样的,即使它跟邻居像素可能差得比较多,也会被邻居「同化」(举个例子:边缘被「和谐」掉了)。因此,有人提出了 Bilateral Filter。

Bilateral Filter 采用这样的公式:
\[ h(x)=k_{d}^{-1}{(x)}\iint_\infty^\infty{f(\zeta)c(\zeta, x)s(f(\zeta), f(x))} d\zeta \]
对比之前的式子,最大的变化无非是权值中增加了一个 \(s(f(\zeta), f(x))\),这个东西也是权值,不过它不是采用位置信息,而是颜色信息 \(f(\zeta)\)。不管是哪种信息,形势上来看都是一样的,但由于增加了颜色权值,却使滤波的结果有了明显不同,后面会给出效果图。

再次翻译成程序语言:

for (int i = -r; i <= r; i++) {
  for (int j = -r; j <= +r; j++) {
    newpixel += pixel[row+i][col+j] * c[i][j] * s(pixel[row][col], pixel[row+i][col+j]);
    k += c[i][j]*s(pixel[row][col], pixel[row+i][col+j]);
  }
}
pixel[row][col] = newPixel / k;

s 函数可以借鉴位置权值的思路。例如,可以采用这种方式定义(当然这个是我自己构造的):

function s(p1, p2) {
  return (255-abs(p1-p2)) / 255
}

这样,差的越多的颜色,所占权值越小。

如果要追求科学严谨一点,也不妨仿照高斯核函数的定义:
\[ c(\zeta-x) = e^{-{1\over2}({ {\zeta-x} \over {\sigma} } )^2} \\\\\\ s(\zeta-x) = e^{-{1\over2}({ {f(\zeta)-f(x)} \over \sigma })^2} \]
<br>

代码实现

理解原理后,实现其实也很简单,上面给出的伪代码基本是核心算法了。另外需要注意的是,如果是彩色图的话,需要对每个通道的颜色值进行滤波。

具体实现可以参考这篇博客:图像处理之双边滤波效果(Bilateral Filtering for Gray and Color Image),或者参考我自己的 demo,当然,我也只是将上面博客的 java 版改成 c++ 而已^0^。

给出几幅结果图:

原图

1129050-20180104153347628-2025136301.jpg

高斯模糊

1129050-20180104153046987-1363871777.jpg

仅仅用颜色信息滤波

1129050-20180104153103940-657152109.jpg

双边滤波:

1129050-20180104153117284-314438649.jpg

仔细对比一下,双边滤波对边缘的保留效果比高斯滤波好太多了,这一点从第三幅图就可以知晓缘由了。

另外!!如果使用高斯核函数来实现双边滤波,颜色卷积和的 \(\sigma\) 要取大一点的值,比如:50。否则,由于不同颜色的差值往往比位置差值大出许多(举个例子:50 和 60 两种像素值肉眼上看很接近,但却差出 10,平方一下就是 100),可能导致很相近的像素点权值很小,最后跟没滤波的效果一样。

<br>

启发

Bilateral Filter 的思想是:在位置信息的基础上加上颜色信息,相当于考虑两个权值。如果还要考虑其他重要因素,是不是可以再加进一个权值,构成一个三边滤波器呢?答案当然是可以的,由此,我们可以把很多简单的滤波器综合起来形成一个更强大的滤波器。

<br>

参考

转载于:https://www.cnblogs.com/jermmyhsu/p/8193613.html

bilateralFilter是OpenCV中的一个函数,用于实现双边滤波。该函数的语法是:dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)。\[1\]双边滤波器是一种非线性的滤波方法,它结合了图像的空间邻近度和像素值相似度,同时考虑空域信息和灰度相似性,以达到保边去噪的目的。\[2\]双边滤波器可以很好地保护图像的边缘特性,相比其他降噪方法,它在去噪的同时能够保留图像的边缘细节。\[2\]双边滤波器的原理是通过两个核函数生成:空间域核和值域核。\[3\]空间域核用于考虑像素之间的空间邻近度,而值域核用于考虑像素之间的像素值相似度。通过综合考虑这两个因素,双边滤波器能够在平滑去噪的同时保护图像的边缘。 #### 引用[.reference_title] - *1* [Opencv之图像滤波:6.双边滤波(cv2.bilateralFilter)](https://blog.youkuaiyun.com/qq_49478668/article/details/123488527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [bilateral filter双边滤波器的通俗理解](https://blog.youkuaiyun.com/qq_36387683/article/details/99948731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值