图像处理--OpenCV实现图像加噪与滤波_opencv 图片加白噪声-程序员宅基地

技术标签: OpenCV  计算机视觉  图像处理  Dream的茶话会  opencv  

在这里插入图片描述

前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV实现图像加噪与滤波,欢迎大家一起参与探讨交流~

一、实验内容

编写一Python程序,要求实现以下功能:

  • 读入一幅图像。
  • 使用两种以上的方法分别向图像中添加噪声。
  • 输出一幅二值图像,图像中未加入噪声的区域为黑色,加入噪声的区域为白色。
  • 使用三种滤波方法对上述添加了噪声的图像进行滤波处理。
  • 输出滤波处理后的图像。

撰写实验报告,将上述处理的原理与处理流程进行介绍;并添加原图、加入噪声的图像、描述噪声位置的二值图像以及三种滤波方法处理后的图像;最终对处理结果进行分析,并附加程序。

二、实验环境和配置

解释器:Python3.9、开发环境:PyCharm

三、实验原理及操作

实验中我们使用opencv中imread读入图片,imwrite保存图片。

1. 添加噪声

在本次实验中使用到的两种噪声分别为椒盐噪声及白噪声。
椒盐噪声是将图片中一定比例的像素点随机置为0或255,使图片上随机分布黑色和白色的噪声点。 实验中,我们建立一阈值参数per(添加噪声的比例),随机生成与输入图片相同尺寸的0到1的随机数矩阵,记录随机数矩阵中小于per/2和处于per/2与per之间的元素位置。将原图像中与矩阵小于per/2对应位置相同的像素置为255,处于per/2与per之间的置为0,这就完成为图像添加椒盐噪声
白噪声与椒盐噪声类似,不同的是椒盐噪声可能添加黑色或白色的噪声点,而白噪声只会添加白色噪声点。实验中,我们同样建立一阈值比例参数per,与输入图片尺寸相同的0到1的随机矩阵,将矩阵中小于per的元素对应位置的原图像素点置为255,这就完成了对图像添加白噪声。

2.噪声二值化

实验中将我们将原图与添加噪声后的图片进行减法操作,未添加噪声点的部分即为原始像素与原始像素相减,得到的值为0(黑色)。添加噪声点的部分为噪声点与原始图像相减,无规律的某一特殊值。之后将非0点认定为噪声点所在位置,使用二值化操作将非0点置为255(白色),0点仍保持为0(黑色),这就实现了输出标志位置信息的二值图像。

3. 滤波处理

实验中使用均值滤波、中值滤波、高斯滤波对添加噪声后的图像进行处理。
均值滤波是将滤波器中心的像素点替换为处于滤波器中全部像素点的均值,使用opencv中blur实现;中值滤波是将滤波器中心的像素点替换为处于滤波器中全部像素点的中值,使用opencv中medianBlur实现;高斯滤波的滤波器参数与离中心像素的距离有关,其参数符合高斯分布,使用opencv中GaussianBlur实现。使用滤波器在原图像进行扫描,以实现降噪等目的

四、实验结果

1.原图、添加椒盐噪声、添加白噪声对比

图1 原图(上)、添加椒盐噪声(中)、添加白噪声(下)对比图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.椒盐噪声二值图与白噪声二值图

椒盐噪声二值图(per=0.02)与白噪声二值图(per=0.05)
在这里插入图片描述
在这里插入图片描述

3.椒盐噪声处理图经处理后图像

椒盐噪声处理图经均值滤波(上)、中值滤波(中)、高斯滤波(下)后图像:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.白噪声处理图经处理后图像

白噪声处理图经均值滤波(上)、中值滤波(中)、高斯滤波(下)后图像
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、结果分析

由图1可知,对原图像添加噪声后,添加椒盐噪声的图像上呈现出不规律的黑白像素点,添加白噪声的图像上呈现出不规律的白色像素点,说明添加噪声成功。

从运行结果可以得出低通滤波操作可对图像进行降噪处理。其中中值滤波对椒盐噪声和白噪声降噪效果显著,原因是椒盐噪声点和白噪声点与周围像素点差异较大,当有中值滤波器经过时会将偏差值较大的点(黑噪声和白噪声)置为滤波器中的中值,这就过滤了这些差异较大的点,实现了图像降噪。椒盐噪声点和白噪声点经均值滤波与高斯滤波后噪声点颜色变淡、面积变大,是因为这两种滤波相当于对处于滤波器中的像素值进行加权求和,当噪声点被滤波器处理时,与周围像素加权求和,噪声颜色变浅;当处理的像素点周围有噪声时,与噪声点加权求和,该像素点被“污染”,噪声点变大。

六、实验源码

# @Time : 2022/10/10 16:29
# @Author : 是Dream呀
# @File : 图像加噪与滤波.py
import cv2 as cv
import numpy as np

img = cv.imread('photo.jpg')
cv.imshow('test',img)
cv.waitKey(0)
cv.destroyAllWindows()

#  定义sp_Noise()来作为椒盐噪声
def sp_Noise(image, per):
    img = image.copy()
    threshold = per/2
    w,h = img.shape[0], img.shape[1]
    rand = np.random.random([w,h])
    #  标注噪声区域的二值图像,背景为黑色,噪声区域为白色
    noise = np.zeros(img.shape)
    noise[rand<per] = 1
    img[rand<threshold] = 0
    img[(rand<per) & (rand>=threshold)] = 255
    return noise*255,img

#  定义white_Noise()来作为白噪声
def white_Noise(image, per):
    img = image.copy()
    w,h = img.shape[0], img.shape[1]
    rand = np.random.random([w,h])
    #  标注噪声区域的二值图像,背景为黑色,噪声区域为白色
    noise = np.zeros(img.shape)
    noise[rand < per] = 1
    img[rand < per] = 255
    return noise*255, img

white_noise, white_img = white_Noise(img, 0.05)
sp_noise, sp_img = sp_Noise(img, 0.02)

#  使用图像减法与二值化处理获取噪声点
sp_noise1 = np.float32(sp_img) - np.float32(img)
sp_noise1 = np.where(sp_noise1 == 0, 0, 255)
sp_noise1 = np.uint8(sp_noise1)

white_noise1 = np.float32(white_img) - np.float32(img)
white_noise1 = np.where(white_noise1 == 0, 0, 255)
white_noise1 = np.uint8(white_noise1)
cv.imshow('white_noise1',white_noise1)
cv.imshow('sp_noise1',sp_noise1)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
#  cv.imshow('white_noise',white_noise)
#  cv.imshow('sp_noise',sp_noise)
cv.waitKey(0)
cv.destroyAllWindows()

img_sp_blur = cv.blur(sp_img,(3,3))
img_white_blur = cv.blur(white_img,(3,3))
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
cv.imshow('img_sp_blur',img_sp_blur)
cv.imshow('img_white_blur',img_white_blur)
cv.waitKey(0)
cv.destroyAllWindows()


img_sp_med = cv.medianBlur(sp_img, 3)
img_white_med = cv.medianBlur(white_img, 3)
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
cv.imshow('img_sp_med',img_sp_med)
cv.imshow('img_white_med',img_white_med)
cv.waitKey(0)
cv.destroyAllWindows()

img_sp_gs = cv.GaussianBlur(sp_img,(5,5),1)
img_white_gs = cv.GaussianBlur(white_img,(5,5),1)
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
cv.imshow('img_sp_gs',img_sp_gs)
cv.imshow('img_white_gs',img_white_gs)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imwrite('white_noise1.jpg',white_noise1)
cv.imwrite('sp_noise1.jpg',sp_noise1)
cv.imwrite('white_img.jpg',white_img)
cv.imwrite('sp_img.jpg',sp_img)

cv.imwrite('img_sp_blur.jpg',img_sp_blur)
cv.imwrite('img_white_blur.jpg',img_white_blur)
cv.imwrite('img_sp_med.jpg',img_sp_med)
cv.imwrite('img_white_med.jpg',img_white_med)
cv.imwrite('img_sp_gs.jpg',img_sp_gs)
cv.imwrite('img_white_gs.jpg',img_white_gs)

dx = cv.Sobel(sp_img,-1,1,0,3)
dy = cv.Sobel(sp_img,-1,0,1,3)
d = cv.addWeighted(dx,0.5,dy,0.5,0)
d = cv.convertScaleAbs(d)
cv.imshow('img_gs_med',d)
cv.waitKey(0)
cv.destroyAllWindows()

七、实验报告

这里是完整的实验报告–数字图像处理实验报告:图像加噪与滤波 附源码,需要的同学自行取走~

源工程文件

关注此公众号:人生苦短我用Pythons,回复 数字图像处理获取源码,快点击我吧

好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
️️️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

最后,有任何问题,欢迎关注下面的公众号,获取第一时间消息、作者联系方式及每周抽奖等多重好礼! ↓↓↓

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

智能推荐

ASP.NET MVC 模式-程序员宅基地

文章浏览阅读307次。ASP.NET MVC 是一个全新的Web应用框架ASP.NET 代表支撑应用框架的技术平台,表明ASP.NET MVC和传统的WebForm应用框架一样,都是建立在ASP.NET平台之上。MVC 表示该框架背后的设计思想,意味着ASP.NET MVC采用了MVC架构模式。MVC在20世纪70年代后期出现,产生于Xerox PARC施乐公司的帕洛阿尔托研究中心的Small..._aspnet mvvm

MacOS M1搭建Selenium环境_m1 mac selenium配置-程序员宅基地

文章浏览阅读350次。解压压缩包后,打开终端,进入当前chromedriver所在的路径,将chromedriver移动到默认路径(/usr/local/bin/)二、下载对应版本的浏览器驱动器:找到版本一致或最接近的版本的驱动器。若列表中含有selenium则表明安装成功。记得勾选上继承全局包,要不然会报错。_m1 mac selenium配置

UE4 OpenCV 插件 官方配置流程_ue4 opencv操作texture-程序员宅基地

文章浏览阅读4.6k次。谨以此片献给各种遇到坑的朋友。官网上的OpenCV 插件,根据github 上的描述 是针对UE4 4.16 版本以下的版本来提供的 OpenCV 采用的是3.0.0 , 也可以使用openCv 3.2.0环境描述:Ue4 4.15 OpenCV 3.2.0固有插件配置步骤:1, 创建一个C++ 的工程,打开后, 关闭即可。2,将OpenCV 的插件文件 解压缩之后, 将里面的文件..._ue4 opencv操作texture

使用Anaconda安装opencv-python-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏11次。直接在cmd命令行输入:conda install --channel https://conda.anaconda.org/menpo opencv3 接着根据提示按Y即可

nyoj-236-心急的C小加_nyoj 心急的c小加-程序员宅基地

文章浏览阅读646次。#include#includestruct mubang{int x;int y;}a[5005];int cmp(const void *a,const void *b){struct mubang *c=(struct mubang *)a;struct mubang *d=(struct mubang *)b;if(c->x!=d->x)re_nyoj 心急的c小加

JavaEE基础知识讲解-程序员宅基地

文章浏览阅读1.7k次。学习JavaEE的你们是不是一头雾水呢? C/S client/server 客户端/服务器 B/C browser/server 浏览器/服务器 通过浏览器访问到对应页面,发送请求(同步请求,异步请求,ajax请求,会读接口文档)---服务器(云服务器:腾讯云服务器 阿里云服务器等等)---应用服务器Tomcat---匹配servlet---service业务处理---dao层 JDBC Hibemate,ORM---数据库---File---servlet(控制器Controller)MVC_javaee基础知识

随便推点

深度学习简介-程序员宅基地

文章浏览阅读910次,点赞28次,收藏19次。交互性检索是在检索用户不能构建良好的检索式(关键词)的情况下,通过与检索平台交流互动并不断修改检索式,从而获得较准确检索结果的过程。新闻推荐需要:获取用户请求,召回候选新闻,对候选新闻进行排序,最终给用户推出新闻。将用户持续浏览新闻的推荐过程看成一个决策过程,通过强化学习学习每一次推荐的最佳策略,提高用户的点击率。无人驾驶被认为是强化学习短期内能技术落地的一个应用方向,很多公司投入大量资源在无人驾驶上,其中百度的无人巴士“阿波龙”已经在北京、武汉等地展开试运营,自动无人驾驶的行车视野如下图所示。

前端开发工程师简历_前端简历-程序员宅基地

文章浏览阅读3.5w次,点赞102次,收藏685次。简历是什么找工作之前投递的个人信息和工作能力----不全面应该是:个人当前阶段的价值体现前者:我能卖多少钱;后者:我现在值多少钱建议:每隔半年/一年给自己做总结的时候写一份简历(相当于个人价值总结)面试要刻意、精心准备公司内部晋升答辩,需要精心准备(ppt、演讲基本要精心准备一个月的时间)面试,简历,同样需要精心准备目录面试官如何分析一份简历简历模板和内容个人信息教育经历专业技能工作经历项目经历体现自己的亮点课程总结注意:不要造假学历造假:学信网可查工作经历造假:可_前端简历

CentOS 通过yum安装gcc 4.8, 4.9, 5.2等高版本GCC_有gcc高版本的yum库-程序员宅基地

文章浏览阅读2.6k次。https://www.dwhd.org/20160724_085212.html_有gcc高版本的yum库

SpringBoot自动配置原理分析_springboot 自动配置分析与整合测试-程序员宅基地

文章浏览阅读320次。1起步依赖原理分析 1.1分析spring-boot-starter-parent 按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重点配置):<parent> <groupId>org.sp..._springboot 自动配置分析与整合测试

python2.7 Crypto 使用pip的安装方式 【橘小白】_python2.7 使用pycrypto-程序员宅基地

文章浏览阅读9.1k次。最近想要使用Crypto.Cipher 的AES模块,可总是找不到Crypto.Cipher接下来介绍几个坑1.AES是在pyCrypto中而不是crypto中2.这个pyCrypto中间的C一定要大写,不然也不能用接下来介绍正确的安装姿势1.首先需要现在一款编译器Microsoft Visual C++ Compiler for Python 2.7下载地址https://www.m..._python2.7 使用pycrypto

整数划分问题(递归&非递归)_n的划分种数,其中划分大于等于2非递归算法-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏7次。递归算法:将正整数n表示成一系列正整数之和,n=n1+n2+...+nk,其中n1>=n2>=n3>=...>=nk>=1,k>=1。正整数n的这种表示称为正整数n的划分。正整数n的不同的划分个数城外正整数n的划分数,记作p(n)。例如,正整数6有如下11种不同的划分,所以p(6)=11。6;5+1;4+2;4+1+1;3+3;3+2+1;3+1+1+1;2+2+2_n的划分种数,其中划分大于等于2非递归算法

推荐文章

热门文章

相关标签