python实现模糊操作
目录:
(一)模糊或平滑与滤波的介绍
(二)均值模糊
(1) 原理
(2)代码实现-----均值模糊函数blur()
(三)中值模糊------mediaBlur函数
(四)高斯模糊------GaussianBlur函数
(五)方框滤波------boxFliter函数
(六)双边滤波------bilateralFilter()函数
(七)自定义模糊filter2D
(1)介绍
(2)实现中值模糊
(3)实现锐化处理
(八)边缘保留滤波------EPF
(1)高斯双边
(2)均值迁移
正文:
(一)模糊或平滑或滤波的介绍
平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多, 但是在本教程中我们仅仅关注它减少噪声的功用。从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果。
平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 (i.e.
) 是输入像素值 (i.e.
)的加权和 :
称为 核, 它仅仅是一个加权系数。
不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。
滤波器的种类有很多, 这里仅仅提及最常用的。
(二)均值模糊
(1) 原理
最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等)
核如下:
比如一个3*3的模板其实就可以如下表示:
(2)代码实现-----均值模糊函数blur()
均值模糊函数blur(),定义:blur(src,ksize,dst=None, anchor=None, borderType=None)。定义是有5个参数,但最后三个均为none,所以也就2个参数
src:要处理的原图像,ksize: 周围关联的像素的范围。
def blur_demo(image): #均值模糊
dst = cv.blur(image,(3,3)) #ksize是卷积核大小3行3列,列数越大模糊越大
cv.imshow("blur_demo",dst)
(三)中值模糊------mediaBlur函数
中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的。这个模板一般用于去除椒盐噪声。中值滤波对于这些白点噪声的去除是非常的好的。
前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他,卷积核的大小也是个奇数。
中值模糊函数medianBlur(): 定义:medianBlur(src, ksize, dst=None)。ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示了5*5方阵
1 def median_blur_demo(image): #中值模糊,对于椒盐噪声的去噪效果好,去掉图片中的一些黑点等
2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3 for i in range(2000): # 添加点噪声,白色
4 temp_x = np.random.randint(0, gray.shape[0])
5 temp_y = np.random.randint(0, gray.shape[1])
6 gray[temp_x][temp_y] = 255
7
8 cv.imshow("median_blur_gray", gray)
9 dst = cv.medianBlur(gray,5) #ksize是卷积核大小1行3列,列数越大模糊越大
10 cv.imshow("median_blur_demo",dst)
(四)高斯模糊------GaussianBlur函数
https://www.cnblogs.com/april0315/p/13593743.html
(五)方框滤波
默认是归一化处理的,也就是normalize没有这个参数时
5*5核很容易发生溢出(每个像素点的值都保留在255),最后图片为白色,2*2的核可能不会。
(六)双边滤波------bilateralFilter()函数
定义:bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
d:邻域直径
sigmaColor:颜色标准差
sigmaSpace:空间标准差
1 src2 = cv.bilateralFilter(src1, 5, 5, 2) 2 cv.imshow("双边滤波", src2)
(七)自定义模糊filter2D(上面是封装在2D滤波器之上)
(1)介绍
Opencv提供的一个通用的2D滤波函数为cv2.filter2D(),
滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将和模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,
核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,
也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。
(2)实现中值模糊
1 def custom_blur_demo(image): #自定义模糊
2 kernel = np.ones([5,5],np.float32)/25 #声明二维数组5*5,初始化1,保证值不溢出,除以数组大小,实现中值模糊 自定义卷积核的算子
3 dst = cv.filter2D(image,-1,kernel)
4 cv.imshow("custom_blur_demo",dst)
上述生成的5*5核模板其实就是一个均值滤波。,当我们是/25就是中值滤波,归一化处理
(3)实现锐化处理
1 def custom_blur_demo(image): #自定义模糊
2 kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) #实现锐化处理,提高图像的对比度,提高立体感,轮廓更加清晰
3 dst = cv.filter2D(image,-1,kernel)
4 cv.imshow("custom_blur_demo",dst)
(八)边缘保留滤波------EPF
opencv实现EPF有两种传统方法,高斯双边和均值迁移
(1)高斯双边
差异越大,越会完整保留
1 def bi_demo(image):
2 dst = cv.bilateralFilter(image,0,100,15) #第二个参数d是distinct,我们若是输入了d,会根据其去算第3或4个参数,我们最好是使用第3或4个参数反算d,先设为0
3 cv.imshow("bi_demo",dst)
4
5 src = cv.imread("./1.png") #读取图片
6 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
7 cv.imshow("input image",src) #通过名字将图像和窗口联系
8 bi_demo(src)
9 cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
10 cv.destroyAllWindows() #销毁所有窗口
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None): # real signature unknown; restored from __doc__
d, sigmaColor, sigmaSpace-------0,越大,越小
值域和空域的两个方差sigma可以简单的设置为相等,小于10,无太大效果,大于150效果太强,像卡通片似的。
滤波器尺寸d:大于5将较慢(5 forreal-time),d=9,for off-lineapplications,d 是像素邻域“直径”。计算的半径,半径之内的像数都会被纳入计算,如果提供-1,会从后面的参数sigmaSpace中自动计算。
Sigma_color颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
Sigma_space坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace. 双边滤波的内在想法是:在图像的值域(range)上做传统滤波器在空域(domain)上做的工作。空域滤波对空间上邻近的点进行加权平均,加权系数随着距离的增加而减少;值域滤波则是对像素值相近的点进行加权平均,加权系数随着值差的增大而减少。
对于第三个参数:d来说一般来说,要想得到比较好的结果,3、4、5参数最好都指定。
第三个参数如果设定值大于5,那计算会很慢,所以一般设置都等于5,如果少数情况需要去除比较大的噪声,那么d=9。要取得较好的平滑效果,最好在9附近
d或者Sigma_space设置的越大,包含的范围越大,耗时越长
(2)均值迁移
def pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None): # real signature unknown; restored from __doc__
1 def shift_demo(image):
2 dst = cv.pyrMeanShiftFiltering(image,10,50) #第二个参数d是distinct,我们若是输入了d,会根据其去算第3或4个参数,我们最好是使用第3或4个参数反算d,先设为0
3 cv.imshow("shift_demo",dst)
第一个参数src,输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可;
第二个参数sp,定义的漂移物理空间半径大小; #越大,细节丢失越多
第三个参数sr,定义的漂移色彩空间半径大小;
第四个参数dst,输出图像,跟输入src有同样的大小和数据格式;
第五个参数maxLevel,定义金字塔的最大层数;
第六个参数termcrit,定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;
参考:
https://www.cnblogs.com/ssyfj/p/9267648.html
https://blog.csdn.net/u011321546/article/details/79578029
python实现模糊操作的更多相关文章
- opencv python:模糊操作
均值模糊 中值模糊 自定义模糊 模糊操作的基本原理 基于离散卷积 定义好每个卷积核 不同卷积核得到不同的卷积效果 模糊是卷积的一种表象 blur cv2.blur(image, (1, 3)) 第二个 ...
- Python+OpenCV图像处理(七)—— 滤波与模糊操作
过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频 ...
- python anaconda 常用操作;conda 命令指南
在使用 python anaconda时,经常会用到很多常用操作,记录下来,方便以后更好地使用: conda: Conda既是一个包管理器又是一个环境管理器.你肯定知道包管理器,它可以帮你发现和查看包 ...
- python高级之操作数据库
python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...
- Python 文件常见操作
# -*-coding:utf8 -*- ''''' Python常见文件操作示例 os.path 模块中的路径名访问函数 分隔 basename() 去掉目录路径, 返回文件名 dirname() ...
- Python :open文件操作,配合read()使用!
python:open/文件操作 open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) 如何打开文件 handle=open(file_name,a ...
- 第九篇:python高级之操作数据库
python高级之操作数据库 python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...
- (转载)Python 列表(list)操作
(转载)http://blog.csdn.net/facevoid/article/details/5338048 创建列表sample_list = ['a',1,('a','b')] Python ...
- python之数据库操作(sqlite)
python之数据库操作(sqlite) 不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接A ...
随机推荐
- mysql从零开始之MySQL UPDATE 更新
MySQL UPDATE 更新 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQ ...
- php链接mysql,php链接mysql的常用方法
PHP连接MySQL数据库的几种方法 1.最简单的方式-mysql(面向过程) <?php $con = mysql_connect("localhost","ro ...
- 6.堆和GC
一. 堆和GC介绍 1.java堆的特点 <深入理解java虚拟机>是怎么描述java堆的 Java堆(Java Heap)是java虚拟机所管理的内存中最大的一块 java堆被所有线程共 ...
- 2020.4.6--UCF Local Programming Contest 2017的正式赛
Problem A : Electric Bill 题目大意:进行电量分级制收费,1000kwh及以下一档收费,1000kwh以上按另一档收费,给出每个人的电量总额,问每人应支付多少钱. 思路:基础i ...
- 你对微信小程序的理解?优缺点?
一.是什么 2017年,微信正式推出了小程序,允许外部开发者在微信内部运行自己的代码,开展业务 截至目前,小程序已经成为国内前端的一个重要业务,跟 Web 和手机 App 有着同等的重要性 小程序是一 ...
- Less-(26~28) preg_replace3
Less-26: 核心语句: 各种回显均存在. 本题相比Less-25,多屏蔽了很多符号: 首先是各种注释符 --+,#,/**/ . /[]/表示字符集合:任何出现在里面的字符均会被替换. 屏蔽 ...
- oo第三次博客-JML规格
这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性. Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各 ...
- SpringBoot整合多个RabbitMQ
一.背景 最近项目中需要用到了RabbitMQ来监听消息队列,监听的消息队列的 虚拟主机(virtualHost)和队列名(queueName)是不一致的,但是接收到的消息格式相同的.而且可能还存 ...
- Spring Cloud Alibaba 介绍及工程准备
简介 SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案. 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一个服务都是可以独立运行的子工程.其中涵盖 ...
- [hi3521] nand flash 的 boot 启动模式的区别?
spi nand flash 的 boot 启动模式选择.0:1 线 boot:1:4 线 boot.请问,1线boot和4线boot有什么区别呢?该如何选择呢? 收藏 顶 踩 回复 使用 ...