版本:Python:2.7.15  OpenCV:2.4.13

导向滤波算法原理

原理可以看博主:白马负金羁 的文章导向滤波(Guided Filter)的解析与实现,对原理解释十分通俗易懂。


导向滤波:

1.实现的伪代码:

导向图像(Guidance Image) I,滤波输出图像(Filtering Input Image) p,均值平滑窗口半径 r,正则化参数 e。

利用导向滤波进行图像平滑处理时,通常令p=I。

2.opencv库代码实现:

其中:guideFilter()函数调用opencv自带的库函数blur() 进行均值平滑。

def guideFilter(I, p, winSize, eps):#I的均值平滑mean_I = cv2.blur(I, winSize)#p的均值平滑mean_p = cv2.blur(p, winSize)#I*I和I*p的均值平滑mean_II = cv2.blur(I*I, winSize)mean_Ip = cv2.blur(I*p, winSize)#方差var_I = mean_II - mean_I * mean_I #方差公式#协方差cov_Ip = mean_Ip - mean_I * mean_pa = cov_Ip / (var_I + eps)b = mean_p - a*mean_I#对a、b进行均值平滑mean_a = cv2.blur(a, winSize)mean_b = cv2.blur(b, winSize)q = mean_a*I + mean_breturn q

3.结果对比:

下图采用了r=16也就是winSize=(16,16), eps=0.01的参数大小。


快速导向滤波

通过下采样减少像素点,计算mean_a & mean_b后进行上采样恢复到原有的尺寸大小。

假设缩放比例为s,那么缩小后像素点的个数为N/s^2,那么时间复杂度变为O(N/s^2)

1.实现的伪代码:

fmean代表均值平滑,fsubsample代表图像下采样即缩小图像,fupsample代表图片上采样即放大图像,s为缩小系数。

2.opencv库代码实现:

这里使用opencv自带库函数resize()进行上下采样

def guideFilter(I, p, winSize, eps, s):#输入图像的高、宽h, w = I.shape[:2]#缩小图像size = (int(round(w*s)), int(round(h*s)))small_I = cv2.resize(I, size, interpolation=cv2.INTER_CUBIC)small_p = cv2.resize(I, size, interpolation=cv2.INTER_CUBIC)#缩小滑动窗口X = winSize[0]small_winSize = (int(round(X*s)), int(round(X*s)))#I的均值平滑mean_small_I = cv2.blur(small_I, small_winSize)#p的均值平滑mean_small_p = cv2.blur(small_p, small_winSize)#I*I和I*p的均值平滑mean_small_II = cv2.blur(small_I*small_I, small_winSize)mean_small_Ip = cv2.blur(small_I*small_p, small_winSize)#方差var_small_I = mean_small_II - mean_small_I * mean_small_I #方差公式#协方差cov_small_Ip = mean_small_Ip - mean_small_I * mean_small_psmall_a = cov_small_Ip / (var_small_I + eps)small_b = mean_small_p - small_a*mean_small_I#对a、b进行均值平滑mean_small_a = cv2.blur(small_a, small_winSize)mean_small_b = cv2.blur(small_b, small_winSize)#放大size1 = (w, h)mean_a = cv2.resize(mean_small_a, size1, interpolation=cv2.INTER_LINEAR)mean_b = cv2.resize(mean_small_b, size1, interpolation=cv2.INTER_LINEAR)q = mean_a*I + mean_breturn q

3.结果对比:

下图导向滤波采用了r=16也就是winSize=(16,16), eps=0.01的参数大小。  

快速导向滤波采用了r=16也就是winSize=(16,16), eps=0.01,s=0.5的参数大小。

从结果上看二者的滤波结果别无二致,但是运行时间有所降低。


代码运行注意

1.输入图像必须归一化

image = cv2.imread(r'C:\Users\1.jpg', cv2.IMREAD_ANYCOLOR)
#将图像归一化
image_0_1 = image/255.0

2.图像保存问题

导向滤波返回的是灰度值范围在[0,1]之间的图像矩阵,像保存8位图要先乘255,再转换数据类型。

#保存导向滤波结果
gf = gf*255
gf[gf>255] = 255
gf = np.round(gf)
gf = gf.astype(np.uint8)
cv2.imwrite(r'C:\Users\2.jpg', gf)

3.关于cv2.resize()函数

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst 

参数说明:

src - 原图

dst - 目标图像。

当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同

dsize - 目标图像大小。

当dsize为0时,它可以通过以下公式计算得出:

所以,参数dsize和参数(fx, fy)不能够同时为0

fx - 水平轴上的比例因子。当它为0时,计算公式如下:

fy - 垂直轴上的比例因子。当它为0时,计算公式如下:

interpolation - 插值方法:

1)INTER_NEAREST - 最近邻插值法

2)INTER_LINEAR - 双线性插值法(默认)

3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。

4)INTER_CUBIC - 基于4x4像素邻域的3次插值法

5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

4.多通道处理

本文的两个滤波函数只能对单一通道进行处理,如果是多通道,需要split()函数将原图分为RGB三张图,然后分别进行滤波,然后再用merge()函数将三张图合为一张。

#导向滤波(三通道)
b, g, r = cv2.split(image_0_1)
gf1 = guideFilter(b, b, (16,16), math.pow(0.1,2))
gf2 = guideFilter(g, g, (16,16), math.pow(0.1,2))
gf3 = guideFilter(r, r, (16,16), math.pow(0.1,2))
gf = cv2.merge([gf1, gf2, gf3])

5.计算函数运行时间

# time start
t1 = cv2.getTickCount()"""
代码段落
"""
# time end
t2 = cv2.getTickCount()#计算执行秒数,利用getTickFrequency()获取时钟频率
t = (t2-t1)/cv2.getTickFrequency()
print t

Opencv-Python-导向滤波快速导向滤波相关推荐

  1. 导向滤波快速导向滤波及引导图的选择

    引导图的选择 我主要说的导向滤波其中的引导图选择问题. 百度百科的定义 : 导向图滤波是一种图像滤波技术 ,通过一张引导图G(导向图),对目标图像P(输入图像)进行滤波处理,使得最后的输出图像大体上与 ...

  2. 快速导向滤波 matlab,导向滤波小结:从导向滤波(guided filter)到快速导向滤波(fast guide filter)的原理,应用及opencv实现代码...

    http://blog.csdn.net/kuweicai/article/details/78385871 1. 导向滤波简介 导向滤波是何凯明在学生时代提出的一个保边滤波(edge-preserv ...

  3. 导向滤波小结:从导向滤波(guided filter)到快速导向滤波(fast guide filter)的原理,应用及opencv实现代码

    1. 导向滤波简介 导向滤波是何凯明在学生时代提出的一个保边滤波(edge-preserving smoothing)算法.何凯明在cv圈应该算是名人了,学生时代关于图像去雾的研究就以第一作者的身份获 ...

  4. 详解——导向滤波(Guided Filter)和快速导向滤波

    文章目录 导读 原理推导 导向滤波的应用 导向滤波的实现 快速导向滤波的实现 算法效果 代码 参考 导读 在图像滤波算法中,导向滤波.双边滤波.最小二乘滤波并称三大保边滤波器,他们是各向异性滤波器.相 ...

  5. 导向滤波python_导向滤波(Guided Filter)简要介绍

    1.介绍 提到导向滤波,首先想到的是"何恺明",他的确是真大神,在图像领域,是中国人的骄傲,深度学习流行的时候,也是提出各种新算法,比如ResNets,而最近两年,深度学习的发展已 ...

  6. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  7. 【图像处理】——图像滤波(Python+opencv实现三种方法:均值滤波、中值滤波、高斯滤波等)

    目录 一.什么是滤波以及滤波的目的? 二.均值滤波(cv2.blur()) 1.原理 2.关键代码 3.封装代码 二.中值滤波(cv2.medianBlur()) 1.原理 2.关键代码 3.封装代码 ...

  8. 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  9. opencv python高斯滤波

    OpenCV是一个开源的计算机视觉库,提供了很多用于图像处理和计算机视觉的工具.它可以通过 Python 进行访问.高斯滤波是一种常用的图像平滑处理方法,用于去除图像中的噪声和模糊不清的细节. 在 O ...

最新文章

  1. java.sql.SQLException: Lock wait timeout exceeded
  2. Android Studio对于Java8特性的支持
  3. Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules
  4. VS2010下安装配置OpenCV2.4.4
  5. 微信已停止访问该网页怎么解决
  6. HDU4353(找一个三角形面积与它里面包含点的比值最小)
  7. Ionic混合移动app框架学习
  8. crontab -e 怎么保存后退出?
  9. React 第五章 state 组件生命周期
  10. Aspose.Words.dll根据模板生成word详解
  11. 无数本高清古籍善本下载,200多个G
  12. linux 安装Elasticsearch
  13. unity Animator 同时播放两个动画,并动态更换Animator中的AnimationClip
  14. 技术美术自学——PBR材质通道基础 常见贴图种类列举(求dalao轻喷)
  15. 神仙打架看不懂?用人话解读NIPS神经网络攻防赛清华三连冠团队模型算法
  16. 人人皆可操作的108个抖音项目:汽车领域细分及玩法变现 (7)
  17. 武汉意向岗位(一)——中国建设银行数据运营中心
  18. Visual Studio 2019 下载地址
  19. 八大实用的中国电子地图
  20. 老笔记本 android,利用旧笔记本电脑,变身为 Android 电脑

热门文章

  1. java根据某天获取当前周的日期
  2. c #点击按钮下载excel文件
  3. 知网论文caj怎么转化成word
  4. 【HTML基础-1】HTML标签简介及常用标签
  5. 计算机应用技术专业硕士学位,南华大学计算机应用技术专业硕士学位研究生培养方案...
  6. C/C++订餐管理系统
  7. Linux从图形界面切换到文本界面快捷键不好用的解决方法
  8. 应用程序正常初始化(0xc0000005)失败
  9. 科学计数法计算机怎么输,如何打印在Lua一个庞大的数字,而无需使用科学记数法?...
  10. 如何做好企业级存储产品的测试