Python OpenCV学习之图像滤波详解

 更新时间:2022年01月07日 09:15:32   作者:一个热爱学习的深度渣渣  
图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像;明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积;实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数。下面来跟随小编一起深入了解一下图像滤波吧

背景

图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像;明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积;实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数;当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器;

一、卷积相关概念

卷积核大小一般为奇数的原因:

1、增加padding的原因;

2、保证锚点在中间,防止位置发生偏移;

卷积核大小的影响:卷积核越大,感受野越大,提取的特征越好,同时计算量也越大;

边界扩充(padding)作用:使得输出数据的尺寸与输入相等;

计算公式:

N = (W - F + 2P)/ S + 1

  • N:输出图像大小
  • W:原图大小
  • F:卷积核大小
  • P:扩充尺寸
  • S:步长大小

二、卷积实战

首先介绍两个简单的滤波:低通滤波与高通滤波;

低通滤波:低于阈值的可通过,去除噪音或平滑图像;

高通滤波:高于阈值的可 通过,用于边缘检测;

函数原型:

filter2D(src,ddepth,kernel,[anchor,delta,borderType])

ddepth:位深,一般设定为-1;

代码案例:

kernel = np.ones((5, 5), np.float32) / 25
result = cv2.filter2D(img, -1, kernel)

这是一个平均卷积,起到一个降噪的作用,但效果并不明显;

三、均值滤波

首先介绍一个方盒滤波,实际上就是全为1的卷积核乘以权重a;

函数原型:boxFilter(src,ddepth,ksize,anchor,normalize,borderType)

说明:当normalize为True时,乘以1/W*H,也就是均值滤波,所以一般不用这个滤波函数;

均值滤波函数原型:blur(src,ksize,[anchor,borderType])

注意:一般均值滤波就是使用这个API;

代码案例:

result = cv2.blur(img, 5)

四、高斯滤波

原理:越靠近中心,权重越大,离中心越远,权重越小;

函数原型:

GaussianBlur(img,kernel,sigmaX,[sigmaY,…])

说明:对效果有影响的参数为kernel和sigmaX,这两者越大图像平滑(模糊)的效果会越明显;

代码案例:

gauss = cv2.imread('gaussian.png')
result = cv2.GaussianBlur(gauss, (5, 5), 5)
cv2.imshow('org', gauss)
cv2.imshow('result', result)
cv2.waitKey(0)

从图中可看出,处理后高斯噪点减少了,但整体图像也变模糊了;

五、中值滤波

本质:取中间值作为卷积结果;

作用:对胡椒噪音有很好的处理效果;

函数原型:

medianBlur(img,ksize)

代码案例:

img = cv2.imread('papper.png')
result = cv2.medianBlur(img, 5)
cv2.imshow('org', img)
cv2.imshow('result', result)
cv2.waitKey(0)

从上图可以看出,效果是相当不错的;

六、双边滤波

作用:可以保留边缘,同时对边缘内的区域进行平滑处理;(主要进行美颜)

函数原型:

bilateralFilter(img,d,sigmaColor,sigmaSpace)

案例代码:

img = cv2.imread('1.jpg')
result = cv2.bilateralFilter(img, 9, 50, 50)
cv2.imshow('org', img)
cv2.imshow('result', result)
cv2.waitKey(0)

从图中可以看出,美颜效果是比较明显的,并且对于边缘轮廓也处于能接受范围;

七、Sobel算子

上述介绍的几种滤波均为低通滤波,接下来介绍高通滤波,最主要作用是检测边缘;

实现步骤:

x轴方向求导 —— y轴方向求导 —— 最终结果为二者相加

函数原型:

Sobel(src,ddepth,dx,dy,ksize=3,…)

代码案例:

chess = cv2.imread('chess.png')
# 求y方向边缘
dy = cv2.Sobel(chess, cv2.CV_64F, 1, 0, ksize=5)
# 求x方向边缘
dx = cv2.Sobel(chess, cv2.CV_64F, 0, 1, ksize=5)
# 二者相加
result = dy + dx

cv2.imshow('chess', chess)
cv2.imshow('dy', dy)
cv2.imshow('dx', dx)
cv2.imshow('result', result)
cv2.waitKey(0)

从上图可以明显看出,当dx设置为1时,求得y方向上的边缘信息,反之也是,最终二者相加的结果也就是Sobel算子的结果。不能一开始就设定dx,dy为1,这样子不能达到该效果;

八、Scharr算子

定义:与Sobel类似,但使用的kernel值不同,并且只能为3x3,只能求x方向或y方向一个方向的边缘信息;

函数原型:

Scharr(src,ddepth,dx,dy)

在这里就不演示了,该算子不常用,主要优点是能检测到不明显的边缘,当Sobel的ksize设置为-1时等同;

九、拉普拉斯算子

优点:可同时求得两个方向的边缘;

缺点:对噪音比较敏感,一般需要先进行去噪在调用拉普拉斯算子;

函数原型:

Laplacian(img,ddepth,ksize=1)

代码案例:

chess = cv2.imread('chess.png')
result = cv2.Laplacian(chess, cv2.CV_64F, ksize=5)

cv2.imshow('chess', chess)
cv2.imshow('result', result)
cv2.waitKey(0)

从效果上看,比起Sobel步骤更加简单,并且效果也比较好,缺点就是如果噪声过多的话效果会比较差;

十、Canny算法

实现步骤:

1、使用5x5高斯滤波消除噪音;

2、使用Sobel计算图像梯度的方向(0°、45°、90°、135°);

3、取局部极大值;

4、阈值计算;

函数原型:

Canny(img,minVal,maxVal,…)

其中的minVal和maxVal代表边缘的阈值,两者差值过大的话会损失一定的边缘信息;

代码案例:

img = cv2.imread('1.jpg')
result = cv2.Canny(img, 100, 200)

cv2.imshow('org', img)
cv2.imshow('result', result)
cv2.waitKey(0)

以上就是Python OpenCV学习之图像滤波详解的详细内容,更多关于Python OpenCV图像滤波的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Django搭建web服务器的例子(最最正确的方式)

    使用Django搭建web服务器的例子(最最正确的方式)

    今天小编就为大家分享一篇使用Django搭建web服务器的例子(最最正确的方式),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 选择Python写网络爬虫的优势和理由

    选择Python写网络爬虫的优势和理由

    在本篇文章里小编给各位整理了一篇关于选择Python写网络爬虫的优势和理由以及相关代码实例,有兴趣的朋友们阅读下吧。
    2019-07-07
  • Python异常类型以及处理方法汇总

    Python异常类型以及处理方法汇总

    调试Python程序时,经常会报出一些异常,下面这篇文章主要给大家介绍了关于Python异常类型以及处理方法的相关资料,需要的朋友可以参考下
    2021-06-06
  • python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    这篇文章主要介绍了python 基于opencv对图像进行各种处理,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • Python求矩阵的范数和行列式

    Python求矩阵的范数和行列式

    这篇文章主要介绍了Python求矩阵的范数和行列式,文章中有详细的代码实例,感兴趣的同学可以参考阅读
    2023-04-04
  • Python pass函数使用及其应用的详解

    Python pass函数使用及其应用的详解

    Python中,pass是一种空语句,即不做任何事情,只起到占位符的作用,本文主要介绍了Python pass函数使用及其应用的详解,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • python变量作用域与列表入门详解

    python变量作用域与列表入门详解

    这篇文章主要给大家介绍了关于python变量作用域与列表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python的基本语法详解

    Python的基本语法详解

    本文详细讲解了Python的基本语法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Python多个装饰器的调用顺序实例解析

    Python多个装饰器的调用顺序实例解析

    这篇文章主要介绍了Python多个装饰器的调用顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 在django中使用post方法时,需要增加csrftoken的例子

    在django中使用post方法时,需要增加csrftoken的例子

    这篇文章主要介绍了在django中使用post方法时,需要增加csrftoken的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论