视频去模糊 python_python实现模糊操作-程序员宅基地

技术标签: 视频去模糊 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 defbi_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 defshift_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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39989159/article/details/110754358

智能推荐

Python 入门的60个基础练习_练习python基础语法-程序员宅基地

文章浏览阅读4.2w次,点赞329次,收藏2.7k次。Python 入门的60个基础练习_练习python基础语法

iOS6和iOS7代码的适配(2)——status bar_ios7 statusbar-程序员宅基地

文章浏览阅读1w次。用Xcode5运行一下应用,第一个看到的就是status bar的变化。在iOS6中,status bar是系统在处理,应用_ios7 statusbar

gdb调试时No symbol "var" defined in current context && No Register_no registers调试显示-程序员宅基地

文章浏览阅读2.1k次。问题描述:,在gdb调试程序输出变量:p var,会提示No symbol "var" in current context.原因:程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改程序,整理程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指_no registers调试显示

IDGeneratorUtil 主键id生成工具类_idgeneratorutils.generateid()-程序员宅基地

文章浏览阅读3.4k次。import java.util.Random;import org.drools.util.UUIDGenerator;/** * * * 类名称:GenerateIdUtil * 类描述: 主键生成工具类 * @author chenly * 创建时间:Jul 10, 2012 8:10:43 AM * 修改人: * 修改时间:Jul 10, 2012 8..._idgeneratorutils.generateid()

关于汇编 BX 和 BLX 跳转指令_汇编blx-程序员宅基地

文章浏览阅读5k次。BX:跳转到寄存器reg给出的目的地址处,如:BX R2BLX:跳转到寄存区reg给出的目的地址处并将返回地址存储到LR(R14)使用这两个指令时有一点特别需要注意:跳转的目的地址必须是奇数,若不是奇数则在后面加1,如某函数的起始地址是0x80000f00,则要跳转到此函数则应该跳转到0x80000f01处!否则会进入硬件错误中断!..._汇编blx

前端vue,打包整合进后端springboot的resources里面后,运行只要刷新就报404_前端项目放入resource-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏4次。vue打包后,其实就剩index.html和一堆静态资源,页面的加载和替换都是通过刷新index.html种的dom来实现的(应该是这样,可能表述不是很好),所以做个重定向就可以了。(博主是这么解决的,网上还有很多人是各种路径错误,大家可以尝试下自己是哪个原因)import org.springframework.boot.web.server.ConfigurableWebServerFa..._前端项目放入resource

随便推点

添加远程github仓库时报错 Warning: Permanently added the RSA host key for IP address 52.74.223.119_cmd warning: permanently added-程序员宅基地

文章浏览阅读9.7k次。1.问题展示2.解决方案1.任意窗口, 打开git bash2.命令行界面, 输入cd C:3.cat ~/.ssh/id_rsa.pub正常下面应该显示一大串公钥如果没有,显示如下图, 则进行下一步, 创建公钥4.创建公钥, 输入 ssh-keygen5.然后一直下一步, 直到出现6.再次输入cat ~/.ssh/id_rsa.pub下面一大串数字便是公钥,复制这些字符串, 打开github, 点击头像, 打开settings, 打开SSH and GPG Keys_cmd warning: permanently added

SQL*Plus 使用技巧1-程序员宅基地

文章浏览阅读154次。[code="java"]1. SQL/Plus 常用命令 a. help [topic] 查看命令的使用方法,topic表示需要查看的命令名称。 如: help desc; b. host 该命令可以从SQL*Plus环境切换到操作系统环境,以便执行操作系统命名。 c. host [command] 在sql*plus环境中执行操作系统命令,如:host notepad.exe..._sql+plus的使用方法

域控服务器搭建与管理论文,校园网络服务器的配置与管理 毕业论文.doc-程序员宅基地

文章浏览阅读441次。该文档均来自互联网,如果侵犯了您的个人权益,请联系我们将立即删除!**学校毕 业 论 文**学校园网络服务器的配置与管理姓 名: **学 号: **指导老师:系 名:专 业: 计算机网络技术班 级:二0一一年十二月十五日摘 要随着网络技术的不断发展和Internet的日益普及,许多学校都建立了校园网络并投入使用,这无疑对加快信息处理,提高工作效..._服务器配置与应用论文

mysql单实例多库与多实例单库_数据库单实例和多实例-程序员宅基地

文章浏览阅读1k次。一、单实例多库:一个mysql实例,创建多个数据目录。规划:实例路径:/usr/local/mysql数据目录路径:(1)/usr/local/mysql/data(2)/usr/local/mysql/data2步骤:安装mysql。配置my.cnf文件。初始化各个数据库。用mysqld_multi启动。1、安装mysql。平常安装。2、m..._数据库单实例和多实例

MFC解决找不到MFC90.DLL的问题_microsoft v90.debugmfc-程序员宅基地

文章浏览阅读6.3k次。今天装了第三方的MFC软件库Xtreme ToolkitPro v15.0.1,听说搞MFC的人都知道它的强大,我刚学习,所以装了一个,然后想运行一下它自带的例子看看。出现一个“找不到mfc90.dll“的问题,百度一下,记录如下:vs2008已经打过sp1补丁,编译C++程序会提示找不到mfc90.dll文件的错误,但是如果是release版的话就能正常运行csdn看到解决方案,粘贴_microsoft v90.debugmfc

XeLaTeX-中文排版解决方案_latex 中文排版 texlive-程序员宅基地

文章浏览阅读2.1k次。以前使用CJK进行中文的排版,需要自己生成字体库,近日,出现了XeTeX,可以比较好的解决中文字体问题,不需要额外生成LaTeX字体库,直接使用计算机系统里的字体,本文以在Linux下为例说明XeTeX的使用。操作系统: UbuntuTeX:除了texlive包外,还需要安装的包是texlive-xetex。字体:可以使用fc-list查看你自己的字体库,注意字体的完整名称,在XeTe..._latex 中文排版 texlive