均值与滤波的缺点:并没有考虑中心像素点对整个输出像素的贡献,实际上锚定的那个点贡献应该是最大的
高斯滤波的缺点:当边缘值梯度很大的时候,应减少中心像素点的权重,而高斯滤波没有考虑
**边缘保留滤波,实质上是区分高斯模糊的做法,将相对于差别较大的像素点区域进行区分(即,边缘是像素差异最大的地方),而非一统地取权重。**
无论是均值还是高斯都是属于模糊卷积,模糊之后图像的边缘信息不复存在。
边缘保留滤波算法(EPF)通过卷积处理实现图像模糊的同时对图像边缘不会造成破坏,滤波之后的输出完整的保存了图像整体边缘(轮廓)信息。
边缘保留滤波:
高斯双边
均值迁移
高斯双边
高斯模糊是考虑图像空间位置对权重的影响,但是它没有考虑图像像素分布对图像卷积输出的影响,双边模糊考虑了像素值分布的影响,对像素值空间分布差异较大的进行保留从而完整的保留了图像的边缘信息。
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
dst = cv.bilateralFilter(src=img, d, sigmaColor, sigmaSpace)
src:原图像
d: 像素的领域直径,可由sigmaColor和sigmaColor计算得到
sigmaColor: 颜色空间的标准方差,一般越大越好
sigmaSpace: 坐标空间的标准方差(像素单位),一般越小越好
import cv2 as cv
import numpy as np
def bi_demo(img):
dst = cv.bilateralFilter(img, 0, sigmaColor=100, sigmaSpace=15)
# src:原图像
# d: 像素的领域直径,可由sigmaColor和sigmaColor计算得到
# sigmaColor: 颜色空间的标准方差,一般越大越好
# sigmaSpace: 坐标空间的标准方差(像素单位),一般越小越好
cv.imshow('dst',dst)
img = cv.imread('mazi.jpg')
cv.imshow('img',img)
bi_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()
均值迁移
均值偏移滤波处理,想当与把图片转油画的操作
基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。 通过均值迁移来进行边缘保留滤波有时会导致图像过度模糊。
图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。
cv.pyrMeanShiftFiltering(src=img, sp=15, sr=20)
src: 原图像
sp:空间窗的半径(The spatial window radius)
sr: 色彩窗的半径(The color window radius)
二者设置的值越大,对图像色彩的平滑效果越明显
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,遍历完所有点位后,整个均值偏移色彩滤波完成,这里忽略对金字塔的讨论。
原文链接:[https://blog.youkuaiyun.com/dcrmg/article/details/52705087]
import cv2 as cv
import numpy as np
def bi_demo(img):
dst = cv.bilateralFilter(img, 0, sigmaColor=100, sigmaSpace=15)
# src:原图像
# d: 像素的领域直径,可由sigmaColor和sigmaColor计算得到
# sigmaColor: 颜色空间的标准方差,一般越大越好
# sigmaSpace: 坐标空间的标准方差(像素单位),一般越小越好
cv.imshow('dst',dst)
def shift_demo(img,sp,sr):
dst = cv.pyrMeanShiftFiltering(img, sp, sr)
# src: 原图像
# sp:空间窗的半径(The spatial window radius)
# sr: 色彩窗的半径(The color window radius)
# 二者设置的值越大,对图像色彩的平滑效果越明显
cv.imshow('sdst',dst)
img = cv.imread('left_01.png')
cv.imshow('img',img)
# bi_demo(img)
shift_demo(img,10,10)
cv.waitKey(0)
cv.destroyAllWindows()