关闭

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

标签: python滤波opencv图像处理
16069人阅读 评论(3) 收藏 举报
分类:

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

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

对于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')

这里写图片描述
下面介绍的几种滤波部分可能是将函数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了,换成一组符合高斯分布的数值放在模板里面,比如这时中间的数值最大,往两边走越来越小,构造一个小的高斯包。实现的函数为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') 

这里写图片描述

(四)中值滤波模板

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

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') 

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

(五)双边滤波

双边滤波函数为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')

这里写图片描述

2
0
查看评论

Python图像处理(4):滤波器

快乐虾http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651)欢迎转载,但请保留作者信息滤波器在图像处理中的应用非常广泛,OpenCV也有个直接使用滤波器掩码(核)的函数filter2D,将图像与核进行卷积运算得到...
  • lights_joy
  • lights_joy
  • 2015-05-29 00:04
  • 3157

OPENCV中函数cvFilter2D的应用

Filter2D 对图像做卷积 void cvFilter2D( const CvArr* src, CvArr* dst,const CvMat* kernel,CvPoint anchor=cvPoint(-1,-1)); #define cvConvolve2D cvFilter2D 其中sr...
  • dengshuaifei
  • dengshuaifei
  • 2015-12-08 21:17
  • 2864

数学之路-python计算实战(19)-机器视觉-卷积滤波

filter2DConvolves an image with the kernel.C++: void filter2D(InputArray src, OutputArray dst, int ddepth, InputArraykernel, ...
  • u010255642
  • u010255642
  • 2014-07-27 11:46
  • 2423

python3 opencv3 help(cv2)

In[3]: help(cv2) Help on module cv2:NAME cv2 - Python wrapper for OpenCV.SUBMODULES Error detail fisheye flann ml ocl ...
  • foryouslgme
  • foryouslgme
  • 2016-07-01 17:05
  • 2350

OpenCV-Python教程(5、初级滤波内容)

本篇文章介绍如何用OpenCV-Python来实现初级滤波功能。 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Python实现基本的滤波处理本文不介绍滤波处理的详细概念,所以读者需要预先对其有一定的了解。 简介 过滤是信号和图像处理中基本的任务。其目的...
  • sunny2038
  • sunny2038
  • 2013-06-25 14:49
  • 37349

Opencv3.0-python的那些事儿:(五)、Opencv的图像模糊

# coding : utf-8 import cv2 import numpy as np from matplotlib import pyplot as plt ''' 第16章:图像平滑 2D卷积:对2D图像实施低通滤波(LPF,Low Pass Filter),可...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2016-06-04 21:35
  • 2154

Python+OpenCV实现图像高斯模糊

Python+OpenCV实现图像高斯模糊
  • solidcorr
  • solidcorr
  • 2016-02-02 18:31
  • 4104

python+opencv实现高斯平滑滤波

功能:创建两个滑动条来分别控制高斯核的size和σ\sigma的大小,这个程序是在阈值分割的那个程序上改动的。阈值分割程序在这 注意:由于σ=0\sigma=0时,opencv会根据窗口大小计算出σ\sigma,所以,从0滑动σ\sigma的滑动条时,会出现先边清晰又变模糊的现象代码:# -*- ...
  • xieyi4650
  • xieyi4650
  • 2016-05-09 19:08
  • 3985

opencv_python学习笔记十二

15 图像阈值   当像素高于阈值时,给这个像素一个新值(可以是白色),否则给它另一种颜色   不同的阈值方法: cv2.THRESH_BINARY  #黑白二值(二值阈值化) cv2.THRESH_BINARY_INV  ...
  • retacn_yue
  • retacn_yue
  • 2016-11-21 16:31
  • 1195

高斯滤波GaussianBlur函数的使用示例程序

//--------------------------------------【程序说明】------------------------------------------- // 程序描述:高斯滤波GaussianBlur函数的使用示例程序 // 开发测试所用操作系统: Windows 7...
  • zouyu1746430162
  • zouyu1746430162
  • 2016-11-24 22:42
  • 1333
    个人资料
    • 访问:746931次
    • 积分:7693
    • 等级:
    • 排名:第3314名
    • 原创:94篇
    • 转载:4篇
    • 译文:27篇
    • 评论:749条
    个人简介
    武汉 华中科技大学; 关注:图像处理、计算机视觉、人工智能、机器学习等领域;
    微信公众号
    最新评论