Python OpenCV学习之图像滤波详解

目录
  • 背景
  • 一、卷积相关概念
  • 二、卷积实战
  • 三、均值滤波
  • 四、高斯滤波
  • 五、中值滤波
  • 六、双边滤波
  • 七、Sobel算子
  • 八、Scharr算子
  • 九、拉普拉斯算子
  • 十、Canny算法

背景

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

一、卷积相关概念

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

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图像滤波的资料请关注我们其它相关文章!

(0)

相关推荐

  • opencv3/C++图像滤波实现方式

    图像滤波在opencv中可以有多种实现形式 自定义滤波 如使用3×3的掩模: 对图像进行处理. 使用函数filter2D()实现 #include<opencv2/opencv.hpp> using namespace cv; int main() { //函数调用filter2D功能 Mat src,dst; src = imread("E:/image/image/daibola.jpg"); if(!src.data) { printf("can not l

  • OpenCV-Python实现图像梯度与Sobel滤波器

    图像梯度 图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像的梯度计算是图像的边缘信息. 其实梯度就是导数,但是图像梯度一般通过计算像素值的差来得到梯度的近似值,也可以说是近似导数.该导数可以用微积分来表示. 在微积分中,一维函数的一阶微分的基本定义是这样的: 而图像是一个二维函数f(x,y),其微分当然就是偏微分.因此有: 因为图像是一个离散的二维函数,ϵ不能无限小,我们的图

  • OpenCV实现图像滤波之双边滤波

    本文实例为大家分享了opencv实现双边滤波的具体代码,供大家参考,具体内容如下 1.2D卷积 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 使用自定义卷积核进行图像2D卷积操作 函数原型: filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst 函数返回值:dst:2d卷积操作后的结果 函数解析: ddepth:指定

  • OpenCV学习方框滤波实现图像处理代码示例

    目录 一.方框滤波 二.C++代码 三.python代码 四.结果展示 1.原始图像 2.归一化 3.不归一化 4.平方和求均值 一.方框滤波    方框滤波是均值滤波的一种形式.在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和的均值,而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和. 二.C++代码 #include <iostream> #include <opencv2\ope

  • OpenCV图像处理之自定义滤波

    目录 1 空间滤波 1.1 滤波过程 1.2 相关和卷积 2 OpenCV 函数 2.1 filter2D 函数 2.2 flip 函数 3 代码示例 3.1 偏导数 参考资料 总结 图像处理中,"空间域" 指的是图像平面,因此,空间滤波可定义为:在图像平面内对像素灰度值进行的滤波 1 空间滤波 1.1 滤波过程 如图,Filter 是一个 3x3 滤波核,当它从图像的左上角开始,逐个像素沿水平方向扫描,最后到右下角时,便会产生滤波后的图像 假设输入图像 $f(x, y)$,滤波后的图

  • opencv 图像滤波(均值,方框,高斯,中值)

    为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响. 如下图,左图带有椒盐噪声,右图为使用中值滤波处理后的图片. 图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声. python +opencv讲解 均值滤波 含义 如图:如果我们想对红色点进行处理,则它

  • Python OpenCV学习之图像滤波详解

    目录 背景 一.卷积相关概念 二.卷积实战 三.均值滤波 四.高斯滤波 五.中值滤波 六.双边滤波 七.Sobel算子 八.Scharr算子 九.拉普拉斯算子 十.Canny算法 背景 图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像:明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积:实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数:当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器: 一.卷积相关概念 卷积核大小一般为奇数的原因:

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • Python OpenCV使用dlib进行多目标跟踪详解

    目录 1.使用dlib进行多目标跟踪 2.项目结构 3.dlib多对象跟踪的简单“朴素”方法 4.快速.高效的dlib多对象跟踪实现 5.完整代码 6.改进和建议 在本教程中,您将学习如何使用 dlib 库在实时视频中有效地跟踪多个对象. 我们当然可以使用 dlib 跟踪多个对象:但是,为了获得可能的最佳性能,我们需要利用多处理并将对象跟踪器分布在处理器的多个内核上. 正确利用多处理使我们能够将 dlib 多对象跟踪每秒帧数 (FPS) 提高 45% 以上! 1.使用 dlib 进行多目标跟踪

  • Python OpenCV之常用滤波器使用详解

    目录 1. 滤波器 1.1 什么是滤波器 1.2 关于滤波核 1.3 素材选择 2.均值滤波器 cv2.blur() 2.1 语法简介 2.2 代码示例 3. 中值滤波器 cv2.medianBlur() 代码示例 4. 高斯滤波器 cv2.GaussianBlur() 5. 双边滤波器 cv2.bilateralFilter() 1. 滤波器 1.1 什么是滤波器 滤波器是对图像做平滑处理 的一种常用工具. 平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻近的像素值之间,值的

  • Python OpenCV实现图形检测示例详解

    目录 1. 轮廓识别与描绘 1.1 cv2.findComtours()方法 1.2 cv2.drawContours() 方法 1.3 代码示例 2. 轮廓拟合 2.1 矩形包围框拟合 - cv2.boundingRect() 2.2圆形包围框拟合 - cv2.minEnclosingCircle() 3. 凸包 绘制 4. Canny边缘检测 - cv2.Canny() 4.1 cv2.Canny() 用法简介 4.2 代码示例 5. 霍夫变换 5.1 概述 5.2 cv2.HoughLin

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • Python OpenCV学习之图像形态学

    目录 背景 一.图像二值化 二.自适应阈值 三.腐蚀 四.卷积核获取 五.膨胀 六.开运算 七.闭运算 八.形态学梯度 九.顶帽运算 十.黑帽运算 总结 背景 形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果:形态学的处理哦本质上相当于对图像做前处理,提取出有用的特征,以便后续的目标识别等任务: 一.图像二值化 定义:将图像的每个像素变成两种值,如0和255: 全局二值化的函数原型: threshold(img,thresh,maxVal,type) img:最好是灰度图像

  • Python+OpenCV读写视频的方法详解

    目录 读视频,提取帧 接口函数:cv2.VideoCapture() 获取视频信息 使用set(cv2.CAP_PROP_POS_FRAMES)读取指定帧 读取函数(重点) 将图像写为视频 示例 fourcc 读视频,提取帧 接口函数:cv2.VideoCapture() 通过video_capture = cv2.VideoCapture(video_path)可以获取读取视频的句柄.而后再通过flag, frame = video_capture.read()可以读取当前帧,flag表示读取

  • Python集成学习之Blending算法详解

    一.前言 普通机器学习:从训练数据中学习一个假设. 集成方法:试图构建一组假设并将它们组合起来,集成学习是一种机器学习范式,多个学习器被训练来解决同一个问题. 集成方法分类为: Bagging(并行训练):随机森林 Boosting(串行训练):Adaboost; GBDT; XgBoost Stacking: Blending: 或者分类为串行集成方法和并行集成方法 1.串行模型:通过基础模型之间的依赖,给错误分类样本一个较大的权重来提升模型的性能. 2.并行模型的原理:利用基础模型的独立性,

  • Python Pandas学习之基本数据操作详解

    目录 1索引操作 1.1直接使用行列索引(先列后行) 1.2结合loc或者iloc使用索引 1.3使用ix组合索引 2赋值操作 3排序 3.1DataFrame排序 3.2Series排序 为了更好的理解这些基本操作,下面会通过读取一个股票数据,来进行Pandas基本数据操作的语法介绍. # 读取文件(读取保存文件后面会专门进行讲解,这里先直接调用下api) data = pd.read_csv("./data/stock_day.csv")  # 读取当前目录下一个csv文件 # 删

随机推荐