先解释一个单词 blur:使...模糊不清

滤波与模糊

  • 滤波和模糊都属于卷积,不同的滤波方法之间只是卷积核不同(对线性滤波而言)
  • 低通滤波器是模糊,高通滤波器是锐化

低通滤波器允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

常见噪声有:椒盐噪声和高斯噪声,椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声。

一、均值滤波

均值滤波是一种最简单的滤波处理,它取的是卷积核区域内元素的均值,用 cv2.blur() 实现,如3 x 3的卷积核:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('lena.jpg')
blur = cv2.blur(img, (3, 3)) # 均值模糊
cv2.imshow('blur', blur)
cv2.waitKey(0)

二、方框滤波

方框滤波和均值滤波很像,如3 x 3的滤波核如下:

用 cv2.boxFilter() 函数实现,当可选参数 normalize 为True的时候,方框滤波就是均值滤波,上式中的 a = 1/9;normalize为False的时候,a=1,相当于求区域内的像素和

# 前面的均值滤波也可以用方框滤波实现:normalize=True
# output image depth (-1 to use src.depth())
# -1 表示输出图片深度采用源图片深度
blur = cv2.boxFilter(img, -1, (3, 3), normalize=False)
cv2.imshow('blur2', blur)
cv2.waitKey(0)

三、高斯滤波

前面两种滤波方式,卷积核内的每个值都一样,也就是说图像区域内每个像素的权重也是一样。

高斯滤波的卷积核权重并不相同:中间像素点权重最高,越远离中心的像素权重越小。

显然这种处理元素间权值的方式,更加合理一些。图像是2维的,我们需要使用2维的高斯函数,比如OpenCV中默认的3 x 3的高斯卷积核

OpenCV中对应函数为 cv2.GaussianBlur(src,ksize,sigmaX)

img = cv2.imread('gaussian_noise.bmp')

# 均值滤波 vs 高斯滤波

blur = cv2.blur(img, (5, 5))  # 均值滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1) # 高斯滤波 titles = ['Original', 'blur', 'Gaussian_Blur']
images = [img, blur, gaussian] # 使用Matplotlib显示
# 一行三列图
for i in range(3):
plt.subplot(1, 3, i + 1)
plt.imshow(images[i])
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([])
plt.show()

参数3:σx值越大,模糊效果越明显。高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多图像细节,所以经常被成为最有用的滤波器

四、中值滤波

中值又叫中位数,是所有数排序后取中间的值。中值滤波就是用区域内的中值来代替本像素值,所以那些孤立的斑点。如0或255很容易消除。适用于去除椒盐噪声和斑点噪声。中值是一种非线性操作,效率相比前面集中滤波器要慢。

img = cv2.imread('salt_noise.bmp', 0)

# 均值滤波 vs 中值滤波
blur = cv2.blur(img, (5, 5)) # 均值滤波
median = cv2.medianBlur(img, 5) # 中值滤波 titles = ['Original', 'blur', 'medianBlur']
images = [img, blur, median] # 使用Matplotlib显示
# 一行三列图
for i in range(3):
plt.subplot(1, 3, i + 1)
plt.imshow(images[i])
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([])
plt.show()

比如这张斑点图,用中值滤波显然更好。

五、双边滤波

模糊操作基本都是损失图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。

然而,边缘(edge)信息是图像中很重要的一个特征,因此我们采用双边滤波。使用 cv2.bilateralFilter()

img = cv2.imread('lena.jpg')

# 双边滤波 vs 高斯滤波
bilateral = cv2.bilateralFilter(img, 9, 75, 75) # 双边滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 0) # 高斯滤波 titles = ['Original', 'bilateralFilter', 'GaussianBlur']
images = [img, bilateral, gaussian] # 使用Matplotlib显示
# 一行三列图
for i in range(3):
plt.subplot(1, 3, i + 1)
plt.imshow(images[i])
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([])
plt.show()

双边滤波明显保留了更多边缘信息。

小结

  • 在不知道用什么滤波器好的时候,优先使用高斯滤波器cv2.GaussianBlur(),然后均值滤波cv2.blur()
  • 斑点和椒盐噪声优先使用中值滤波cv2.medianBlur()
  • 要去除噪点的同时尽可能保留更多的边缘信息,使用双边滤波cv2.bilateralFilter()
  • 线性滤波方式:均值滤波、方框滤波、高斯滤波(速度相对快)
  • 非线性滤波方式:中值滤波、双边滤波(速度相对慢)

OpenCV-Python教程9-平滑图像的更多相关文章

  1. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  2. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...

  3. OpenCV Python教程(1、图像的载入、显示和保存)

    原文地址:http://blog.csdn.net/sunny2038/article/details/9057415 转载请详细注明原作者及出处,谢谢! 本文是OpenCV  2 Computer ...

  4. 系列文章 -- OpenCV入门教程

     <OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...

  5. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  6. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

  8. Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. Python 图像处理 OpenCV (5):图像的几何变换

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  10. Python 图像处理 OpenCV (6):图像的阈值处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

随机推荐

  1. golang介绍

    一.golang介绍  golang是Google开发的一种 静态强类型.编译型,并发型,并具有垃圾回收功能的编程语言. 二.语言特性 1..自动垃圾回收 2.支持函数多返回值 3.并发强 三.gol ...

  2. DIV正确打开方式 ~~~~哈哈哈

    <div style='margin-left:25px;margin-right:25px;margin-top:10px;height:350px;min-height:50px;backg ...

  3. ICPC中国南昌国家邀请赛和国际丝绸之路规划大赛预选赛 I J

    I. Max answer 链接:https://nanti.jisuanke.com/t/38228 思路: 枚举最小值,单调栈确定最小值的边界,用线段树+前缀和维护最小值的左右区间 实现代码: # ...

  4. Swagger如何测试Date类型参数

    问题 Swagger测试时,参数直接输入日期格式化后的类型,会报参数日期转换错误 :ConversionFailedException 解决 网上说在参数上添加注解 @DateTimeFormat(p ...

  5. <Android基础>(三) UI开发 Part 2 ListView

    ListView 1)ListView的简单用法 2)定制ListView界面 3)提升ListView的运行效率 4)ListView的点击事件 3.5 ListView 3.5.1 ListVie ...

  6. 在mobaxterm内连接deb使用lrzsz进行文件传输

    lrzsz随手传文件还是挺方便的. 1.apt install lrzsz 2.rz 3.右键 或者control右键选择 send file useing Z-modem 选择文件上传 接收同理

  7. Time travel HDU - 4418(高斯消元)

    Agent K is one of the greatest agents in a secret organization called Men in Black. Once he needs to ...

  8. Springboot 1.简介 及第一个demo

    按照官网上的新建一个maven项目,然后将类引入pom.xml文件中 <?xml version="1.0" encoding="UTF-8"?> ...

  9. CMDB服务器管理系统【s5day89】:部分数据表结构-资产入库思路

    1.用django的app作为统一调用库的好处 1.创建repository app截图如下: 2.好处如下: 1.app的本质就是一个文件夹 2.以后所有的app调用数据就只去repository调 ...

  10. 优化算法系列-遗传算法(3)——NSGAII学习网址

    JMetal https://www.cnblogs.com/denggaoshan/p/6306640.html https://www.cnblogs.com/denggaoshan/p/6308 ...