OpenCV学习之图像加噪与滤波的实现详解
是Dream呀 人气:0一、实验内容
编写一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()
加载全部内容