本篇文章介绍如何用OpenCV-Python来实现初级滤波功能。

提示:

  • 转载请详细注明原作者及出处,谢谢!
  • 本文介绍使用OpenCV-Python实现基本的滤波处理
  • 本文不介绍滤波处理的详细概念,所以读者需要预先对其有一定的了解。

简介

过滤是信号和图像处理中基本的任务。其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息。过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样,等等。其源自于一般的信号和系统理论,这里将不介绍该理论的细节。但本章会介绍关于过滤的基本概念,以及如何在图像处理程序中使用滤波器。首先,简要介绍下频率域分析的概念。

当我们观察一张图片时,我们观察的是图像中有多少灰度级(或颜色)及其分布。根据灰度分布的不同来区分不同的图像。但还有其他方面可以对图像进行分析。我们可以观察图像中灰度的变化。某些图像中包含大量的强度不变的区域(如蓝天),而在其他图像中的灰度变化可能会非常快(如包含许多小物体的拥挤的图像)。因此,观察图像中这些变化的频率就构成了另一条分类图像的方法。这个观点称为频域。而通过观察图像灰度分布来分类图像称为空间域。

频域分析将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。目前已存在若干转换方法,如傅立叶变换或余弦变换,可以用来清晰的显示图像的频率内容。注意,由于图像是一个二维实体,所以其由水平频率(水平方向的变化)和竖直频率(竖直方向的变化)共同组成。

在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分

本篇文章介绍在OpenCV-Python中实现的初级的滤波操作,下一篇文章介绍更加复杂的滤波原理及其实现。

本篇文章使用传统的lena作为实验图像。

用低通滤波来平滑图像

低通滤波器的目标是降低图像的变化率。如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域。在OpenCV中,可以通过blur函数做到这一点:

[python] view plaincopy
  1. dst = cv2.blur(image,(5,5));

其中dst是blur处理后返回的图像,参数一是输入的待处理图像,参数2是低通滤波器的大小。其后含有几个可选参数,用来设置滤波器的细节,具体可查阅参考资料2。不过这里,这样就够了。下面是一个简单的示例代码:

[python] view plaincopy
  1. #coding=utf-8
  2. import cv2
  3. img = cv2.imread("D:/lena.jpg", 0)
  4. result = cv2.blur(img, (5,5))
  5. cv2.imshow("Origin", img)
  6. cv2.imshow("Blur", result)
  7. cv2.waitKey(0)
  8. cv2.destroyAllWindows()

结果如下,左边是平滑过的图像,右边是原图像:

这种滤波器又称为boxfilter(注,这与化学上的箱式过滤器是两码事,所以这里就不翻译了)。所以也可通过OpenCV的cv2.bofxfilter(...)函数来完成相同的工作。如下:

[python] view plaincopy
  1. result1 = cv2.boxFilter(img, -1, (5, 5))

这行代码与上面使用blur函数的效果完全相同。其中第二个参数的-1表示输出图像使用的深度与输入图像相同。后面还有几个可选参数,具体可查阅OpenCV文档。

高斯模糊

在某些情况下,需要对一个像素的周围的像素给予更多的重视。因此,可通过分配权重来重新计算这些周围点的值。这可通过高斯函数(钟形函数,即喇叭形数)的权重方案来解决。cv::GaussianBlur函数可作为滤波器用下面的方法调用:

[python] view plaincopy
  1. gaussianResult = cv2.GaussianBlur(img,(5,5),1.5)

区别

低通滤波与高斯滤波的不同之处在于:低通滤波中,滤波器中每个像素的权重是相同的,即滤波器是线性的。而高斯滤波器中像素的权重与其距中心像素的距离成比例。关于高斯模糊的详细内容,抽空将写一篇独立的文章介绍。

使用中值滤波消除噪点

前面介绍的是线性过滤器,这里介绍非线性过滤器——中值滤波器。由于中值滤波器对消除椒盐现象特别有用。所以我们使用第二篇教程中椒盐函数先对图像进行处理,将处理结果作为示例图片。

调用中值滤波器的方法与调用其他滤波器的方法类似,如下:

[python] view plaincopy
  1. result = cv2.medianBlur(image,5)

函数返回处理结果,第一个参数是待处理图像,第二个参数是孔径的尺寸,一个大于1的奇数。比如这里是5,中值滤波器就会使用5×5的范围来计算。即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。

如果在某个像素周围有白色或黑色的像素,这些白色或黑色的像素不会选择作为中值(最大或最小值不用),而是被替换为邻域值。代码如下:

[python] view plaincopy
  1. #coding=utf-8
  2. import cv2
  3. import numpy as np
  4. def salt(img, n):
  5. for k in range(n):
  6. i = int(np.random.random() * img.shape[1]);
  7. j = int(np.random.random() * img.shape[0]);
  8. if img.ndim == 2:
  9. img[j,i] = 255
  10. elif img.ndim == 3:
  11. img[j,i,0]= 255
  12. img[j,i,1]= 255
  13. img[j,i,2]= 255
  14. return img
  15. img = cv2.imread("D:/lena.jpg", 0)
  16. result = salt(img, 500)
  17. median = cv2.medianBlur(result, 5)
  18. cv2.imshow("Salt", result)
  19. cv2.imshow("Median", median)
  20. cv2.waitKey(0)

处理结果如下:

由于中值滤波不会处理最大和最小值,所以就不会受到噪声的影响。相反,如果直接采用blur进行均值滤波,则不会区分这些噪声点,滤波后的图像会受到噪声的影响。

中值滤波器在处理边缘也有优势。但中值滤波器会清除掉某些区域的纹理(如背景中的树)。

其他

由于方向滤波器与这里的原理有较大的出入,所以将用独立的一篇文章中介绍其原理以及实现。

参考资料:

1、《Opencv2 Computer Vision Application Programming Cookbook》

2、《OpenCV References Manule》

如果觉得本文写的还可以的话,请轻点“顶”,您的支持是我写下去的动力之一。

未完待续。。。如有错误请指正,本人会虚心接受并改正!谢谢!

OpenCV-Python教程(5、初级滤波内容)相关推荐

  1. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  2. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  3. opencv python教程简书_OpenCV-Python系列二:常用的图像属性

    对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在opencv-python中,这些信息如何获取呢? 本文结构: 1.基本图像属性 2. 对于opencv中的特 ...

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

    本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonO ...

  5. opencv python教程简书_OpenCV-Python教程:27.图像转换

    理论 傅里叶变换用来分析多种过滤器的频率特征.对于图片,2D离散傅里叶变换(DFT)用来找频率范围.一个快速算法叫快速傅里叶变换(FFT)用来计算DFT. 对于正弦信号,x(t) = Asin(2πf ...

  6. opencv python教程简书_Python-OpenCV —— 基本操作一网打尽

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Pyt ...

  7. opencv python教程-OpenCV4 Python 最新中文版官方教程来了(附下载)

    教程简介 OpenCV 是计算机视觉中经典的专用库,然而其中文版官方教程久久不来.近日,一款最新 OpenCV4.1 版本的完整中文版官方教程出炉,读者朋友可以更好的学习了解 OpenCV 相关细节. ...

  8. OpenCV Python教程系列

    参考: OpenCV - sunny2038的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/sunny2038/article/category/904451

  9. opencv python教程简书_OpenCV-Python教程:28.模板匹配

    理论 模板匹配是在一个大图里搜索和找模板图像位置的方法.OpenCV有个函数cv2.matchTemplate()来做这个.它吧模板图像在输入图像上滑动,对比模板和在模板图像下的输入图像块.它返回了一 ...

  10. opencv python教程简书_OpenCV-Python教程:57.图像修复

    基础 你们可能家里都会有一些老照片已经有黑点啊,划痕啊等.你有想过修复它们么?我们不能简单的在绘图工具里把他们擦除了就完了.因为这样只是把黑色的东西变成白色的而已,实际上没用.在这种情况下,会用到一种 ...

最新文章

  1. JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案
  2. ASM(active shape models)算法介绍
  3. [转载] 百科全说——漆浩:怎样健康饮茶远离误区(11-03-09)
  4. android studio中如何替换gradle以防下载卡住
  5. android studio手机与蓝牙收发数据_QT for Android :蓝牙
  6. 《Linux系统最佳实践工具:命令行技术》新书抢先看
  7. 《说服力》读后总结摘录
  8. Leetcode0720. 词典中最长的单词(simple)
  9. 安卓手机里的短信删除了如何恢复
  10. 文本分类上分利器: Bert微调trick大全
  11. 用计算机里可以加50度电,一台电脑一天用多少度电?多少瓦?高配电脑一小时几度电?...
  12. 汽车辅助驾驶系统中的图像处理算法
  13. python读取gif图片并显示_Python爬虫实现获取动态gif格式搞笑图片的方法示例
  14. PX4中的二阶巴特沃斯低通滤波
  15. uni-app实现拼多多倒计时拼团
  16. 【socket】socket编程总目录
  17. latex中biblatex参考文献的标点、分隔符、本地化字符串中英文切换
  18. 360n4s高通版卡刷包
  19. 任天堂Switch游戏机热销的原因分析
  20. CFA课程打卡-2019.11.25

热门文章

  1. iOS 网络与多线程--3.异步Get方式的网络请求(非阻塞)
  2. 配置CACTI监控MySQL数据库状态(2)安装cacti相关软件包
  3. 程序员浪费生命的几种方式
  4. 如何恢复丢失的分区及文件
  5. [置顶]       javascript中的数组对象以及json学习笔记
  6. ASP.NET 分页技术
  7. 正则表达式去除html标签
  8. 自定义新浪微博分享按钮
  9. php try catch 作用域,浅谈PHP中try{}catch{}的使用方法
  10. python selenium手动输入验证码_Python Selenium Cookie 绕过验证码实现登录