深度CV基础——图像噪声和滤波
一,图像噪声
1.图像噪声的概念:
图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述, 也就是使用随机过程的描述,也就是用它的高斯分布函数和概率密度分布函数。图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到了噪声的污染。
2.信噪比:
在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声。通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大。在这里,采用信号像素点的占比充当SNR,以衡量所添加噪声的多少。
举个例,假设一张图像的宽x高 = 10x10 ,共计100个像素,想让其中20个像素点变为噪声,其余80 个像素点保留原值,则这里定义的SNR=80/100 = 0.8 。
3.高斯噪声
一个正常的高斯采样分布公式G(d), 得到输出像素Pout.
Pout = Pin + XMeans + sigma *G(d)
其中d为一个线性的随机数,G(d)是随机数的高斯分布随机值。Pin是一个输入像素。
给一副数字图像加上高斯噪声的处理顺序如下:
- 输入参数sigma 和 X mean
- 以系统时间为种子产生一个伪随机数
- 将伪随机数带入G(d)得到高斯随机数
- 根据输入像素计算出输出像素
- 重新将像素值放缩在[0 ~ 255]之间
- 循环所有像素
- 输出图像
如下示例:
代码如下:
import cv2
import randomdef GaussianNoise(src, means, sigma, percetage):NoiseImg = src# 获取需要加入噪点的个数NoiseNum = int(percetage * NoiseImg.shape[0] * NoiseImg.shape[1])for i in range(NoiseNum):# 产生和之前不一样的随机值 对边缘不处理randX = random.randint(0, src.shape[0] - 1)randY = random.randint(0, src.shape[1] - 1)# 此处原有像素值上面加上随机数NoiseImg[randX, randY] = NoiseImg[randX, randY] + random.gauss(means, sigma=sigma)# 对像素值进行限幅if NoiseImg[randX, randY] < 0:NoiseImg[randX, randY] = 0if NoiseImg[randX, randY] > 255:NoiseImg[randX, randY] = 255return NoiseImgif __name__ == '__main__':img = cv2.imread('lenna.png', 0)img1 = GaussianNoise(img, 8, 4, 0.7)img = cv2.imread('lenna.png')img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow('source', img2)cv2.imshow('lenna_GaussianNoise', img1)cv2.waitKey(0)
4.椒盐噪声
椒盐噪声又称为脉冲噪声,它是一种随机出现的白点(像素值最大)或者黑点(像素值最小)。
椒盐噪声 = 椒噪声 (pepper noise)+ 盐噪声(salt noise)。 椒盐噪声的值为0(椒)或者255(盐)。前者是低灰度噪声,后者属于高灰度噪声。一般两种噪声同时出现,呈现在图像(灰度图)上就是黑白杂点。对于彩色图像,也有可能表现为在单个像素BGR三个通道随机出现的255或0。
对于图像上面加上椒盐噪声的步骤如下:
- 指定信噪比 SNR ,其取值范围在[0, 1]之间
- 计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
- 随机获取要加噪的每个像素位置P(i, j)
- 指定像素值为255或者0。
- 重复3, 4两个步骤完成所有NP个像素的加噪
如下示例:
代码如下:
import cv2
import numpy as np
import randomdef PeperNoise(src, percetage):NoiseImg = srcNoiseNum = int(percetage * NoiseImg.shape[0] * NoiseImg.shape[1])for i in range(NoiseNum):# 随机生成要改变像素值的像素点坐标randx = random.randint(0, src.shape[0] - 1)randy = random.randint(0, src.shape[1] - 1)# 使用random.random()生成0-1的浮点数 所以白点和黑点各一半概率if random.random() < 0.5:NoiseImg[randx, randy] = 0else:NoiseImg[randx, randy] = 255return NoiseImgif __name__ == '__main__':img = cv2.imread('lenna.png', 0)img1 = PeperNoise(img, 0.7)img = cv2.imread('lenna.png')img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow('source', img2)cv2.imshow('lenna_GaussianNoise', img1)cv2.waitKey(0)
5.总结
对于图像噪声来说改变的就是图像像素点的像素值(灰度值),有可能这种改变服从某种分布(高斯分布,泊松分布等)或者有别的规律,但是最终都是改变像素值,需要加入噪声的时候也可以直接调用对应的接口。
调用OpenCV
库实现如下:
import cv2 as cv
import numpy as np
from PIL import Image
from skimage import util'''
def random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs):
功能:为浮点型图片添加各种随机噪声
参数:
image:输入图片(将会被转换成浮点型),ndarray型
mode: 可选择,str型,表示要添加的噪声类型gaussian:高斯噪声localvar:高斯分布的加性噪声,在“图像”的每个点处具有指定的局部方差。poisson:泊松噪声salt:盐噪声,随机将像素值变成1pepper:椒噪声,随机将像素值变成0或-1,取决于矩阵的值是否带符号s&p:椒盐噪声speckle:均匀噪声(均值mean方差variance),out=image+n*image
seed: 可选的,int型,如果选择的话,在生成噪声前会先设置随机种子以避免伪随机
clip: 可选的,bool型,如果是True,在添加均值,泊松以及高斯噪声后,会将图片的数据裁剪到合适范围内。如果谁False,则输出矩阵的值可能会超出[-1,1]
mean: 可选的,float型,高斯噪声和均值噪声中的mean参数,默认值=0
var: 可选的,float型,高斯噪声和均值噪声中的方差,默认值=0.01(注:不是标准差)
local_vars:可选的,ndarry型,用于定义每个像素点的局部方差,在localvar中使用
amount: 可选的,float型,是椒盐噪声所占比例,默认值=0.05
salt_vs_pepper:可选的,float型,椒盐噪声中椒盐比例,值越大表示盐噪声越多,默认值=0.5,即椒盐等量
--------
返回值:ndarry型,且值在[0,1]或者[-1,1]之间,取决于是否是有符号数
'''img = cv.imread("lenna.png")
noise_gs_img=util.random_noise(img,mode='gaussian')cv.imshow("source", img)
cv.imshow("lenna",noise_gs_img)
#cv.imwrite('lenna_noise.png',noise_gs_img)
cv.waitKey(0)
cv.destroyAllWindows()
二,图像滤波
1.图像滤波的一些简单的基础概念:
- 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
- 消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
- 平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关, 邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
- 关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。
2.均值滤波:
均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。
•从左到右从上到下计算图像中的每个像素,最终得到处理后的图像。
•均值滤波可以加上两个参数,即迭代次数,Kernel数据大小。
•一个相同的Kernel,但是多次迭代就会效果越来越好。
•同样,迭代次数相同,Kernel矩阵越大,均值滤波的效果就越明显。
降低噪声的同时使图像产生模糊,特别是景物的边缘和细节部分。
3.中值滤波
中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。中值滤波跟均值滤波唯一不同是,不是用均值来替换中心每个像素,而是将周围像素和中心像素排序以后,取中值。
一个3X3大小的中值滤波如下:
优点:抑制效果很好,画面的清析度基本保持;
缺点:对高斯噪声的抑制效果不是很好。
4.最大最小值滤波
最大最小值滤波是一种比较保守的图像处理手段,与中值滤波类似,首先要排序周围像素和中心像素值,然后将中心像素值与最小和最大像素值比较,如果比最小值小,则替换中心像素为最小值, 如果中心像素比最大值大,则替换中心像素为最大值。
一个Kernel矩阵为3X3的最大最小值滤波如下:
5.双边滤波
一种同时考虑了像素空间差异与强度差异的滤波器,因此具有保持图像边缘的特性
下面显示高斯滤波器
其中W是权重,i和j是像素索引。公式中可以看出,权重只和像素之间的空间距离有关系,无论图像的内容是什么,都有相同的滤波效果。
双边滤波器,它只是在原有高斯函数的基础上加了一项:
其中 I 是像素的强度值,所以在强度差距大的地方(边缘),权重会减小,滤波效应也就变小。总体而言,在像素强度变换不大的区域,双边滤波有类似于高斯滤波的效果,而在图像边缘等强度梯度较大的地方,可以保持梯度。
6.限幅滤波(又称程序判断滤波)
• 方法: 根据经验判断,确定两次采样允许的最大偏差值(设为top)每次检测到新值时判断:如果本次值与上次值之差<=top,则本次值有效 如果本次值与上次值之差>top,则本次值无效,放弃本次值,用上次值代替本次值
•优点: 能有效克服因偶然因素引起的脉冲干扰
•缺点: 无法抑制周期性的干扰;平滑度差
7.上述滤波的Opencv接口:
上述使用椒盐噪声为源图像做滤波处理:
import cv2
import numpy as np
from PIL import Image
from skimage import util
import matplotlib.pyplot as pltimg = cv2.imread("lenna.png", 0)
noise_gs_img=util.random_noise(img, mode='pepper', amount=0.7)######## 四个不同的滤波器 ########## 均值滤波
img_mean = cv2.blur(img, (5,5))# 高斯滤波
img_Guassian = cv2.GaussianBlur(img,(5,5),0)# 中值滤波
img_median = cv2.medianBlur(img, 5)# 双边滤波
img_bilater = cv2.bilateralFilter(img,9,75,75)# 展示不同的图片
titles = ['srcImg', 'mean', 'Gaussian', 'median', 'bilateral']
imgs = [noise_gs_img, img_mean, img_Guassian, img_median, img_bilater]for i in range(5):plt.subplot(2,3,i+1)#注意,这和matlab中类似,没有0,数组下标从1开始plt.imshow(imgs[i])plt.title(titles[i])
plt.show()
深度CV基础——图像噪声和滤波相关推荐
- OpenCV_06 图像平滑:图像噪声+图像平滑+滤波
1 图像噪声 由于图像采集.处理.传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理.常见的图像噪声有高斯噪声.椒盐噪声等. 1.1 椒盐噪声 椒盐噪声也称为脉冲噪声,是图像中经常见到 ...
- MATLAB--数字图像处理 图像噪声与滤波处理
一.实验名称 图像的噪声与滤波处理 二.实验目的 1.熟悉MATLAB软件的使用. 2.掌握图像的噪声与滤波处理. 三.实验内容 1.对一张图片添加不同强度的高斯噪声.椒盐噪声 2.对图像进行不同模板 ...
- 图像滤波基础知识:图像与波的关系以及图像噪声知识
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 老猿对图像处理基础知识非常缺乏,所以OpenCV-Python的学习进度很慢 ...
- CV基础(图像预处理)
文章目录 CV基础 1.课程概述 1.1 计算机视觉的研究理论和应用 1.2 主要研究维度 Tips tensorflow基础 图像预处理 1.颜色空间和图片处理 1.1彩色的三要素 1.2.基本颜色 ...
- 【每周CV论文推荐】 初学深度学习单张图像三维人脸重建需要读的文章
欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 基于图像的人脸三维重建在人脸分析与娱乐领域里 ...
- 图像处理技术之三:降噪处理(中值、均值、最大值、最小值滤波、图像噪声)
图像噪声的成因分类与常见图像去噪算法简介 1.图像噪声的成因 图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质,这对后续图像的处理和图像视觉效应将产生不利影响.噪声种类很多,比如:电噪 ...
- CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)
CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...
- 【AI白身境】深度学习必备图像基础
文章首发于微信公众号<有三AI> [AI白身境]深度学习必备图像基础 今天是新专栏<AI白身境>的第四篇,所谓白身,就是什么都不会,还没有进入角色. 我们已经说了linux基础 ...
- 深度学习基础实例与总结
一.神经网络 1 深度学习 1 什么是深度学习? 简单来说,深度学习就是一种包括多个隐含层 (越多即为越深)的多层感知机.它通过组合低层特征,形成更为抽象的高层表示,用以描述被识别对象的高级属性类别或 ...
最新文章
- Java-Web 监听器和过滤器
- 常用色彩空间 HSV模型与RGB模型的相互转换 孟塞尔彩色空间 YCbCr Lab YUV 配色表\配色工具(RGB颜色值与十六进制颜色码转换工具)
- Nginx搭建静态资源映射实现远程访问服务器上的图片资源
- android studio failed to open zip file,Android Studio出现Failed to open zip file问题的解决方法...
- 预警数据一键升级工具_重磅 | 教务管理全新升级,“章鱼校长”助力机构实现轻松管理...
- Luogu2295 MICE
- 《原力计划【第二季】》第 6 周周榜揭晓!!!
- Notepad++ WebEdit插件
- android 随身无线网卡,让小锐WiFi支持USB无线网卡/随身WiFi(附各种“随身wifi”芯片型号)...
- MatConvNet对自己的图片分两类及提取图片特征
- html中哪些是行内元素,html行内元素有哪些
- GitHub 热榜:被网友疯狂恶搞的「蚂蚁呀嘿」项目终于开源了!
- 加州大学戴维斯分校 计算机科学,2020年加州大学戴维斯分校排名TFE Times美国最佳计算机科学硕士专业排名第43...
- PHP 导出excel表格的3种方法
- 用U盘给服务器做系统用在pe里分区吗,如何用U盘装系统并给硬盘分区
- edge浏览器被百度占用了如何解决?
- IntelliJ IDEA 15在线激活码(破解)--License server 15.0.2本人亲测
- 手机工商银行怎么转账_工商银行手机银行怎么转账
- Xorg Handler简介
- 如何创建springboot项目
热门文章
- 计算机仿真实验单摆,计算机仿真实验 用凯特摆测重力加速度
- 20220430matlab求解e的j次方
- 超市库存管理java sql_基于JAVA的超市管理(商店库存)系统的设计与实现(Eclipse,SQLServer)...
- 新版标准日本语中级_第二十二课
- Vue实战电商系统-五商品管理
- 转 | cadence验证仿真工具IUS,IES,irun和xrun
- %time与%timeit
- 【踩坑笔记】从零开始在Linux和Windows部署安装 ***
- ipv6修改DNS服务-首选DNS服务器:240c::6666
- 数据库-订单商品表(单表-商品销量表)