目录:

(一)模糊或平滑与滤波的介绍

(二)均值模糊

(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实现模糊操作的更多相关文章

  1. opencv python:模糊操作

    均值模糊 中值模糊 自定义模糊 模糊操作的基本原理 基于离散卷积 定义好每个卷积核 不同卷积核得到不同的卷积效果 模糊是卷积的一种表象 blur cv2.blur(image, (1, 3)) 第二个 ...

  2. Python+OpenCV图像处理(七)—— 滤波与模糊操作

    过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频 ...

  3. python anaconda 常用操作;conda 命令指南

    在使用 python anaconda时,经常会用到很多常用操作,记录下来,方便以后更好地使用: conda: Conda既是一个包管理器又是一个环境管理器.你肯定知道包管理器,它可以帮你发现和查看包 ...

  4. python高级之操作数据库

    python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...

  5. Python 文件常见操作

    # -*-coding:utf8 -*- ''''' Python常见文件操作示例 os.path 模块中的路径名访问函数 分隔 basename() 去掉目录路径, 返回文件名 dirname()  ...

  6. Python :open文件操作,配合read()使用!

    python:open/文件操作 open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) 如何打开文件 handle=open(file_name,a ...

  7. 第九篇:python高级之操作数据库

    python高级之操作数据库   python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...

  8. (转载)Python 列表(list)操作

    (转载)http://blog.csdn.net/facevoid/article/details/5338048 创建列表sample_list = ['a',1,('a','b')] Python ...

  9. python之数据库操作(sqlite)

    python之数据库操作(sqlite) 不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接A ...

随机推荐

  1. JavaScript 字符串(上)

    JavaScript 字符串(上) 三种引号 字符串可以包含在单引号.双引号或反引号中 //用法 let single = 'Single quotation mark'; //单引号 let dou ...

  2. mysql增删改查——条件查询+模糊查询

    条件查询一般是 = 等于 >大于 <小于 >=大于等于 <=小于等于 <>区间 between and区间 or并且 and或者 in包含 like模糊查询 实例, ...

  3. 使用Python写词云数据可视化

    词云的应用场景 会议记录 海报制作 PPT制作 生日表白 数据挖掘 情感分析 用户画像 微信聊天记录分析 微博情感分析 Bilibili弹幕情感分析 年终总结 安装本课程所需的Python第三方模块 ...

  4. CompleteFuture实现简单的任务编排实践

    CompleteFuture实现简单的任务编排实践 一:前言 ​ CompleteFuture是java8 新提供的API,是对函数式编程思想的体现,提供了很多的对于函数式编程支持.不止有同步处理功能 ...

  5. 4.1 The Example Domain 领域示例代码

    4.1 The Example Domain 领域示例代码 The examples will use some concepts those are used by GitHub, like Iss ...

  6. 【MySQL】MySQL(四)存储引擎、索引、锁、集群

    MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...

  7. 整数划分为k份

    题目 将整数n分成k份,且每份不能为空,任意两个方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入 ...

  8. Bubble和BubbleButton气泡框

    from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang.builder import Buil ...

  9. UltraSoft - Beta - Scrum Meeting 6

    Date: May 22n'd, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 修复了DDL日程自动发邮件被服务器"吞掉"的bug后端增加了 ...

  10. stm32电机控制之控制两路直流电机!看完你会了吗

    手头上有一个差分驱动的小车,使用两个直流电机驱动,要实现小车的在给定速度下运动,完成直线行驶,转向,加速,刹车等复杂运动. 使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制, ...