目录

前言:

1. 大致原理说明

2. 常用参数

滤波方式

1. 高斯滤波

2. 均值滤波

3. 方框滤波

4. 中值滤波

5. 双边滤波

6. 自定义卷积核滤波


前言:

1. 大致原理说明

图像的平滑滤波处理本质上就是定义一个N×N的矩阵分别按照一定算法与像素值进行运算,最后改变N×N的矩阵中间点像素值的结果,也就是图像平滑的结果。

这样的话,使N×N矩阵的中心点与周围(N的平方-1)个点有着数学关系,就可以利用这种数学关系来使图像颜色的突变 变得不那么明显。这也就是平滑滤波的基本原理。

上文中的N×N矩阵被成为平滑滤波的卷积核。

下文中提到的卷积核也就是N×N矩阵。(N必须要是奇数,两个N可以不同)

一般我们使用3×3或者5×5,在传入函数参数时,应使用元组的形式(3,3),(5,5),(3,5)。

一个卷积核区域所有值与卷积核本身权重相乘再相加(有可能会归一化)得到卷积核中间像素点的值。(主要是卷积核的权重,和归不归一化)

滤波方式有高斯滤波、均值滤波、方框滤波、中值滤波和双边滤波。(5种)

还有一种称作2D卷积核滤波,也叫做自定义卷积核。也就是说他可以由我们自己设定卷积核来处理图像,而不用被以上5种方式所拘束。

2. 常用参数

先大概说一下常用的参数:(下文函数需要这些参数将不再过多阐述,请读者翻到这里查阅)

dst:返回滤波后图像的结果。

src:表示原始图像(需要进行处理的图像)。

ksize:表示滤波用的卷积核大小,卷积核的数值一定是奇数。传入为(3,3)、(5,5)。

borderType:表示以哪种方式处理边界值。(可以不传该参数)

anchor:表示图像处理的锚点,默认值为(-1,-1),表示位于卷积核中心点。可以不传该参数,使用默认值即可。

depth:表示处理后图像的深度,一般使用-1来表示与原始图像相同的深度(传参数为-1)。

normalize:表示是否进行归一化操作,(=0,不进行归一化;=1,进行归一化)。

滤波方式

1. 高斯滤波

卷积核内的权重呈现高斯分布

dst = cv2.GassianBlur(src, ksize, sigmaX, sigmaY, borderType)

sigmaX、sigmaY:这两个参数分别表示卷积核在水平方向上的权重值。一般不使用,传0即可。

例:

gauss = cv.GaussianBlur(image, (7, 7), 0, 0)

import cv2 as cvimage = cv.imread("E:/dahai.jpeg")
gauss = cv.GaussianBlur(image, (7, 7), 0, 0)cv.imshow("gauss", gauss)
cv.waitKey()
cv.destroyAllWindows()

高斯滤波会使图片变得模糊。

也可以改变卷积核试一下比如(3,7),(7,3)

你会发现两张处理过后的图,一个横向模糊(重影)更多,一个纵向模糊(重影)更多。

2. 均值滤波

卷积核内的权重都为1,它们求和后再除以(N×N)(归一化)

dst = cv2.blur(src, ksize, anchor, borderType)

anchor:表示图像处理的锚点,默认值为(-1,-1),表示位于卷积核中心点。可以不传该参数,使用默认值即可。

例:

blur1 = cv.blur(image, (5, 9))

import cv2 as cvimage = cv.imread("E:/dahai.jpeg")
blur1 = cv.blur(image, (5, 9))
blur2 = cv.blur(image, (9, 5))cv.imshow("blur1", blur1)
cv.imshow("blur2", blur2)
cv.waitKey()
cv.destroyAllWindows()

3. 方框滤波

方框滤波和均值滤波非常相似,卷积权重都为1,但它多了一个参数可以选择归不归一化。

dst = cv2.boxFilter(src, depth, ksize, anchor, normalize, borderType)

depth:表示处理后图像的深度,一般使用-1来表示与原始图像相同的深度(传参数为-1)。

normalize:表示是否进行归一化操作,(=0,不进行归一化;=1,进行归一化)。

例:

# 不归一化
box_1 = cv.boxFilter(image, -1, (3, 1), normalize=0)
# 归一化
box_2 = cv.boxFilter(image, -1, (3, 1), normalize=1)

import cv2 as cvimage = cv.imread("E:/dahai.jpeg")
# 不归一化
box_1 = cv.boxFilter(image, -1, (3, 1), normalize=0)
# 归一化
box_2 = cv.boxFilter(image, -1, (3, 1), normalize=1)
cv.imshow("box_1", box_1)
cv.imshow("box_2", box_2)
cv.waitKey()
cv.destroyAllWindows()

4. 中值滤波

将卷积核内像素的值由大到小排列,取中位数代替卷积核中间的像素值。

dst = cv2.medianBlur(src, ksize)

例:

gauss = cv.medianBlur(image, 3)

import cv2 as cvimage = cv.imread("E:/dahai.jpeg")
gauss = cv.medianBlur(image, 3)cv.imshow("gauss", gauss)
cv.waitKey()
cv.destroyAllWindows()

5. 双边滤波

与上几种滤波方式的不同点:

以上四种滤波方式虽然可以完成对图像的滤波作用,但是并不能很好的保护边缘信息。双边滤波的出现解决了这几个问题,它再滤波过程中可以有效保护图像的边缘信息。

原理:

双边滤波再计算某个像素点是不仅考虑距离信息,还会考虑色差信息。

与当前像素点色差较小的像素点会赋予较大的权重值,色差较大的像素点会赋予较小的权重值。这样就可以保护边缘信息了。

函数:

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)

d:表示再滤波时选取的空间距离参数,表示以当前像素点为中心点的半径。在实际应用中一般选取5.

sigmaColor:表示双边滤波选取的色差范围。

sigmaSpace:表示坐标空间的sigma值,它的值越大,表示越多的点参与滤波。

例:

bilateral2 = cv.bilateralFilter(image, 5, 100, 100)

import cv2 as cvimage = cv.imread("E:/dahai.jpeg")
bilateral1 = cv.bilateralFilter(image, 5, 100, 100)
bilateral2 = cv.bilateralFilter(image, 5, 100, 100)
cv.imshow("bilateral1", bilateral1)
cv.imshow("bilateral2", bilateral2)
cv.waitKey()
cv.destroyAllWindows()

6. 自定义卷积核滤波

可以自己设定卷积核的大小和权重分布,再来滤波。

import cv2 as cv
import numpy as npimage = cv.imread("E:/dahai.jpeg")
k1 = np.ones((3, 3), np.float32)*1/9    # 自定义卷积核k1~~k4
k2 = np.ones((3, 3), np.float32)*2/9
k3 = np.ones((3, 3), np.float32)*3/9
k4 = np.ones((3, 3), np.float32)*4/9out1 = cv.filter2D(image, -1, k1)       # 使用自定义卷积核滤波
out2 = cv.filter2D(image, -1, k2)
out3 = cv.filter2D(image, -1, k3)
out4 = cv.filter2D(image, -1, k4)cv.imshow("out1", out1)
cv.imshow("out2", out2)
cv.imshow("out3", out3)
cv.imshow("out4", out4)
cv.waitKey()
cv.destroyAllWindows()

当然,自定义卷积核使用的是numpy库生成的数组类型。

opencv库是依赖于numpy库的。

我们学习opencv也需要对numpy库的一般用法有一个大概的了解。

总之,

对于滤波方式而言,在不同的场景下,自己选用合适的滤波方法。

其实也就双边滤波保留边缘信息比较特殊一点。其他的也区别不大。

自定义的话,也就是自己随便玩一玩。也更加的自由化。

大概知道平滑滤波的原理,会用一些常用滤波函数方法,其实也就差不多了。

opencv-python学习(三)图片的平滑滤波处理相关推荐

  1. Opencv+Python学习记录9:掩膜(掩码)的使用(内附详细代码)

    一,基本概念 OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如: 计算结果=cv2.add(参数1,参数2,掩模) 当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的 ...

  2. python学习三-基础语法

    python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...

  3. Python学习:图片数据归一化处理

    文章与视频资源多平台更新 微信公众号|知乎|B站|头条:AI研习图书馆 深度学习.大数据.IT编程知识与资源分享,欢迎关注,共同进步~ 1. 介绍 Python学习:在文件夹下,提取目录下所有图片,更 ...

  4. OpenCV Python学习笔记(5)—— 边缘保留滤波(EPF)

    1 边缘保留滤波 高斯双边 均值迁移 2 测试 import cv2 as cv import numpy as npdef bi_demo(image):dst = cv.bilateralFilt ...

  5. Python学习三: 爬虫高级技巧 与 模拟实战练习

    三大爬虫技巧 许多网站针对爬虫的访问都设置了一定的障碍,通过这三步技巧,轻松绕过部分的反爬虫限制. (1)设置程序休止时间 import time import random# 休止睡眠 1 秒 这里 ...

  6. OpenCV+python:读取图片

    1,源码: import cv2 as cv #导入OpenCV库 import numpy as np #导入numpy科学计算包 print("--------- Python + Op ...

  7. Opencv+Python学习记录7:图像加权和(内附详细代码)

    一,介绍 所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为: dst=saturate(src1×α+src2×β+γ) 式中,saturate()表示取饱 ...

  8. python学习----网页图片文字识别(简单)

    在接触python后想对图片进行一些处理  python实现的代码很简单 但是关键在于一些包的导入 我使用的python 软件是 pycharm  可以在setting中去下载requests这个包 ...

  9. (Metro学习三)图片uri保存到本地图片库

    已知网络上图片的uri地址,如何将网络图片保存到本地呢?代码如下: 保存图片到本地 private async Task SaveImageFromUrl(string uri, string fil ...

最新文章

  1. 树模型集成学习(Tree Embedding)
  2. c语言程序设计实验教学,C语言程序设计实验教学改革研究
  3. Blockchain-Based Flexible Double-Chain Architecture and Performance Optimization for Better Sustaina
  4. 勒索软件指向Flash与Silverlight漏洞
  5. spring mvc学习(27):处理数据模型--从表单到controller传输数据续
  6. 没有bug队——加贝——Python 练习实例 3,4
  7. t4b代码生成_用T4模板实现简单的代码生成器
  8. ubuntu18找不到wifi适配器
  9. springcloud官方文档_springcloud-microservice 快速构建分布式系统
  10. 数据库物理结构设计-建索引原则
  11. 数值分析实验四 最小二乘法曲线拟合
  12. python罗马数字转换阿拉伯数字_罗马数字与阿拉伯数字转换
  13. 微信小程序强制更新版本
  14. Centos7 下配置mail使用163邮箱发送邮件
  15. 欢迎清风艾艾在ITPUB博客安家!
  16. 微信公众平台营销策略相关分析
  17. 汽车/车载/自动驾驶/辅助驾驶相关认知记录
  18. org.testng.TestNGException: TestNG by default disables loading DTD from unsecured Urls.问题解决
  19. Java中的byte[]/char[]/int/String数据类型转换
  20. java公众号上传素材及发送图文消息实现

热门文章

  1. Jabber 协议 概述(转载)
  2. 公众号商城报错修复 未授权使用地图 API错误
  3. 2018 年了,你还是只会 npm install 吗?
  4. 海外观察:美国如何进行英语教育?
  5. 再写一些关于风花雪月的散文
  6. XAI-可解释的人工智能
  7. 数据结构——队列(FIFO)
  8. umount磁盘提示target is busy.
  9. 【CAD二次开发】-ObjectARX-JIG 一拖多 (MultipleEntJig)
  10. php 处理上百万条的数据库如何提高处理查询速度