学习目标:

  • 使用自定义的滤波器对图像进行卷积(2D 卷积)

  • 学习使用不同的低通滤波器对图像进行模糊

一、2D卷积

卷积不是很了解的可以看我上一篇博客,与语音信号一样,我们也可以对 2D 图像实施低通滤波(LPF),高通滤波(HPF)等。低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

2D卷积其本质上也是一个加权平均的过程,openCV提供cv2.filter2D(src ,deepth,kernel)函数进行2D卷积,其中kernel是我们需要提供的卷积核,卷积核一般为一个奇数级的矩阵,其中所有元素的和为1,deepth一般为-1.

import cv2
import numpy as np
img = cv2.imread('/home/wl/le.jpeg',1)
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()

原图:

卷积图:

二、图像模糊

OpenCV 提供了四种模糊技术,但其本质上还是在卷积。

(1)平均

Cv2.blur(src ,size)可以用于实现最简单的平均卷积操作,原理和上面2D卷积一样,只需要提供一个size数组,该数组包含卷积核的长度和宽度即可。

import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.blur(img,(5,5))
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()



(2)高斯模糊

现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是 cv2.GaussianBlur(src ,size ,标准差)。我们需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿 X,Y 方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。如果你愿意的话,你也可以使用函数 cv2.getGaussianKernel() 自己构建一个高斯核。

import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.GaussianBlur(img,(5,5),2)
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()


(3)中值模糊

中值模糊非常简单,其使用卷积核对应的像素阵列的中值去代替卷积核最中心位置像素的像素值,注意,此处的中值是统计意义上的中值,要先对像素阵列中的值进行排序再取的中值。这个滤波器经常用来去除椒盐噪声。使用cv2.medianBlur(img,size)即可实现中值模糊。

import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.medianBlur(img,7)
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()

(4)双边滤波

使用高斯模糊等方式,只考虑了像素的空间关系,但不会考虑像素之间的大小关系,其结果有可能会导致图像边缘失真,而双边滤波则会考虑像素的大小关系,双边滤波同时使用了空间高斯权重以及灰度值的相似性权重(边界处的灰度值变化比较大),空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算,所以使用双边滤波则可以较好的保留图像边缘。使用cv2.bilateralFilter(src ,size,空间标准差,灰度值标准差)可以实现双边滤波。

Opencv笔记(十一)——图像模糊(平滑)的更多相关文章

  1. 《C++游戏开发》笔记十一 平滑动画:不再颤抖的小雪花

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9430645 作者:七十一雾央 新浪微博:http:/ ...

  2. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  3. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  4. OpenCV笔记大集锦(转载)

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  5. opencv笔记6:角点检测

    time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...

  6. opencv笔记3:trackbar简单使用

    time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...

  7. opencv笔记2:图像ROI

    time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...

  8. opencv笔记1:opencv的基本模块,以及环境搭建

    opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...

  9. python3.4学习笔记(十一) 列表、数组实例

    python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...

  10. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

随机推荐

  1. C# ASP 面试题 2017

    在博客上看到的,感觉还不错 https://www.cnblogs.com/renyiqiu/p/6435261.html

  2. python人脸识别项目face-recognition

    该项目基于Github上面的开源项目人脸识别face-recognition,主要是对图像和视频中的人脸进行识别,在开源项目给出的例子基础上对视频人脸识别的KNN算法进行了实现. 0x1 工程项目结构 ...

  3. Innodb特性以及实现原理

    Innodb五大特性 1.insert buffer2.double write3.自适应哈希索引4.异步io5.邻接页刷新 1.insert buffer(change buffer) 作用:将非聚 ...

  4. IDEA控制台输出中文乱码日志文件正常

    控制台中文输出乱码但输出的日志文件正常 idea.exe.vmoptions与idea64.exe.vmoptions已经配置 -Dfile.encoding=UTF-8 logback.xml中也配 ...

  5. linux 下shell 编写脚本

    linux 下shell 编写脚本: 1.程序结构练习:编写一个脚本,给定一个正整数,计算出这个数所有位的数字之和. 例如:程序给定输入123,那么应该返回1+2+3=6. 2.程序结构练习:编写一个 ...

  6. Java语言概述-JavaSE

    代码虐我千百遍,我视代码如初恋 初级学习思想: 先了解Java 下载中英文文档对照学习 多看,多学 多敲,狂练 多标注注释 总结—创造 https://baike.baidu.com/(Java百度百 ...

  7. Java学习——代理模式

    Java中的三种代理模式 一,什么是代理模式? 代理模式是一种设计模式,简单的来说就是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing ...

  8. sys.path.append()加入当前目录为环境变量

    当我们导入一个模块时:import  xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中: >>> import  ...

  9. 寒假day14

    今天去医院看脸了,回来继续写论文.

  10. 【转帖】虚拟化Pod性能比裸机还要好,原因竟然是这样!

    虚拟化Pod性能比裸机还要好,原因竟然是这样! http://www.itpub.net/2020/02/27/5340/ 其实感觉 linux也可以做到 NUMA的节点优化 其实 直接在 ESXi上 ...