【OpenCV 4】高斯双边模糊与图像均值迁移模糊
程序员文章站
2022-07-14 11:35:44
...
代码及文字说明
import cv2 as cv
import numpy as np
“”"
1、OpenCV 中双边模糊的函数为:bilateralFilter()
void bilateralFilter( InputArray src, //(原始图像:8-bit或floating-point,1-channel或3-channel)
OutputArray dst, // 目标图像:size和type与原始图像相同
int d, // 过滤期间使用的各像素邻域的直径
double sigmaColor, // 色彩空间的sigma参数,该参数较大时,各像素邻域内相距较远的颜色会被混合到一起,从而造成更大范围的半相等颜色
double sigmaSpace, // 坐标空间的sigma参数,该参数较大时,只要颜色相近,越远的像素会相互影响
int borderType = BORDER_DEFAULT // 边界类型:指定如何确定图像范围外的像素的取值(在处理边缘像素时)
);
关于2个sigma参数
简单起见,可以令2个sigma的值相等;
如果他们很小(小于10),那么滤波器几乎没有什么效果;
如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化;
关于参数d
过大的滤波器(d>5)执行效率低。
对于实时应用,建议取 d=5;
对于需要过滤严重噪声的离线应用,可取 d=9;
d>0 时,由 d 指定邻域直径;
d<=0 时,d 会自动由 sigmaSpace 的值确定,且 d 与 sigmaSpace 成正比
“”"
def bi_demo(image):
dst = cv.bilateralFilter(image, 0, 100, 15)
cv.imshow("bi_demo", dst)
"""
2、图像均值迁移模糊:
均值迁移模糊是图像边缘保留滤波算法中一种,经常用来在对图像进行分水岭分割之前去噪声,可以大幅度提升分水岭分割的效果。它的基本原理是:
对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。
可以利用均值偏移算法的这个特性,实现彩色图像分割,Opencv中对应的函数是pyrMeanShiftFiltering。
这个函数严格来说并不是图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。
OpenCV 中的 pyrMeanShiftFiltering()函数:
void pyrMeanShiftFiltering( InputArray src, OutputArray dst,
double sp, double sr, int maxLevel = 1,
TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );
第1个参数 src:输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可。
第2个参数 dst:输出图像,跟输入src有同样的大小和数据格式。
第3个参数 sp,定义的漂移物理空间半径大小。
第4个参数 sr:定义的漂移色彩空间半径大小。
第5个参数 maxLevel:定义金字塔的最大层数。
第6个参数 termcrit:定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合。
pyrMeanShiftFiltering函数的执行过程是这样的:
1. 迭代空间构建:
以输入图像上src上任一点P0为圆心,建立物理空间上半径为sp,色彩空间上半径为sr的球形空间,物理空间上坐标2个—x、y,色彩空间上坐标3个—R、G、B(或HSV),构成一个5维的空间球体。
其中物理空间的范围x和y是图像的长和宽,色彩空间的范围R、G、B分别是0~255。
2. 求取迭代空间的向量并移动迭代空间球体后重新计算向量,直至收敛:
在1中构建的球形空间中,求得所有点相对于中心点的色彩向量之和后,移动迭代空间的中心点到该向量的终点,并再次计算该球形空间中所有点的向量之和,如此迭代,直到在最后一个空间球体中所求得的向量和的终点就是该空间球体的中心点Pn,迭代结束。
3. 更新输出图像dst上对应的初始原点P0的色彩值为本轮迭代的终点Pn的色彩值,如此完成一个点的色彩均值漂移。
4. 对输入图像src上其他点,依次执行步骤1,、2、3,遍历完所有点位后,整个均值偏移色彩滤波完成。
在这个过程中,关键参数是sp和sr的设置,二者设置的值越大,对图像色彩的平滑效果越明显,同时函数耗时也越多。
“”"
def shift_demo(image):
dst = cv.pyrMeanShiftFiltering(image, 10, 50)
cv.imshow("shift_demo", dst)
print("--------- Hello Python ---------")
src = cv.imread("E:/ji_qi_xue_xi/opencv_kejian/opencv_python_image/example.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
bi_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()