本文共 2517 字,大约阅读时间需要 8 分钟。
本文对OpenCV中高斯双边模糊以及均值迁移的API及原理做浅析
我们可以在各种美颜软件中找到类似于磨皮,蜡像等效果,他们具体是怎么实现的呢,就要从文章要说的两个方法说起了。。。。
之前的文章已经详解过了高斯模糊的原理,利用高斯模糊可以对图像实现一定的模糊效果,如下。 但是也可以发现,该操作仅仅是做到了对图像的模糊,保留了图像的部分特征,但是它的边缘特征却变得很差,因此它是无法实现对人脸的磨皮等效果的。今天我们来看高斯双边模糊及均值迁移。首先,既然牵扯上高斯了,那么这必然和数学脱不开关系,但是本篇文章不讲驳杂的数学公式,(主要是我也没那底子。😂)
高斯双边模糊与高斯模糊最明显的差别就是保留了边缘特征,什么叫保留了边缘特征,也就是 对于如下图片,可以将其鼻子的边缘保留下来,在使用高斯模糊的时候,是这样的。↓ 右图显然让图片变得更模糊了,没有起到美颜的效果反而丢失了整体的美感。 在看高斯双边模糊可以看到它不仅去除了雀斑还保留了整体的美感。这就是高斯双边滤波实现的功能接下来我们从原理角度浅析高斯双边滤波。
它名为高斯滤波自然是脱离不开高斯模糊的原理的,但是它为什么能保留边缘特征呢,这说明高斯双边滤波还考虑了在图像的空间的颜色差异范围或者说考虑了空间的高斯函数,高斯核在图像上移动时,如果遇到很大的颜色落差(或者说对比度很大)的范围图像域时,会截断一部分高斯核的操作,一般来说如下图:
高斯核路过该区域时会保留落差很大的那部分,避免对其操作,但是高斯模糊又是在不断进行的,因此经个人分析来看,高斯双边模糊应该是进行了两个操作,一个是高斯模糊,一个是边缘保留,其边缘保留必然有其自己的算法,这里应该涉及到后面的内容了,那就后面细讲了。 这是官方文章的内容,与我的猜测一致,嘿嘿。接下来我们看代码的层间,以及参数的解析。
import cv2 as cv import numpy as np#加载图像def load_image(): src=cv.imread('bi.jpg') cv.imshow('input',src) return srcdef 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_2def 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()
结果如下:
设置了两张图做对比同时对参数分析,重点方法就那一个:
rec_1=cv.bilateralFilter(src,0,100,40)均值迁移模糊,其整个过程也就是这三个词了,均值,迁移,模糊,它是通过迁移的方法来实现模糊效果的,迁移的方向是由均值确定的,这里要细说。该算法着重点在两个窗口,即物理窗口和色彩空间窗口,他利用物理窗口求dx,dy也就是梯度,同时利用RGB色彩空间进行均值计算求新的RGB,之后利用dx和dy求得迁移的方向和距离,然后进行新的一轮计算,知道达到终止条件即收敛。
import cv2 as cv import numpy as np#加载图像def load_image(): src=cv.imread('bi.jpg') cv.imshow('input',src) return srcdef mean_move(): src=load_image() rec=cv.pyrMeanShiftFiltering(src,20,30) return recdef 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()
效果如下:
可以看到其实现了一个油画般的美化,其实本质上是做了一些像素点的合并,用在小区域内,用大范围颜色吞噬了小范围颜色。重点方法:rec=cv.pyrMeanShiftFiltering(src,20,30)
这篇文章主要是从浅显的角度分析了高斯双边模糊和均值迁移的原理及代码,没有驳杂的数学公式,但不妨碍理解,当然数学方面最后还是要搞懂的。也不能忽视。只不过从操作的角度来说,数学反而没有那么重要了。
转载地址:http://ikcki.baihongyu.com/