相信很多小伙伴都听过“滤波器”这个词,在通信领域,滤波器能够去除噪声信号等频率成分,然而在我们OpenCV中,“滤波”并不是对频率进行筛选去除,而是实现了图像的平滑处理。接下来,这篇随笔介绍使用OpenCV进行图像处理的第六章 图像平滑处理。

6  图像平滑处理

未经处理的图像含有噪声的影响,所以我们希望尽可能保留原图像的信息,过滤掉图像内部的噪声像素,得到平滑图像,这个过程称作图像的平滑处理。

一幅图像中,若某一像素点与周围像素值差异过大,该像素点很可能是噪声,则需要把值调整为周围的像素点的近似值。如图所示:

那么,如何对图像进行平滑处理过滤噪声呢?OpenCV提供了多种计算方法,有:

均值滤波

方框滤波

高斯滤波

中值滤波

双边滤波

2D卷积滤波(自定义滤波)

6.1  均值滤波

均值滤波是指使用当前N×N个像素值的均值来替代当前像素值,例如使用周围3×3的像素点对第3行第3列像素值做均值滤波,如图:

新值=(179+176+175+176+31+179+180+185+181)/ 9 = 162

也相当于,对上图黄色区域矩阵乘以3×3的卷积核,该均值滤波3×3的卷积核如下(右侧矩阵):

OpenCV提供了cv2.blur()函数进行均值滤波,举例程序如下:

 1 #针对噪声图像,使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况
2 import cv2
3 o=cv2.imread('E:\python_opencv\lena.jpg')
4 r5=cv2.blur(o,(5,5)) #5×5卷积核进行均值滤波
5 r30=cv2.blur(o,(30,30)) #30×30卷积核进行均值滤波
6 cv2.imshow('original',o)
7 cv2.imshow('result5',r5)
8 cv2.imshow('result30',r30)
9 cv2.waitKey()
10 cv2.destroyAllWindows()

运行结果如下图,左为原图像,中间及右侧是为均值滤波处理结果,卷积核依次增大。

可以看出,卷积核越大,参与到均值运算的像素越多;卷积核越大,去噪效果越好,图像失真会越严重,计算时间也会越长。所以我们要在图像去噪和失真之间找到平衡,选择大小合适的卷积核。

6.2  方框滤波

方框滤波可以选择对周围每个像素值求平均值,或周围像素值之和而不求平均。

OpenCV提供了cv2.boxFilter()函数进行方框滤波,举例程序如下:

 1 #针对噪声图像,用方框滤波函数cv2.boxFilter()去噪
2 import cv2
3 o=cv2.imread('E:\python_opencv\lena.jpg')
4 #参数normalize的值设置为0,卷积核大小设置成2×2
5 r1=cv2.boxFilter(o,-1,(2,2),normalize=0)
6 #参数normalize的值设置为1,卷积核大小设置成2×2
7 r2=cv2.boxFilter(o,-1,(2,2),normalize=1)
8 cv2.imshow('original',o)
9 cv2.imshow('result1',r1)
10 cv2.imshow('result2',r2)
11 cv2.waitKey()
12 cv2.destroyAllWindows()

运行结果如下图,左为原图像,右面两幅是方框滤波后图像。

中间图中白色像素较多,是因为cv2.boxFilter()函数中normalize参数等于0,没有设置归一化,将normalize设置为1进行归一化后,可得右面正常图像。

6.3  高斯滤波

前两小节介绍的均值滤波和方框滤波中,每个像素点的权重是相等的,在高斯滤波中,中心点的权重值较大,边缘点的权重值较小,每一种尺寸的卷积核都可以有多种不同形式的权重比例。

例如一个3×3的高斯滤波卷积核如下所示:

OpenCV提供了cv2.GaussianBlur()函数实现高斯滤波,举例程序如下:

1 #对噪声图像进行高斯滤波,显示滤波的结果
2 import cv2
3 o=cv2.imread('E:\python_opencv\lena.jpg')
4 r=cv2.GaussianBlur(o,(5,5),0,0) #5×5大小的卷积核,权重的标准差为默认值
5 cv2.imshow('original',o)
6 cv2.imshow('result',r)
7 cv2.waitKey()
8 cv2.destroyAllWindows()

运行结果如下图,左为原图像,右是高斯滤波后的图像。

6.4  中值滤波

中值滤波不使用加权求和的形式计算,而是选取邻域内所有像素点的中间值来替代当前的异常像素值。

举例如下,异常值为31,则3×3邻域内从小到大排列是 [31,175,176,176,179,179,180,181,185],中位数是179,则该像素点被处理为179。

OpenCV提供了cv2.medianBlur()函数实现中值滤波,举例程序如下:

1 #对噪声图像进行中值滤波,显示滤波的结果
2 import cv2
3 o=cv2.imread('E:\python_opencv\lena.jpg')
4 r=cv2.medianBlur(o,3) #滤波核大小设置为3,表示宽度和高度均为3
5 cv2.imshow('original',o)
6 cv2.imshow('result',r)
7 cv2.waitKey()
8 cv2.destroyAllWindows()

运行结果如下图,左为原图像,右为中值滤波后的图像。

可以看到,由于中值滤波没有进行均值处理,得到的图像不存在细节变模糊的问题,有较好的滤波效果。但因为需要排序,中值滤波的计算量也较大。

 6.5  双边滤波

在之前介绍的计算加权均值后滤波的方法中,滤波图像不可避免的出现轮廓信息模糊的问题。而双边滤波综合考虑了空间信息和色彩信息,能够有效保护图像内的边缘信息。

双边滤波的原理是,处理异常像素值时,不仅考虑距离对权重的影响(距离越远,权重越小),还考虑色差对权重的影响(色差越大,权重越小),既能去除噪声,又能较好地保护边缘信息。

OpenCV提供了cv2.bilateralFilter()函数实现双边滤波,举例程序如下:

 1 #针对噪声图像,分别对其进行高斯滤波和双边滤波,比较不同滤波方式对边缘的处理结果是否相同
2 import cv2
3 o=cv2.imread('E:\python_opencv\lena.jpg')
4 g=cv2.GaussianBlur(o,(7,7),0,0) #高斯滤波
5 b=cv2.bilateralFilter(o,7,100,100) #双边滤波
6 cv2.imshow('original',o)
7 cv2.imshow('Gaussian',g)
8 cv2.imshow('bilateral',b)
9 cv2.waitKey()
10 cv2.destroyAllWindows()

运行结果如下图,左为原图像,中间是高斯滤波得到的图像,右为双边滤波后的图像。

可以看出,经过高斯滤波的图像边缘被模糊虚化了,而经过双边滤波的图像得到了较好的保留。

6.6  2D卷积(自定义滤波)

上述滤波方法中,卷积核的设定是较为固定的,而在实际的图像处理时,我们可能希望使用特定的卷积核进行处理,特定卷积核举例如下:

OpenCV提供了cv2.filter2D()函数实现2D卷积滤波,举例程序如下:

 1 #自定义一个卷积核,使用双边滤波函数cv2.filter2D()对原始图像进行滤波
2 import cv2
3 import numpy as np
4 o=cv2.imread('E:\python_opencv\lena.jpg')
5 kernel=np.ones((3,3),np.float32)/9 #设置3×3卷积核
6 kernel[2][2]=0.5 #将卷积核的第2行第2列元素置为0.5
7 r=cv2.filter2D(o,-1,kernel) #自定义滤波
8 cv2.imshow('original',o)
9 cv2.imshow('result',r)
10 cv2.waitKey()
11 cv2.destroyAllWindows()

代码中,自定义将卷积核右下角的值设置为0.5,运行代码后结果如下:

可以看到,本例中自定义卷积核后的滤波的效果,能够对图像的色彩亮度做出改变。

这次内容就分享到这里了,下次继续更新第7章 图像形态学操作,希望与各位老师和小伙伴们交流学习~

【图像处理】OpenCV+Python图像处理入门教程(六)图像平滑处理的更多相关文章

  1. PySide——Python图形化界面入门教程(六)

    PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...

  2. 无废话ExtJs 入门教程六[按钮:Button]

    无废话ExtJs 入门教程六[按钮:Button] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个按钮“提交”与重置.如下所示代码区的第68行位置, butt ...

  3. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  4. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  5. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  6. 2019-03-22 Python Scrapy 入门教程 笔记

    Python Scrapy 入门教程 入门教程笔记: # 创建mySpider scrapy startproject mySpider # 创建itcast.py cd C:\Users\theDa ...

  7. Elasticsearch入门教程(六):Elasticsearch查询(二)

    原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  8. RabbitMQ入门教程(六):路由选择Routing

    原文:RabbitMQ入门教程(六):路由选择Routing 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  9. 【图像处理】OpenCV+Python图像处理入门教程(四)几何变换

    这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换. 4  几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 4.1  缩放 使用cv2. ...

随机推荐

  1. idle & js

    idle & js idle meaning in js https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensi ...

  2. PM2 in depth

    PM2 in depth ecosystem.config.js module.exports = { apps : [{ name: "app", script: ". ...

  3. Flutter ColorFiltered 将ColorFilter应用于其子级。

    ColorFiltered ColorFilter BlendMode Example <summary>main.dart</summary> import 'package ...

  4. “NGK公链+5G”——打造智慧城市

    智慧城市目前被全球各国当成城市建设的重点,旨在城市在智能化的同时,还能给民众带来幸福感和安全感.随着5G的到来,城市智能化又到了一个新的高度.比如无人驾驶.无人机等方面将会产生质的变化,因为5G的加入 ...

  5. 「NGK每日快讯」12.11日NGK公链第38期官方快讯!

  6. Bitter.NotifyOpenPaltform : HTTP 异步消息接收调度中心--开源贡献 之 一:简介

    现在互联网的系统越来越趋向于复杂,从单体系统到现在的微服务体系演变.公司与公司的分工也越来越明确. 大数据公司提供了大数据服务 人脸识别公司提供了人脸识别服务 OCR 公司提供了专业的OCR 服务 车 ...

  7. HTTP常用请求头大揭秘

    本文为<三万长文50+趣图带你领悟web编程的内功心法>第四个章节. 4.HTTP常用请求头大揭秘 上面列出了报文的各种请求头.响应头.状态码,是不是感到特别晕呢.这节我们就专门挑一些最常 ...

  8. 使用 Tye 辅助开发 k8s 应用竟如此简单(六)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们将进一步研究 Tye 与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花. Newbe.Claptrap 是一个用于轻松应对并发问题 ...

  9. Java流程控制:选择结构

    一.选择结构 选择结构用于判断给定的条件,根据判断的结果来控制程序的流程. Java中选择结构的语法主要分为'if...else'语句和'switch...case'语句. Java中选择结构语句在语 ...

  10. Docker镜像构建原理解析(不装docker也能构建镜像)

    在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...