技术标签: OpenCV 计算机视觉 图像处理 Dream的茶话会 opencv
前言:
Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV实现图像加噪与滤波,欢迎大家一起参与探讨交流~
编写一Python程序,要求实现以下功能:
撰写实验报告,将上述处理的原理与处理流程进行介绍;并添加原图、加入噪声的图像、描述噪声位置的二值图像以及三种滤波方法处理后的图像;最终对处理结果进行分析,并附加程序。
解释器:Python3.9、开发环境:PyCharm
实验中我们使用opencv中imread读入图片,imwrite保存图片。
在本次实验中使用到的两种噪声分别为椒盐噪声及白噪声。
椒盐噪声是将图片中一定比例的像素点随机置为0或255,使图片上随机分布黑色和白色的噪声点。 实验中,我们建立一阈值参数per(添加噪声的比例),随机生成与输入图片相同尺寸的0到1的随机数矩阵,记录随机数矩阵中小于per/2和处于per/2与per之间的元素位置。将原图像中与矩阵小于per/2对应位置相同的像素置为255,处于per/2与per之间的置为0,这就完成为图像添加椒盐噪声。
白噪声与椒盐噪声类似,不同的是椒盐噪声可能添加黑色或白色的噪声点,而白噪声只会添加白色噪声点。实验中,我们同样建立一阈值比例参数per,与输入图片尺寸相同的0到1的随机矩阵,将矩阵中小于per的元素对应位置的原图像素点置为255,这就完成了对图像添加白噪声。
实验中将我们将原图与添加噪声后的图片进行减法
操作,未添加噪声点的部分即为原始像素与原始像素相减,得到的值为0(黑色)。添加噪声点的部分为噪声点与原始图像相减,无规律的某一特殊值。之后将非0点认定为噪声点所在位置,使用二值化操作将非0点置为255(白色),0点仍保持为0(黑色),这就实现了输出标志位置信息的二值图像。
实验中使用均值滤波、中值滤波、高斯滤波
对添加噪声后的图像进行处理。
均值滤波是将滤波器中心的像素点替换为处于滤波器中全部像素点的均值,使用opencv中blu
r实现;中值滤波是将滤波器中心的像素点替换为处于滤波器中全部像素点的中值,使用opencv中medianBlur
实现;高斯滤波的滤波器参数与离中心像素的距离有关,其参数符合高斯分布,使用opencv中GaussianBlur
实现。使用滤波器在原图像进行扫描,以实现降噪等目的。
图1 原图(上)、添加椒盐噪声(中)、添加白噪声(下)对比图
椒盐噪声二值图(per=0.02)与白噪声二值图(per=0.05)
椒盐噪声处理图经均值滤波(上)、中值滤波(中)、高斯滤波(下)后图像:
白噪声处理图经均值滤波(上)、中值滤波(中)、高斯滤波(下)后图像
由图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
,回复 数字图像处理
获取源码,快点击我吧
好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
️️️如果你喜欢的话,就不要吝惜你的一键三连了~
文章浏览阅读4.2w次,点赞329次,收藏2.7k次。Python 入门的60个基础练习_练习python基础语法
文章浏览阅读1w次。用Xcode5运行一下应用,第一个看到的就是status bar的变化。在iOS6中,status bar是系统在处理,应用_ios7 statusbar
文章浏览阅读2.1k次。问题描述:,在gdb调试程序输出变量:p var,会提示No symbol "var" in current context.原因:程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改程序,整理程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指_no registers调试显示
文章浏览阅读3.4k次。import java.util.Random;import org.drools.util.UUIDGenerator;/** * * * 类名称:GenerateIdUtil * 类描述: 主键生成工具类 * @author chenly * 创建时间:Jul 10, 2012 8:10:43 AM * 修改人: * 修改时间:Jul 10, 2012 8..._idgeneratorutils.generateid()
文章浏览阅读5k次。BX:跳转到寄存器reg给出的目的地址处,如:BX R2BLX:跳转到寄存区reg给出的目的地址处并将返回地址存储到LR(R14)使用这两个指令时有一点特别需要注意:跳转的目的地址必须是奇数,若不是奇数则在后面加1,如某函数的起始地址是0x80000f00,则要跳转到此函数则应该跳转到0x80000f01处!否则会进入硬件错误中断!..._汇编blx
文章浏览阅读2.6k次,点赞2次,收藏4次。vue打包后,其实就剩index.html和一堆静态资源,页面的加载和替换都是通过刷新index.html种的dom来实现的(应该是这样,可能表述不是很好),所以做个重定向就可以了。(博主是这么解决的,网上还有很多人是各种路径错误,大家可以尝试下自己是哪个原因)import org.springframework.boot.web.server.ConfigurableWebServerFa..._前端项目放入resource
文章浏览阅读9.7k次。1.问题展示2.解决方案1.任意窗口, 打开git bash2.命令行界面, 输入cd C:3.cat ~/.ssh/id_rsa.pub正常下面应该显示一大串公钥如果没有,显示如下图, 则进行下一步, 创建公钥4.创建公钥, 输入 ssh-keygen5.然后一直下一步, 直到出现6.再次输入cat ~/.ssh/id_rsa.pub下面一大串数字便是公钥,复制这些字符串, 打开github, 点击头像, 打开settings, 打开SSH and GPG Keys_cmd warning: permanently added
文章浏览阅读154次。[code="java"]1. SQL/Plus 常用命令 a. help [topic] 查看命令的使用方法,topic表示需要查看的命令名称。 如: help desc; b. host 该命令可以从SQL*Plus环境切换到操作系统环境,以便执行操作系统命名。 c. host [command] 在sql*plus环境中执行操作系统命令,如:host notepad.exe..._sql+plus的使用方法
文章浏览阅读441次。该文档均来自互联网,如果侵犯了您的个人权益,请联系我们将立即删除!**学校毕 业 论 文**学校园网络服务器的配置与管理姓 名: **学 号: **指导老师:系 名:专 业: 计算机网络技术班 级:二0一一年十二月十五日摘 要随着网络技术的不断发展和Internet的日益普及,许多学校都建立了校园网络并投入使用,这无疑对加快信息处理,提高工作效..._服务器配置与应用论文
文章浏览阅读1k次。一、单实例多库:一个mysql实例,创建多个数据目录。规划:实例路径:/usr/local/mysql数据目录路径:(1)/usr/local/mysql/data(2)/usr/local/mysql/data2步骤:安装mysql。配置my.cnf文件。初始化各个数据库。用mysqld_multi启动。1、安装mysql。平常安装。2、m..._数据库单实例和多实例
文章浏览阅读6.3k次。今天装了第三方的MFC软件库Xtreme ToolkitPro v15.0.1,听说搞MFC的人都知道它的强大,我刚学习,所以装了一个,然后想运行一下它自带的例子看看。出现一个“找不到mfc90.dll“的问题,百度一下,记录如下:vs2008已经打过sp1补丁,编译C++程序会提示找不到mfc90.dll文件的错误,但是如果是release版的话就能正常运行csdn看到解决方案,粘贴_microsoft v90.debugmfc
文章浏览阅读2.1k次。以前使用CJK进行中文的排版,需要自己生成字体库,近日,出现了XeTeX,可以比较好的解决中文字体问题,不需要额外生成LaTeX字体库,直接使用计算机系统里的字体,本文以在Linux下为例说明XeTeX的使用。操作系统: UbuntuTeX:除了texlive包外,还需要安装的包是texlive-xetex。字体:可以使用fc-list查看你自己的字体库,注意字体的完整名称,在XeTe..._latex 中文排版 texlive