Python下opencv使用笔记(五)(图像的平滑与滤波)

转载 2018年04月15日 10:30:31

对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果。
首先介绍二维卷积运算,图像的滤波可以看成是滤波模板与原始图像对应部分的的卷积运算。关于卷积运算,找到几篇相关的博客:

图像处理:基础(模板、卷积运算)
图像处理-模板、卷积的整理

对于2D图像可以进行低通或者高通滤波操作,低通滤波(LPF)有利于去噪,模糊图像,高通滤波(HPF)有利于找到图像边界。

(一)统一的2D滤波器cv2.filter2D

Opencv提供的一个通用的2D滤波函数为cv2.filter2D(),滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将和模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。
这里说一个与matlab相似的情况,matlab中也有一个类似的滤波函数imfilter,对于滤波函数的应用其实不只在于滤波,对于许多图像的整体处理上,其实都可以用滤波函数来组合实现,得到更快的效果,相关的介绍间下面这个博客:

图像滤波函数imfilter函数的应用及其扩展

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0) #直接读为灰度图像
img1 = np.float32(img) #转化数值类型
kernel = np.ones((5,5),np.float32)/25

dst = cv2.filter2D(img1,-1,kernel)
#cv2.filter2D(src,dst,kernel,auchor=(-1,-1))函数:
#输出图像与输入图像大小相同
#中间的数为-1,输出数值格式的相同plt.figure()
plt.subplot(1,2,1),plt.imshow(img1,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(dst,'gray')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里写图片描述
下面介绍的几种滤波部分可能是将函数cv2.filter2D()具体化,重新规定一个名字而已,贴一个好的博客参考:

图像平滑处理(归一化块滤波、高斯滤波、中值滤波、双边滤波)

(二)均值滤波

上述生成的5*5核模板其实就是一个均值滤波。而opencv有一个专门的平均滤波模板供使用–归一化卷积模板,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值。Opencv中均值模板可以用cv2.blur和cv2.boxFilter,比如一个3*3的模板其实就可以如下表示:

M=19111111111

模板大小是m*n是可以设置的。如果你不想要前面的1/9,可以使用非归一化的模板cv2.boxFilter。一个实例如下:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0) #直接读为灰度图像
blur = cv2.blur(img,(3,5))#模板大小3*5
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,'gray')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里写图片描述

(三)高斯模糊模板

现在把卷积模板中的值换一下,不是全1了,换成一组符合高斯分布的数值放在模板里面,比如这时中间的数值最大,往两边走越来越小,构造一个小的高斯包。实现的函数为cv2.GaussianBlur()。对于高斯模板,我们需要制定的是高斯核的高和宽(奇数),沿x与y方向的标准差(如果只给x,y=x,如果都给0,那么函数会自己计算)。高斯核可以有效的出去图像的高斯噪声。当然也可以自己构造高斯核,相关函数:cv2.GaussianKernel().

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0) #直接读为灰度图像
for i in range(2000): #添加点噪声
    temp_x = np.random.randint(0,img.shape[0])
    temp_y = np.random.randint(0,img.shape[1])
    img[temp_x][temp_y] = 255
blur = cv2.GaussianBlur(img,(5,5),0)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,'gray') 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里写图片描述

(四)中值滤波模板

中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的。这个模板一般用于去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他,卷积核的大小也是个奇数。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0) #直接读为灰度图像
for i in range(2000): #添加点噪声
    temp_x = np.random.randint(0,img.shape[0])
    temp_y = np.random.randint(0,img.shape[1])
    img[temp_x][temp_y] = 255

blur = cv2.medianBlur(img,5)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,'gray') 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里写图片描述
可以看到中值滤波对于这些白点噪声的去除是非常的好的。

(五)双边滤波

双边滤波函数为cv2.bilateralFilter()。该滤波器可以在保证边界清晰的情况下有效的去掉噪声。它的构造比较复杂,即考虑了图像的空间关系,也考虑图像的灰度关系。双边滤波同时使用了空间高斯权重和灰度相似性高斯权重,确保了边界不会被模糊掉。有一个介绍专门介绍双边滤波的博客:

双边滤波器的原理及实现

cv2.bilateralFilter(img,d,’p1’,’p2’)函数有四个参数需要,d是领域的直径,后面两个参数是空间高斯函数标准差和灰度值相似性高斯函数标准差。一个实例如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0) #直接读为灰度图像
for i in range(2000): #添加点噪声
    temp_x = np.random.randint(0,img.shape[0])
    temp_y = np.random.randint(0,img.shape[1])
    img[temp_x][temp_y] = 255

#9---滤波领域直径
#后面两个数字:空间高斯函数标准差,灰度值相似性标准差
blur = cv2.bilateralFilter(img,9,75,75)
plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,'gray')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里写图片描述

Python cv2 图像自适应灰度直方图均衡化处理

Python cv2 图像自适应灰度直方图均衡化处理 __author__ = 'Administrator' import numpy as np import cv2 ct_img = np...
  • yangyangyang20092010
  • yangyangyang20092010
  • 2017-04-25 11:47:07
  • 985

openCV—Python(9)—— 图像平滑与滤波

一、函数简介1、blur—图像均值平滑滤波函数原型:blur(src, ksize, dst=None, anchor=None, borderType=None)src:图像矩阵ksize:滤波窗口...
  • jnulzl
  • jnulzl
  • 2015-08-18 15:07:40
  • 4809

OpenCV对图像做简单处理——平滑滤波

首先必须知道几个关键函数——cvLoadImage,cvCreateImage和cvSmooth。一、主要函数的简单介绍1.1 cvLoadImage 函数功能:把图片加载到内存中 函数原型:...
  • embedclub_LYF
  • embedclub_LYF
  • 2015-02-06 13:47:03
  • 4227

Python+OpenCV学习(3)---图像平滑滤波

利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,...
  • FireMicrocosm
  • FireMicrocosm
  • 2015-09-06 21:07:22
  • 2017

opencv实现频域平滑图像

本文是参考opencv低通滤波器这篇文章改进得到的,地址:http://blog.csdn.net/huangli19870217/article/details/12856619#include #...
  • wxplol
  • wxplol
  • 2017-05-29 22:34:58
  • 280

OpenCV入门:简单图像处理实例——平滑滤波

本文简单举一个图像平滑滤波的例子,以此认识OpenCV为我们提供的强大图像处理功能。...
  • huanglu_thu13
  • huanglu_thu13
  • 2016-03-21 13:24:41
  • 1197

opencv图像平滑滤波处理cvSmooth的汇总

函数 cvSmooth 可使用简单模糊、简单无缩放变换的模糊、中值模糊、高斯模糊、双边滤波的任何一种方法平滑图像。每一种方法都有自己的特点以及局限。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线...
  • gdut2015go
  • gdut2015go
  • 2015-06-05 10:29:13
  • 1149

opencv python 5 平滑滤波

opencv python 5 平滑滤波2D卷积opencv提供了cv2.filter2D()函数来对图像进行卷积操作(图像滤波)。 第1个参数为输入图像,第2个参数为输出图像深度,-1为与原图相同,...
  • super_chicken
  • super_chicken
  • 2017-11-30 09:37:48
  • 154

【OpenCV3】平滑处理详解

“平滑”通常又称“模糊”,是一种简单常用的图像处理操作。进行平滑处理的原因有很多,但通常是用来去除噪声和相机失真,平滑在按照一定的原理来降低图像分辨率中也有重要应用。 OpenCV2和OpenCV3中...
  • guduruyu
  • guduruyu
  • 2017-03-29 14:00:45
  • 4100

各项异性扩散滤波 -- OpenCV实现

/*********************************** *功能 -- 各项异性扩散滤波 *by 垚 *visual studio 2010 & windows 7 ultimal...
  • ubunfans
  • ubunfans
  • 2014-10-20 19:11:13
  • 1917
收藏助手
不良信息举报
您举报文章:Python下opencv使用笔记(五)(图像的平滑与滤波)
举报原因:
原因补充:

(最多只允许输入30个字)