opencv3 - 3滤波


滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号。
其中像素点灰度值的高低代表信号的强弱。
高频:图像中灰度变化剧烈的点。
低频:图像中平坦的,灰度变化不大的点。

根据图像的高频与低频的特征,我们可以设计相应的高通与低通滤波器。

  • 高通滤波:可以检测图像中尖锐、变化明显的地方(锐化图像)
  • 低通滤波:可以让图像变得光滑,滤除图像中的噪声(平滑图像)

线性滤波

均值模糊

不能很好的保留图像的细节。

dst = cv.blur(src, ksize)

ksize - 用于平滑操作的核的大小。
(1, 15)水平模糊, 1*15的矩阵
(15, 1)垂直模糊

dst = cv.blur(image, (30, 1)) 

blur()平滑图像的函数,它用一个点邻域内像素的平均灰度值来代替该点的灰度
平滑模糊、高斯模糊这两个滤波器,都是邻域内的像素按照一个权重相加,最后设置为当前点的灰度值,这种操作又称为卷积。
这样的滤波器叫线性滤波器,另外还有一种非线性的滤波器,比如中值滤波器,它是取邻域内所有像素的中值作为当前点的灰度值。

高斯模糊

高斯滤波是指用高斯函数作为滤波函数的滤波操作,高斯模糊就是高斯低通。越靠近该像素的点提供越高的权重,计算平均值作为插值。
ksize高斯内核的大小,其中ksize.height和size.width可以不同,但是必须为正数&&奇数,或者是0(由sigma计算而来)
double类型的sigmaX,表示高斯核函数在X轴方向的标准偏差。
double类型的sigmaY,表示高斯核函数在Y轴方向的标准偏差。
若为0则设为sigmaX;两者都为0则由ksize.height和size.width计算出来。

高斯随机噪声图片:

numpy.random.normal(loc=0.0, scale=1.0, size=None)

loc:float此概率分布的均值(对应着整个分布的中心centre)
scale:float此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints

非线性滤波

中值滤波

https://blog.csdn.net/weixin_37720172/article/details/72627543
取邻域内所有像素的中值作为当前点的灰度值。
可用于去掉椒盐噪声,脉冲噪声,又能保留图像的边缘细节。
(花费时间是均值滤波的五倍以上)对细节(细、尖顶)很多的图像不太合适。

dst = cv.medianBlur(image, 5)

ksize参数表示滤波窗口尺寸,必须是奇数并且大于1。比如这里是5,中值滤波器就会使用5×5的范围来计算,即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。

双边滤波

Bilateral filter结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性。

  • edge preserving
    比高斯滤波多了一个高斯方差sigma-d
    边缘保留滤波Edge Preserving Filter
    高斯双边
    差异很大,就是显著特征,会被平滑掉

双边滤波函数
可以在保证边界清晰的情况下,有效的去掉噪声。考虑了图像空间关系,也考虑了灰度关系。双边滤波同时使用了空间高斯权重、灰度相似性高斯权重,确保了边界不会被模糊掉。

cv2.bilateralFilter(img,d,’p1’,’p2’)

d是领域的直径,
空间高斯函数标准差
灰度值相似性高斯函数标准差

用户自定义模糊

dst = cv.filter2D(src, ddepth, kernel)

ddepth
表示目标图像深度,输入值为-1时,目标图像和原图像深度保持一致

kernel
卷积核(或者是相关核),一个单通道浮点型矩阵。修改kernel矩阵即可实现不同的模糊。
https://www.cnblogs.com/hihilary/archive/2012/11/27/2777973.html
通道表示每个点能存放多少个数,类似于BGR彩色图中的每个像素点有三个值,即三通道的。
图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8。

def customer_blur_demo(image):
    # kernel = np.ones([5, 5], np.float32)/25
    # [0, -1, 0], [-1, 5, -1], [0, -1, 0]
    # [1, 1, 1], [1, 1, 1], [1, 1, 1]/9
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
    dst = cv.filter2D(image, -1, kernel)
    cv.imshow("customer_blur", dst)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值