opencv-python学习(三)图片的平滑滤波处理
目录
前言:
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学习(三)图片的平滑滤波处理相关推荐
- Opencv+Python学习记录9:掩膜(掩码)的使用(内附详细代码)
一,基本概念 OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如: 计算结果=cv2.add(参数1,参数2,掩模) 当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的 ...
- python学习三-基础语法
python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...
- Python学习:图片数据归一化处理
文章与视频资源多平台更新 微信公众号|知乎|B站|头条:AI研习图书馆 深度学习.大数据.IT编程知识与资源分享,欢迎关注,共同进步~ 1. 介绍 Python学习:在文件夹下,提取目录下所有图片,更 ...
- OpenCV Python学习笔记(5)—— 边缘保留滤波(EPF)
1 边缘保留滤波 高斯双边 均值迁移 2 测试 import cv2 as cv import numpy as npdef bi_demo(image):dst = cv.bilateralFilt ...
- Python学习三: 爬虫高级技巧 与 模拟实战练习
三大爬虫技巧 许多网站针对爬虫的访问都设置了一定的障碍,通过这三步技巧,轻松绕过部分的反爬虫限制. (1)设置程序休止时间 import time import random# 休止睡眠 1 秒 这里 ...
- OpenCV+python:读取图片
1,源码: import cv2 as cv #导入OpenCV库 import numpy as np #导入numpy科学计算包 print("--------- Python + Op ...
- Opencv+Python学习记录7:图像加权和(内附详细代码)
一,介绍 所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为: dst=saturate(src1×α+src2×β+γ) 式中,saturate()表示取饱 ...
- python学习----网页图片文字识别(简单)
在接触python后想对图片进行一些处理 python实现的代码很简单 但是关键在于一些包的导入 我使用的python 软件是 pycharm 可以在setting中去下载requests这个包 ...
- (Metro学习三)图片uri保存到本地图片库
已知网络上图片的uri地址,如何将网络图片保存到本地呢?代码如下: 保存图片到本地 private async Task SaveImageFromUrl(string uri, string fil ...
最新文章
- 树模型集成学习(Tree Embedding)
- c语言程序设计实验教学,C语言程序设计实验教学改革研究
- Blockchain-Based Flexible Double-Chain Architecture and Performance Optimization for Better Sustaina
- 勒索软件指向Flash与Silverlight漏洞
- spring mvc学习(27):处理数据模型--从表单到controller传输数据续
- 没有bug队——加贝——Python 练习实例 3,4
- t4b代码生成_用T4模板实现简单的代码生成器
- ubuntu18找不到wifi适配器
- springcloud官方文档_springcloud-microservice 快速构建分布式系统
- 数据库物理结构设计-建索引原则
- 数值分析实验四 最小二乘法曲线拟合
- python罗马数字转换阿拉伯数字_罗马数字与阿拉伯数字转换
- 微信小程序强制更新版本
- Centos7 下配置mail使用163邮箱发送邮件
- 欢迎清风艾艾在ITPUB博客安家!
- 微信公众平台营销策略相关分析
- 汽车/车载/自动驾驶/辅助驾驶相关认知记录
- org.testng.TestNGException: TestNG by default disables loading DTD from unsecured Urls.问题解决
- Java中的byte[]/char[]/int/String数据类型转换
- java公众号上传素材及发送图文消息实现