1. 导向滤波算法

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

2. 快速导向滤波算法

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

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

3. 代码

import cv2,math
import numpy as np
import pycuda.gpuarray as gpuarray
import pycuda.cumath as cumath
import pycuda.autoinitdef guideFilter(I, p, winSize, eps):"""导向图像(Guidance Image) I,滤波输出图像(Filtering Input Image) p,均值平滑窗口半径 r,正则化参数 e。利用导向滤波进行图像平滑处理时,通常令p=I。其中:guideFilter()函数调用opencv自带的库函数blur() 进行均值平滑。:param I::param p::param winSize::param eps::return:"""# 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 qdef FastguideFilter(I, p, winSize, eps, s):"""快速导向滤波通过下采样减少像素点,计算mean_a & mean_b后进行上采样恢复到原有的尺寸大小。假设缩放比例为s,那么缩小后像素点的个数为N/s^2,那么时间复杂度变为O(N/s^2)fmean代表均值平滑,fsubsample代表图像下采样即缩小图像,fupsample代表图片上采样即放大图像,s为缩小系数。:param I::param p::param winSize::param eps::param s::return:"""# 输入图像的高、宽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"""
下图导向滤波采用了r=16也就是winSize=(16,16), eps=0.01的参数大小。
快速导向滤波采用了r=16也就是winSize=(16,16), eps=0.01,s=0.5的参数大小。
"""
def run():image = cv2.imread(r'/home/cheng/Documents/practice_py/cv/face03.png', cv2.IMREAD_ANYCOLOR)#将图像归一化image_0_1 = image/255.0#导向滤波(三通道)b, g, r = cv2.split(image_0_1)# 1.753212477# 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))# 0.944390349gf1 = FastguideFilter(b, b, (16, 16), math.pow(0.1, 2),s=0.5)gf2 = FastguideFilter(g, g, (16, 16), math.pow(0.1, 2),s=0.5)gf3 = FastguideFilter(r, r, (16, 16), math.pow(0.1, 2),s=0.5)gf = cv2.merge([gf1, gf2, gf3])#保存导向滤波结果gf = gf*255gf[gf>255] = 255gf = np.round(gf)gf = gf.astype(np.uint8)res = np.hstack((image,gf))cv2.imshow("res",res)cv2.imwrite(r'/home/cheng/Documents/practice_py/cv/resface03.png.jpg', gf)cv2.waitKey(0)def gpu_run():image = gpuarray.to_gpu(cv2.imread(r'/home/cheng/Documents/practice_py/cv/face03.png', cv2.IMREAD_ANYCOLOR))#将图像归一化image_0_1 = image/255.0#导向滤波(三通道)b, g, r = image_0_1[:,:,0],image_0_1[:,:,1],image_0_1[:,:,2]# 1.753212477# 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))# 0.944390349gf1 = FastguideFilter(b, b, (16, 16), math.pow(0.1, 2),s=0.5)gf2 = FastguideFilter(g, g, (16, 16), math.pow(0.1, 2),s=0.5)gf3 = FastguideFilter(r, r, (16, 16), math.pow(0.1, 2),s=0.5)gf = cv2.merge([gf1, gf2, gf3])#保存导向滤波结果gf = gf*255gf[gf>255] = 255gf = np.round(gf)gf = gf.astype(np.uint8)res = np.hstack((image,gf))cv2.imshow("res",res)cv2.imwrite(r'/home/cheng/Documents/practice_py/cv/resface03.png.jpg', gf)cv2.waitKey(0)def costtime(func):# time startt1 = cv2.getTickCount()func()# time endt2 = cv2.getTickCount()# 计算执行秒数,利用getTickFrequency()获取时钟频率t = (t2 - t1) / cv2.getTickFrequency()print(t)if __name__ == "__main__":# costtime(gpu_run)costtime(run)

补充:导向滤波(Guided Filter)的解析与实现

4. 最后

导向滤波算法原理与代码相关推荐

  1. a*算法matlab代码_导向滤波算法及其matlab代码实现

    导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...

  2. burg算法的matlab代码实现_导向滤波算法及其matlab代码实现

    导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...

  3. 导向滤波算法——OpenGL实现

    导向滤波 一.介绍 导向滤波又称引导滤波,通过一张引导图片反映边缘.物体等信息,对输入图像进行滤波处理,使输出图像的内容由输入图像决定,但纹理与引导图片相似. 导向滤波的原理是局部线性模型,在保持双边 ...

  4. 导向滤波算法 java_一种基于双通道先验和侧窗导向滤波的单幅图像去雾方法与流程...

    本发明属于计算机图像处理的领域,用于图像或者视频去雾等相关领域:具体涉及一种基于双通道先验和侧窗导向滤波的单幅图像去雾方法. 背景技术: 图像采集过程中,由于雾天的影响,使得景物的能见度大幅降低,再加 ...

  5. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  6. SSD算法原理与代码(三)

    说明:这几篇文章是讲解SSD,从算法原理.代码到部署到rk3588芯片上的过程.环境均是TF2.2,具体的安装过程请参考网上其他的文章. 一.SSD简介 SSD算法是一个优秀的one-stage目标检 ...

  7. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  8. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  9. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  10. 一阶RC低通滤波算法原理与实现

    文章目录 1. 一阶低通滤波算法原理 2. 一阶滤波算法的特点 3. 基本算法的例程 4. 优化:减少乘.除的运算次数以提高运算速度 5. 改进:动态调整滤波系数 动态调整滤波例程 本文整理自网络,参 ...

最新文章

  1. 《科学》十大年度科学突破反映的新动向
  2. keras终止训练后显存不释放_Keras实现Large-scale Bisample Learning on ID vs. Spot Face Recognition...
  3. 【直播回放】80分钟剖析GAN如何从各个方向提升图像的质量
  4. xhprof的简单使用
  5. Java AOP研究之@Aspect注解的工作原理
  6. osip2 代码分析
  7. MySQL 主从复制 复制过滤
  8. 如何将access数据库导入到sql2005数据库中
  9. JavaCV 第一个JavaCV程序
  10. python报错Statements must be separated by newlines or semicolons解决方法
  11. word里表格斜线怎么弄
  12. 思科交换机关闭服务端口
  13. java 龙卷风_龙卷风在大约37000个请求后停止响应
  14. win7网上邻居_win7系统关闭电脑端口的操作方法
  15. 【已解决】【V3版本】如何使用脚本关闭Win10自动更新服务并阻止其自动启动?
  16. MATLAB与DSP(C6657)的TCP/IP通信实现
  17. VB、C#等高级语言与三菱PLC(Q系列、L系列、FX系列)串口、以太网通讯的DLL及源代码
  18. 石康,你别再让我越来越厌恶了,行不行
  19. 设计模式(二)23种设计模式
  20. 设置SVN忽略文件和目录(文件夹)

热门文章

  1. 基于Basys2的数码管动态扫描module(verilog)的模块化设计
  2. 【8001】解决打开idea出现红色感叹号报错信息Cannot find keymap Windows copy?
  3. Docker安装、开发环境配置及项目搭建(二,Docker桌面应用)
  4. lattice diamond 安装及获取license方法
  5. 最新免费ip代理分享
  6. c++最大公因数与最小公倍数求法
  7. html 标签的语义化
  8. 关于对象中的this指向和修改this指向问题。
  9. 决定局域网特性的三要素
  10. 怎样让机器有人类思维