OpenCV双边滤波解决实现图像的美白
bilateral filter双边滤波器的通俗理解
图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等。但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显。相比较而言,bilateral filter双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性。双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的(不理解这几个概念没关系,后面会慢慢解释)。
1. 双边滤波(Bilateral filter)的原理
双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:空间域核和值域核
- (1)空间域核:由像素位置欧式距离决定的模板权值
为模板窗口的其他系数的坐标;其中为模板窗口的中心坐标点;为高斯函数的标准差。 使用该公式生成的滤波器模板和高斯滤波器使用的模板是没有区别的。
在一些博客和教程里,这个权值称为定义域核,也称为空间系数,或
空间域(spatial domain S)
。显示由的计算公式可知,它是计算临近点到中心点临近程度,因此定义域核是用于衡量空间临近的程度。
- (2)值域核:由像素值的差值决定的模板权值
其中,为模板窗口的其他系数的坐标,表示图像在点处的像素值;为模板窗口的中心坐标点,对应的像素值为;为高斯函数的标准差。
一般将权值称为值域核,或
像素值域(range domain R)
,不管是值域核还是空间域核,其大小都在[0 1]之间
- (3)将上述两个模板相乘就得到了双边滤波器的模板权值:
因此,双边滤波器的数据公式可以表示如下:
2. 双边滤波(Bilateral filter)理解
双边滤波(Bilateral filter)其综合了高斯滤波器(Gaussian Filter)和α-截尾均值滤波器(Alpha-Trimmed mean Filter)的特点,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉α%的最小值和最大值后再计算均值。
2.1 空域权重和值域权重的意义:
- 空域权重衡量的是 两点之间的距离,距离越远权重越低;
- 值域权重衡量的是 两点之间的像素值相似程度,越相似权重越大
这里从图像的平坦区域和边缘区域定性分析双边滤波的降噪效果
- 在平坦区域,临近像素的像素值的差值较小,对应值域权重接近于1,此时空域权重起主要作用,相当于直接对此区域进行高斯模糊。因此,平坦区域相当于进行高斯模糊。
- 在边缘区域,临近像素的像素值的差值较大,对应值域权重接近于0,导致此处核函数下降(因),当前像素受到的影响就越小,从而保持了原始图像的边缘的细节信息。
3. Opencv双边滤波函数:
opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:
void cv::bilateralFilter(InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
- InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
- OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
- int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
- double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 (这个参数可以理解为值域核的)
- double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace. (这个参数可以理解为空间域核的)
- int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。
对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。
如果想要尽量保留边缘那么sigmaColor不应该太大(否则会导致领域像素内,差值较大的像素被包含进来计算),这时我们可以考虑增大d,和sigmaSpace的值来滤波,当然我们还可以先将sigmaColor调整大一点,之后再通过拉普拉斯算子做下边缘的增强
图像美白示例代码:
import cv2 as cv
import numpy as npdef bi_demo(image):dst = cv.bilateralFilter(image, 0, 50, 10)cv.imshow("bi_demo", dst)print("--------- Hello Python ---------")
src = cv.imread("/home/jon/opencv-python-picture/example.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
bi_demo(src)
cv.waitKey(0)cv.destroyAllWindows()
卡通图像示例代码:
import cv2 as cv
import numpy as npdef bi_demo(image):dst = cv.bilateralFilter(image, 0, 150, 150)cv.imshow("bi_demo", dst)print("--------- Hello Python ---------")
src = cv.imread("/home/jon/opencv-python-picture/example.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
bi_demo(src)
cv.waitKey(0)cv.destroyAllWindows()
OpenCV双边滤波解决实现图像的美白相关推荐
- 【python】opencv双边滤波
对于磨皮这种复杂的图像处理,用scipy这种科学计算包显然会比较复杂,故而使用神器opencv pip install opencv-python 磨皮的本质就是将表面变得模糊,然而直接使用模糊会让轮 ...
- opencv 双边滤波算法(Bilateral Filters)原理及实现
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单.非迭代.局部处理的特点.之所以能够达到保边去噪的滤波效 ...
- OpenCV 双边滤波
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None) src:源图像,需要为8位或者浮点型单通道 ...
- OpenCV双边滤波bilateralFilter去除脸部雀斑
<OpenCV系列教程> <深度学习-如何提高数据集质量> 源码下载45-BilateralFilter.py 先展示一下效果: 通过多次调大,sigmaColor和sigma ...
- OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换
OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...
- 【OpenCV 例程200篇】60. 非线性滤波—联合双边滤波
[OpenCV 例程200篇]60. 非线性滤波-联合双边滤波(Joint bilateral filter) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白 ...
- OpenCV入门系列 —— bilateralFilter双边滤波
OpenCV入门系列 -- bilateralFilter双边滤波 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也 ...
- OpenCV实现双边滤波
双边滤波的数学原理在其他博客中很容易找到,再此不在赘述.仅仅记录一下自己对这个滤波器功能的一些总结. 个人觉得这个滤波器十分优美和简洁,其特点: 双边滤波同时考虑了空间(像素距离)和像素值层面的因素. ...
- [学习opencv]高斯、中值、均值、双边滤波
以前的时候,为了过滤图像中的一些噪点,学过一些简单的滤波,比如中值滤波,均值滤波,也是自己实现的. 在opencv中有现成的函数可以调用,实现滤波的操作. 函数的原型如下: CVAPI(void) c ...
- 数字图像处理——双边滤波
双边滤波python实现 文章目录 双边滤波python实现 前言 一.去噪算法 二.双边滤波算法背景介绍 三.双边滤波算法原理 四.开发环境 五.实验内容 六.实验代码 七.实验结果 前言 双边滤波 ...
最新文章
- RedHat9.0下载地址
- Java集合容器全面分析
- Android第三十三天
- 【Java】Java Socket编程(1)基本的术语和概念
- Servlet-三大域对象
- 【C语言】排序(算法基础)
- [转]亚稳态和毛刺 - Metastability and Hazard(CN)
- AJAX设置光标离开自动提交,Ajax自动提交和刷新页面
- Eclipse插件Ant里运用ftp遇到的问题
- PaddleOCR文字识别使用
- 应考虑字节顺序(大小端问题)的几种情况
- Atitit nodejs js 获取图像分辨率 尺寸 大小 宽度 高度
- 强化学习之AC、A2C和A3C
- Linux内核关键数据结构,Linux内核数据结构:Radix 树
- Ctone T01双卡双待Android 2.2的3.5英寸电容式多点触摸的GSM智能手机带GPS无线上网
- 【Web3】什么是Web3?一个新的去中心化网络,或是最新的营销流行语
- No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instanc
- python数据库-6
- 数据库连接池 ( 五 ) Druid 数据监控
- 账本App的制作教程
热门文章
- MySQL:unknown variable #39;master-host=masterIP#39; [ERROR] Aborting
- 所闻所获3:下拉刷新控件1
- java生成随机验证图片的实现
- C算法及PHP学习笔记_01
- python数据包pandas_python | 数据分析(二)- Pandas数据包
- Redis常见的5种不同的数据类型详解
- 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)...
- 精益企业中架构师的角色
- Metaweblog在Android上使用
- 2019-4-25 数组操作方法和练习