python-OpenCV自学,对高斯双边滤波,均值迁移的代码及原理浅析。

本文对OpenCV中高斯双边模糊以及均值迁移的API及原理做浅析



引言

我们可以在各种美颜软件中找到类似于磨皮,蜡像等效果,他们具体是怎么实现的呢,就要从文章要说的两个方法说起了。。。。
之前的文章已经详解过了高斯模糊的原理,利用高斯模糊可以对图像实现一定的模糊效果,如下。
在这里插入图片描述但是也可以发现,该操作仅仅是做到了对图像的模糊,保留了图像的部分特征,但是它的边缘特征却变得很差,因此它是无法实现对人脸的磨皮等效果的。今天我们来看高斯双边模糊及均值迁移。

一. 高斯双边模糊(高斯双边滤波)

1. 高斯双边模糊是什么,怎么实现的。

首先,既然牵扯上高斯了,那么这必然和数学脱不开关系,但是本篇文章不讲驳杂的数学公式,(主要是我也没那底子。😂)
高斯双边模糊与高斯模糊最明显的差别就是保留了边缘特征,什么叫保留了边缘特征,也就是
在这里插入图片描述
对于如下图片,可以将其鼻子的边缘保留下来,在使用高斯模糊的时候,是这样的。↓
在这里插入图片描述右图显然让图片变得更模糊了,没有起到美颜的效果反而丢失了整体的美感。
在看高斯双边模糊
在这里插入图片描述

可以看到它不仅去除了雀斑还保留了整体的美感。这就是高斯双边滤波实现的功能接下来我们从原理角度浅析高斯双边滤波。

它名为高斯滤波自然是脱离不开高斯模糊的原理的,但是它为什么能保留边缘特征呢,这说明高斯双边滤波还考虑了在图像的空间的颜色差异范围或者说考虑了空间的高斯函数,高斯核在图像上移动时,如果遇到很大的颜色落差(或者说对比度很大)的范围图像域时,会截断一部分高斯核的操作,一般来说如下图:
在这里插入图片描述
高斯核路过该区域时会保留落差很大的那部分,避免对其操作,但是高斯模糊又是在不断进行的,因此经个人分析来看,高斯双边模糊应该是进行了两个操作,一个是高斯模糊,一个是边缘保留,其边缘保留必然有其自己的算法,这里应该涉及到后面的内容了,那就后面细讲了。
在这里插入图片描述这是官方文章的内容,与我的猜测一致,嘿嘿。

2. 代码层面

接下来我们看代码的层间,以及参数的解析。

import cv2 as cv 
import numpy as np

#加载图像
def load_image():
    src=cv.imread('bi.jpg')
    cv.imshow('input',src)
    return src

def gause_bi_blurry():
    src=load_image()
    rec_1=cv.bilateralFilter(src,0,100,40)
    rec_2=cv.bilateralFilter(src,0,150,10)
    return rec_1,rec_2
def show():
    src_1_1,src_1_2=gause_bi_blurry()
    cv.imshow('blurry_1',src_1_1)
    cv.imshow('blurry_2',src_1_2)
    cv.waitKey(0)
    cv.destroyAllWindows()

show()

结果如下:
在这里插入图片描述

3. 参数解析

设置了两张图做对比同时对参数分析,重点方法就那一个:
rec_1=cv.bilateralFilter(src,0,100,40)

  • rec_1:返回的图像
  • src:需要操作的图像
  • 0:这里是d,为高斯核操作的区域,如果为0,则利用最后一个参数计算,一般设置为0。
  • 100:这里是颜色差异范围的考虑,简单来说就是该参数越大越模糊,同时也意味着运算时间越长,因为颜色差异范围越大,则意味着会对更对的颜色进行操作,可用第二张图和第一张图进行对比,颜色的保留程度很明显。增大该值可去除更多平滑区域的噪音。尽量取大
  • 40:sigmaspace:该参数可以计算需要计算的像素域的大小,取的越大,则更多的像素进行计算,会增加巨量的运算任务,因此尽量就小图而言,尽量取的很小。越小则越模糊。

二. 均值迁移模糊

1. 均值迁移模糊是什么,浅析原理

均值迁移模糊,其整个过程也就是这三个词了,均值,迁移,模糊,它是通过迁移的方法来实现模糊效果的,迁移的方向是由均值确定的,这里要细说。该算法着重点在两个窗口,即物理窗口和色彩空间窗口,他利用物理窗口求dx,dy也就是梯度,同时利用RGB色彩空间进行均值计算求新的RGB,之后利用dx和dy求得迁移的方向和距离,然后进行新的一轮计算,知道达到终止条件即收敛。

2. 代码层面

import cv2 as cv 
import numpy as np

#加载图像
def load_image():
    src=cv.imread('bi.jpg')
    cv.imshow('input',src)
    return src
def mean_move():
    src=load_image()
    rec=cv.pyrMeanShiftFiltering(src,20,30)
    return rec
def show():
    #src_1_1,src_1_2=gause_bi_blurry()
    src_2=mean_move()
    cv.imshow('mean',src_2)
    cv.waitKey(0)
    cv.destroyAllWindows()

show()

效果如下:
在这里插入图片描述
可以看到其实现了一个油画般的美化,其实本质上是做了一些像素点的合并,用在小区域内,用大范围颜色吞噬了小范围颜色。

3. 参数说明

重点方法:rec=cv.pyrMeanShiftFiltering(src,20,30)

  • rec:得到的图像
  • src:原图像
  • 20:定义的物理空间半径大小
  • 30:定义的色彩空间半径大小,两者设置越大,效果越明显,但是耗时也越长
  • 最后还有两个参数为金字塔层数和迭代次数,一般不设置,默认为无。通过前两个参数计算就够了。

总结

这篇文章主要是从浅显的角度分析了高斯双边模糊和均值迁移的原理及代码,没有驳杂的数学公式,但不妨碍理解,当然数学方面最后还是要搞懂的。也不能忽视。只不过从操作的角度来说,数学反而没有那么重要了。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值