学习目标:

  • 使用自定义的滤波器对图像进行卷积(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. ABP框架没有httpPost,httpget,httpput特性

    需要引用一下组件, Microsoft.AspNetCore.Mvc

  2. stm32h7 hal 库的学习

    stm32h7xx_hal_conf.h 中需要注意的几个地方: HSE_VALUE 这个外接晶振的频率 TICK_INT_PRIORITY 这个 tick 的中断优先级,因为 HAL_DELAY 这 ...

  3. Java中String类为什么被设计为final?

    Java中String类为什么被设计为final   首先,String是引用类型,也就是每个字符串都是一个String实例.通过源码可以看到String底层维护了一个byte数组:private f ...

  4. like not like 优化

    instr(title,’手册’)>0 相当于like instr(title,’手册’)=0 相当于not like 对于LIKE语句,我们可以使用instr函数来进行SQL调优

  5. logrus日志框架

    目录 logrus介绍 logrus配置 日志打印 HOOK机制 Gin日志 Fatal处理 线程安全 logrus介绍 golang标准库的日志框架非常简单,仅仅提供了print,panic和fat ...

  6. Windows 远程桌面连接 CentOS7 (xrdp)

    Windows 远程桌面连接 CentOS7 (xrdp) 前提: CentOS安装桌面,如果无桌面,请执行: yum -y groups install "GNOME Desktop&qu ...

  7. 吴裕雄--天生自然MySQL学习笔记:MySQL 连接的使用

    使用 MySQL 的 JOIN 在两个或多个表中查询数据. 可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询. JOIN 按照功能大致分为如 ...

  8. mysql中各种复杂的增删改查

    1.mysql查出数据表中连续出现三次或三次以上的数据 建一张表如下:表名为 number 1.1 要求找出num列连续出现三次或三次以上的数据: select * from number where ...

  9. Java之创建线程的方式三:实现Callable接口

    import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...

  10. 2020/1/27代码审计学习之SQL注入漏洞

    PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...