OpenCV-Python教程9-平滑图像
先解释一个单词 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-平滑图像的更多相关文章
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- OpenCV Python教程(3、直方图的计算与显示)
转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...
- OpenCV Python教程(1、图像的载入、显示和保存)
原文地址:http://blog.csdn.net/sunny2038/article/details/9057415 转载请详细注明原作者及出处,谢谢! 本文是OpenCV 2 Computer ...
- 系列文章 -- OpenCV入门教程
<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- Python 图像处理 OpenCV (14):图像金字塔
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (5):图像的几何变换
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (6):图像的阈值处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
随机推荐
- Flask--路由, 配置, 蓝图
一 . 双重装饰器重名的解决办法 # 我们都知道flask中的@app.route就是一层装饰器, 当我们需要在给视图函数加装饰器的时候就两层装饰器,这里介绍一下加装饰器的先后顺序,以及遇到的问题. ...
- centos django Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING
os环境 centos python2.7.5 django1.10.8 class AdminAutoRunTask(View): """ 自动跑外放任务 " ...
- Bugku 分析 中国菜刀
解压之后得到了一个流量包,只有不到10KB,美滋滋 先抓重点,过滤出http,只有6条数据记录,3条post,3条response,3条post都是一样的 随便打开一条pos 是一个assert断言, ...
- VS界面控件大小调整
vs2015 ,配置名称显示不全,怎么才能把这个搞宽? 这个问题困扰时间挺长了, 对vs的应用仅限于敲代码.编译, 其他的功能了解甚少, 于是试着在右键菜单中找到了界面自定义窗口, 如下: 找到想要修 ...
- MT【315】勾股数
(高考压轴题)证明以下命题:(1)对任意正整数$a$都存在正整数$b,c(b<c)$,使得$a^2,b^2,c^2$成等差数列.(2)存在无穷多个互不相似的三角形$\Delta_n$,其边长$a ...
- '{}/{}_frames_{:02d}.npy'.format(dataset, train_or_test, i+1)函数
在阅读有关代码的时候,发现一段代码写为: data_frames = np.load(os.path.join(video_root_path, '{}/{}_frames_{:02d}.npy'.f ...
- usb驱动程序小结(六)
title: usb驱动程序小结 tags: linux date: 2018/12/20/ 17:59:51 toc: true --- usb驱动程序小结 linux中为usb驱动也提供了一套总线 ...
- 主机管理+堡垒机系统开发:webssh(十)
一.安装shellinabox 1.安装依赖工具 yum install git openssl-devel pam-devel zlib-devel autoconf automake libtoo ...
- Object is not a function
如图报了一个这样的错,百度好多都说是函数名和html元素重名的问题.可是这个问题我想我这里是不存在的 可以看到就一个绑定事件,而且id名不是关键字 报错是在$.ajax这一行,索性就把submit-i ...
- NOI-OJ 1.13 ID:5 素数回文数的个数
整体思路 使用埃拉拖色尼算法提前计算出1000以内的素数表. 设计一个回文判断函数isHW(int n),难点在于数字回文的判断.一个简单的方法是将数字n使用sprintf输出在一个数组中,然后从数组 ...