• 使用不同的低筒滤波器对图像进行模糊
  • 使用自定义的率弄起对图像进行卷积(2D卷积)

2D卷积

  与信号一样,我们也可以对2D图像实施低通滤波,高通滤波等。LPF帮助我们去除噪声,模糊图像。而HPF帮助我们找到图像边缘。

  OpenCV提供的函数cv2.filter2D()可以让我们对一幅图像进行卷积操作。比如下面我们将对一幅图像使用平均滤波器,如一个5*5的平均滤波器核:

  

操作如下:将核放在图像的一个像素A上,求与核对应的图像上的25个像素的和,再取平均数,用这个平均数代替像素A的值。重复以上操作直到将图像的每一个像素值都更新一边。例程如下:

# -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('2.jpg') kernel = np.ones((5,5),np.float32)/25 #cv2.filter2D(src,depth,kernel,...)
#那个depth暂时没看出有啥用,试了几个值都没区别
dst = cv2.filter2D(img,-1,kernel) cv2.imshow('ori',img)
cv2.imshow('avr',dst) cv2.waitKey(0)
cv2.destroyAllWindows()

  ---> 

图像模糊(图像平滑)

  使用低通滤波器可以达到图像模糊的目的。这对去除噪声很有帮助。其实就是去掉图像中的高频部分(比如:噪声,边界)。所以边界也会被模糊一点(当然也存在一些不会模糊掉边界的技术)。OpenCV中提供了四种模糊技术。

1.平均

  其实和前面是一样的,但是实现方法不一样,他是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用cv2.blur() 和 cv2.boxFilter()来完成。我们需要设定卷积框的宽和高。如下面一个3*3的归一化卷积框:

# -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('2.jpg') blur = cv2.blur(img,(3,3))如果改为5*5应该会得到和前面一样的效果
#如果不想用归一化卷积框,可以用blur = cv2.boxFilter(src,depth,size,...)并传入参数normalize=False #由于用plt读入BGR图会出问题,所以改用cv2
cv2.imshow('ori',img)
cv2.imshow('avr',blur) cv2.waitKey(0)
cv2.destroyAllWindows()

2.高斯模糊

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

  也可以用cv2.getGaussianKernel()自己构建一个高斯核。

  可以将高斯模糊应用于开始的例子中:

  # -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('2.jpg')

blur = cv2.GaussianBlur(img,(5,5),0)

#由于用plt读入BGR图会出问题,所以改用cv2
cv2.imshow('ori',img)
cv2.imshow('avr',blur)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果如下

--->

3.中值模糊

  顾名思义就是用与卷积框对应像素的中值来替代中心像素的值。这个滤波器经常用来去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围的值来取代他。他能有效的去除噪声,卷积核的大小也必须是一个奇数(否则哪来的中心)

  我们可以在原图上加上50%的噪声在使用中值模糊。

# -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('6.jpg') blur = cv2.medianBlur(img,5) #由于用plt读入BGR图会出问题,所以改用cv2
cv2.imshow('ori',img)
cv2.imshow('avr',blur) cv2.waitKey(0)
cv2.destroyAllWindows()

   --->

4.双边滤波

  cv2.bilateralFilter()能在保持边界清晰的情况下有效的去除噪声。但是这种操作与其他滤波器相比会比较慢。双边滤波和前述的滤波不同,他同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。

  进行双边滤波的代码如下:

# -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('2.jpg') #cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace),d是邻域直径,两个75分别し空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75) #由于用plt读入BGR图会出问题,所以改用cv2
cv2.imshow('ori',img)
cv2.imshow('avr',blur) cv2.waitKey(0)
cv2.destroyAllWindows()

效果如下:

---> 

  

  

OpenCV学习笔记(8)——图像平滑的更多相关文章

  1. opencv学习笔记(四)--图像平滑处理

    图像平滑处理的几种常用方法: 均值滤波 归一化滤波 高斯模糊 中值滤波 平滑处理(模糊)的主要目的是去燥声: 不同的处理方式适合不同的噪声图像,其中高斯模糊最常用. 其实最重要的是对图像卷积的核的理解 ...

  2. OpenCV学习笔记3

    OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...

  3. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  4. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  5. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  6. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

  7. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

  8. opencv学习笔记(二)寻找轮廓

    opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...

  9. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

随机推荐

  1. 13、yum

    1.yum yum是管理rpm包的工具 2.yum源(yum仓库) 要使用yum前,需要准备一个yum源(我们也称为yum仓库), 这个可以是一个互联网上的仓库,也可以是本地自己搭建的仓库. 仓库里面 ...

  2. PAT Basic 1014 福尔摩斯的约会 (20 分)

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  3. PHP+redis消息队列抢购实现

    实现功能: 1. 基于redis队列,防止高并发的超卖 2. 基于mysql的事务加排它锁,防止高并发的超卖 基于redis队列工作流程: 1. 管理员根据goods表中的库存,创建redis商品库存 ...

  4. HTTP与TCP的区别和联系(转)

    https://www.cnblogs.com/baizhanshi/p/8482612.html

  5. Java & Mysql 餐饮管理系统 过程心得记录

    ------------------------------------------Have a Good Day~---------------------------------- 准备国赛和AC ...

  6. 如何在某些情况下禁止提交Select下拉框中的默认值或者第一个值(默认选中的就是第一个值啦……)

    群里有个帅哥问了这么个问题,他的下拉框刚进页面时是隐藏起来的,但是是有值的,为啥呢?因为下拉框默认选中了第一个值呗,,, 所以提交数据的时候就尴尬啦,明明没有选,但是还是有值滴.怎么办呢? 一开始看到 ...

  7. k8spod探测

    一.pod存活性探测 pod spec为容器列表中的相应容器定义其专用的探针即可启用存活性探测,目前,k8s的容器支持存活性探测的方法包含:ExecAction.TCPSocketActon和HTTP ...

  8. mahout从入门到放弃--安装(1)

    1.稀里糊涂下载 我的集群是hadoop 2.7.3 ,本来想找到对应的mahout版本,但是没有找到.本着安全原则,mahout最新版本是0.14.0,回退一个版本使用0.13.0 mahout地址 ...

  9. Android APK 手动签名

    首先,如果没有签名密钥,先生成密钥: keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore and ...

  10. linux运维、架构之路-MongoDB单机部署

    一.MongoDB介绍 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系型数据库和非关系 ...