python 图像平滑去噪(噪声+滤波器)

article/2025/9/28 2:34:29

记录自己用python加opencv实现的图像处理的入门操作,各种平滑去噪滤波器的实现。
包括有:产生的椒盐噪声、高斯噪声等等,以及使用的中值滤波、平均滤波、高斯滤波等等。
分成了两部分来实现:一是自编写函数来实现,二是调用opencv中的相应函数,对比效果。

噪声的产生:分别是椒盐噪声和高斯噪声,原理的话可以参考别人的博客或我之后再补充,噪声就是在原来的图像上以一定的特殊规律给图像增添一些像素,使图像变得模糊等等。

1.噪声的自编写

椒盐噪声:
输入图像和自定义的噪声阈值,输出处理后的图像

# 向图片中添加椒盐噪声
def salt_pepper_noise(image, prob):  # prob:盐噪声阈值,由用户自己决定output = np.zeros(image.shape, np.uint8)thres = 1 - prob  # 胡椒噪声阈值for i in range(image.shape[0]):  # 遍历整个图片的灰度级for j in range(image.shape[1]):randomnum = random.random()  # 生成一个随机0-1之间的随机数if randomnum < prob:  # 如果随机数大于盐噪声阈值0.1,则将此位置灰度级的值设为0,即添加盐噪声output[i][j] = 0elif randomnum > thres:  # 如果随机数大于胡椒噪声阈值1-0.1,则将此位置灰度级的输出设为255,即添加胡椒噪声output[i][j] = 255else:  # 如果随机数处于两者之间,则此位置的灰度级的值等于原图的灰度级值output[i][j] = image[i][j]return output

高斯噪声:
输入图像,自定义的参数:均值、方差,输出的是处理后的图像

# 向图片中添加高斯噪声
def gasuss_noise(image, mean=0, var=0.001):         # mean : 均值,var : 方差image = np.array(image/255, dtype=float)noise = np.random.normal(mean, var ** 0.5, image.shape)  # 使用numpy库中的函数生成正态分布矩阵,对应数据分别为概率均值,概率标准差,图像的大小output = image + noise  # 输出结果为原图灰度级概率与噪声概率相加output_handle = np.array([[[0]*3 for i in range(output.shape[1])] for i in range(output.shape[0])], dtype=float)# 处理后最终输出矩阵将齐大小设置为与原图一样if output.min() < 0:  # 确定一个比较中间值low_clip = -1.else:low_clip = 0.for i in range (output.shape[0]):  # 遍历整个三位矩阵for j in range (output.shape[1]):for k in range (output.shape[2]):if output[i][j][k] < low_clip:  # 将输出的概率矩阵内的值限定在(-1,1)范围内output_handle[i][j][k] = low_clip   # 使其之后*255变为灰度级时不会超出[0-255]的范围elif output[i][j][k] > 1.0:output_handle[i][j][k] = 1.0else:output_handle[i][j][k] = output[i][j][k]    # 在最大值和最小值之间的不变output = np.uint8(output_handle*255)   # 将处理后的灰度级转化为[0-255]的整数级return output

加性噪声:

# 向图片中添加加性噪声
def addrandom_noise(image,prob=0.1):output = image   # 将原始图像数据拷贝至输出矩阵n = random.randint(1, 1000) + int(prob*20000)for k in range(n-500):a = random.randint(0, 50)b = random.randint(0, 50)c = random.randint(0, 50)i = random.randint(0, image.shape[0]-1)j = random.randint(0, image.shape[1]-1)output[i][j][0] = 255-aoutput[i][j][1] = 255-boutput[i][j][2] = 255-cfor k in range(n):a = random.randint(0, 50)b = random.randint(0, 50)c = random.randint(0, 50)i = random.randint(0, image.shape[0]-1)j = random.randint(0, image.shape[1]-1)output[i][j][0] = aoutput[i][j][1] = boutput[i][j][2] = creturn output

2.平滑去噪滤波器的自编写

设计了均值滤波、中值滤波、高斯滤波,可分别对应处理以上的三种噪声,效果较好。
具体的对应情况可自己比较一下哦。

中值滤波:

# 中值滤波 a为要处理的图像  windowsize为采用的模版大小
def medianfliter(a, windowsize):output = aif windowsize == 3 :output1 = np.zeros(a.shape, np.uint8)for i in range(1, output.shape[0]-1):  # 求齐周围9个方格与模版进行冒泡排序for j in range(1, output.shape[1]-1):value1 = [output[i-1][j-1], output[i-1][j], output[i-1][j+1], output[i][j-1], output[i][j], output[i][j+1], output[i+1][j-1], output[i+1][j], +output[i+1][j+1]]np.sort(value1)   # 对这九个数进行排序value = value1[4]    # 中值为排序后中间这个数的正中间output1[i-1][j-1] = valueelif windowsize == 5:output1 = np.zeros(a.shape, np.uint8)for i in range(2, output.shape[0]-2):       # 求齐周围25个方格与模版进行卷积for j in range(2, output.shape[1]-2):value1 = [output[i-2][j-2],output[i-2][j-1],output[i-2][j],output[i-2][j+1],output[i-2][j+2],output[i-1][j-2],output[i-1][j-1],output[i-1][j],output[i-1][j+1],\output[i-1][j+2],output[i][j-2],output[i][j-1],output[i][j],output[i][j+1],output[i][j+2],output[i+1][j-2],output[i+1][j-1],output[i+1][j],output[i+1][j+1],\output[i+1][j+2],output[i+2][j-2],output[i+2][j-1],output[i+2][j],output[i+2][j+1],output[i+2][j+2]]value1.sort()   # 对这九个数进行排序value = value1[12]    # 中值为排序后中间这个数的正中间output1[i-2][j-2] = value   # 将计算结果填入原本位置else :print('模版大小输入错误,请输入3或5,分别代表3*3或5*5模版!')return output1

均值滤波:

# 均值滤波 a为要处理的图像  windowsize为采用的模版大小
def meanflite(a, windowsize):output = aif windowsize == 3:window = np.ones((3, 3)) / 3 ** 2  # 生成3*3模版output1 = np.zeros(a.shape, np.uint8)for i in range(1, output.shape[0] - 1):  # 求齐周围9个方格与模版进行卷积for j in range(1, output.shape[1] - 1):value = (output[i - 1][j - 1] * window[0][0] + output[i - 1][j] * window[0][1] + output[i - 1][j + 1] *window[0][2] + \output[i][j - 1] * window[1][0] + output[i][j] * window[1][1] + output[i][j + 1] * window[1][2] +\output[i + 1][j - 1] * window[2][0] + output[i + 1][j] * window[2][1] + output[i + 1][j + 1] *window[2][2])output1[i - 1][j - 1] = value  # 将计算结果填入原本位置elif windowsize == 5:window = np.ones((5, 5)) / 5 ** 2  # 生成5*5模版output1 = np.zeros(a.shape, np.uint8)for i in range(2, output.shape[0] - 2):  # 求齐周围25个方格与模版进行卷积for j in range(2, output.shape[1] - 2):value = (output[i - 2][j - 2] * window[0][0] + output[i - 2][j - 1] * window[0][1] + output[i - 2][j] *window[0][2] + output[i - 2][j + 1] * window[0][3] + output[i - 2][j + 2] * window[0][4] + \output[i - 1][j - 2] * window[1][0] + output[i - 1][j - 1] * window[1][1] + output[i - 1][j] *window[1][2] + output[i - 1][j + 1] * window[1][3] + output[i - 1][j + 2] * window[1][4] + \output[i][j - 2] * window[2][0] + output[i][j - 1] * window[2][1] + output[i][j] * window[2][2] + output[i][j + 1] * window[2][3] + output[i][j + 2] * window[2][4] + \output[i + 1][j - 2] * window[3][0] + output[i + 1][j - 1] * window[3][1] + output[i + 1][j] *window[3][2] + output[i + 1][j + 1] * window[3][3] + output[i + 1][j + 2] * window[3][4] + \output[i + 2][j - 2] * window[4][0] + output[i + 2][j - 1] * window[4][1] + output[i + 2][j] *window[4][2] + output[i + 2][j + 1] * window[4][3] + output[i + 2][j + 2] * window[4][4])output1[i - 2][j - 2] = value  # 将计算结果填入原本位置else:print('模版大小输入错误,请输入3或5,分别代表3*3或5*5模版!')return output1

高斯滤波:

ef gaussian(im):im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)b = np.array([[2, 4,  5,  2,  2],[4, 9,  12, 9,  4],[5, 12, 15, 12, 5],[4, 9,  12, 9,  4],[2, 4,  5,  4,  2]]) / 156kernel = np.zeros(im.shape)kernel[:b.shape[0], :b.shape[1]] = bfim = np.fft.fft2(im)fkernel = np.fft.fft2(kernel)fil_im = np.fft.ifft2(fim * fkernel)return abs(fil_im).astype(int)

3.自编写函数的主程序

我用到的包有:numpy、matplotlib.pyplot、cv2、random
主程序很好理解,读入原图,再对原图调用各种函数进行处理,再以子图的形式展示出来。

if __name__ == "__main__":image = cv2.imread('whl.jpg')plt.subplot(4, 2, 1)plt.imshow(image)plt.axis('off')plt.title('Original')salt = salt_pepper_noise(image, 0.05)plt.subplot(4, 2, 2)plt.imshow(salt)plt.axis('off')plt.title('salt')gauss = gasuss_noise(image)plt.subplot(4, 2, 3)plt.imshow(gauss)plt.axis('off')plt.title('gauss')random = addrandom_noise(image)plt.subplot(4, 2, 4)plt.imshow(random)plt.axis('off')plt.title('random')median = medianfliter(salt, 3)plt.subplot(4, 2, 5)plt.imshow(median)plt.axis('off')plt.title('median')mean = meanflite(random, 3)plt.subplot(4, 2, 6)plt.imshow(mean)plt.axis('off')plt.title('mean')gaussout = gaussian(gauss)plt.subplot(4, 2, 7)plt.imshow(gaussout)plt.axis('off')plt.title('gaussout')plt.show()

效果展示为:
在这里插入图片描述

4.opencv实现噪声+滤波器

以opencv中的函数实现各种噪声的产生和滤波器的编写更为简单,基本一行代码就可以实现调用,以下是我的整个程序:

# 图像去噪平滑滤波
# 使用opencv的自带函数实现,与自编写作比较
# 产生椒盐噪声,高斯噪声等
# 使用中值滤波,平均滤波,高斯滤波,方框滤波import numpy as np
import cv2
import matplotlib.pyplot as plt# 加噪声
def noise(img):out = imgrows, cols, chn = img.shapefor i in range(5000):x = np.random.randint(0, rows)y = np.random.randint(0, cols)out[x, y, :] = 255return outif __name__ == "__main__":image = cv2.imread('whl.jpg')plt.subplot(3, 2, 1)plt.imshow(image)plt.axis('off')plt.title('Original')noise_img = noise(image)plt.subplot(3, 2, 2)plt.imshow(noise_img)plt.axis('off')plt.title('noise')# 均值滤波result1 = cv2.blur(noise_img, (5, 5))plt.subplot(3, 2, 3)plt.imshow(result1)plt.axis('off')plt.title('mean')# 方框滤波result2 = cv2.boxFilter(noise_img, -1, (5, 5), normalize=1)plt.subplot(3, 2, 4)plt.imshow(result2)plt.axis('off')plt.title('box')# 高斯滤波result3 = cv2.GaussianBlur(noise_img, (3, 3), 0)plt.subplot(3, 2, 5)plt.imshow(result3)plt.axis('off')plt.title('gaussian')# 中值滤波result4 = cv2.medianBlur(noise_img, 3)plt.subplot(3, 2, 6)plt.imshow(result4)plt.axis('off')plt.title('median')plt.show()

效果展示为:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/qLuhKLZr.shtml

相关文章

小波阈值去噪

目录 1.概念 2.原理 3.影响降噪效果的因素 3.1小波基的选择 3.2分解层数的选择 3.3阈值的选择 3.4阈值函数的选择 4.MATLAB代码 参考文献 1.概念 小波分析即用Mallat塔式算法对信号进行降阶分解。该算法在每尺度下将信号分解成近似分量与细节分量。近似分量表示信号的…

去噪

平滑去噪&#xff08;低通滤波器&#xff09; 噪声的产生是因为图像中的某些像素的灰度值发生了突变&#xff0c;使得和周围区域不和谐。除噪其实去除高频噪声&#xff0c;使得图像中的噪声像素的灰度值不那么突兀。 噪声去除有基于卷积&#xff08;高斯滤波&#xff0c;均值…

图像的去噪

一、图像噪声概要 1. 图像噪声的产生主要源于两个方面&#xff1a; 图像获取过程中 常见的图像传感器CCD和CMOS在采集图像过程中&#xff0c;由于受到工作环境或者电子电路结构的影响&#xff0c;会引入各种噪声&#xff0c;如热噪声、光子噪声、暗电流噪声等。 信号传输过程…

图像去噪方法

图像去噪是指减少数字图像中噪声的过程。现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声等的影响&#xff0c;在这种条件下得到的图像称为含噪图像或噪声图像。噪声是干扰图像的重要因素。一幅图像在实际应用中可能存在各种各样的噪声&#xff0c;这些噪声…

搞懂语音去噪

文章目录 1 概述2 传统语音去噪2.1 谱减法2.2 维纳滤波法 3 深度语音去噪参考资料 1 概述 语音去噪(noise reduction)又被称为语音增强(speech enhancement)&#xff0c;主要是针对于有人声的音频进行处理&#xff0c;目的是去除那些背景噪声&#xff0c;增强音频中人声的可懂…

几种常用信号平滑去噪的方法(附Matlab代码)

几种常用信号平滑去噪的方法&#xff08;附Matlab代码&#xff09; 1 滑动平均法 1.0 移动平均法的方法原理1.1 matlab内自带函数实现移动平均法1.2 利用卷积函数conv()实现移动平均法1.3 利用filter滤波函数实现移动平均法1.4 移动平均的幅频响应1.5 时域和频域的转换关系 2 …

图像噪声、去噪基本方法合集(Python实现)

文章目录 前言本文主要参考冈萨雷斯的数字图像处理 &#xff08;第4版&#xff09;&#xff0c;介绍图片中一些常见的噪声形式和常用的去噪方法&#xff0c;并且给出相应滤波方法的实现代码。 一、噪声分类1、高斯噪声2、泊松噪声3、椒盐噪声4、瑞利噪声5、爱尔兰&#xff08;伽…

干货 | 6款漏扫工具来了(附工具下载链接)

渗透测试收集信息完成后&#xff0c;就要根据所收集的信息&#xff0c;扫描目标站点可能存在的漏洞了&#xff0c;包括我们之前提到过的如&#xff1a;SQL注入漏洞、跨站脚本漏洞、文件上传漏洞、文件包含漏洞及命令执行漏洞等&#xff0c;通过这些已知的漏洞&#xff0c;来寻找…

webshell扫描工具

webshell扫描工具&#xff0c;这是一种内部有多个漏洞&#xff0c;可自动进行url采集&#xff0c;自采集多个引擎和友情链接url&#xff0c;轻松日出上百。 演示地址&#xff1a;https://note.youdao.com/s/Xi9S4I16 目录遍历攻击又称&#xff08;目录爬升&#xff0c;目录回溯…

网站漏洞扫描工具AWVS_v13下载和安装

Acunetix Web Vulnerability Scanner&#xff08;简称AWVS&#xff09;是一款知名的网络漏洞扫描工具&#xff0c;它能够测试你的网站安全&#xff0c;检测网站的安全漏洞&#xff0c;如sql 注入&#xff0c;交叉站点脚本等等。 AWVS_v13软件的下载 1、AWVS漏洞扫描工具是一款…

2022-渗透测试-推荐一款好用的网站漏洞扫描工具-WPscan

目录 WPscan简介 WPscan工具利用 查看帮助信息 更新漏洞库 扫描WordPress漏洞 扫描wordpress用户 扫描所使用的主题和漏洞 指定字典暴力破解密码 WPscan简介 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它可以全面检查wp网站的漏洞&#xff0c;从而能够及时应对…

动手实现简易网站目录扫描器——WebScanner

效果展示 项目目录&#xff1a; 引言 不知是否有小伙伴在学习Web安全相关的知识&#xff0c;如果有的话&#xff0c;那应该对XSS&#xff0c;SQL注入&#xff0c;文件上传&#xff0c;一句话脚本等等基本功应该是再熟悉不过了。最初学习的时候是它&#xff0c;实战最先测试的…

网站指纹扫描工具whatweb

目录 前言whatweb简介whatweb的使用 ~~~~~~~~ 因为想要面对一个新的开始&#xff0c;一个人必须有梦想、有希望、有对未来的憧憬。如果没有这些&#xff0c;就不叫新的开始&#xff0c;而叫逃亡。 ​​​​ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

web扫描工具了解

前言&#xff1a;此文章用于发现web的漏洞查询&#xff0c;信息收集 一.whois查询&#xff08;可以查到域名&#xff0c;注册商&#xff0c;联系人&#xff0c;更新时间&#xff0c;创建时间&#xff0c;过期时间&#xff0c;域名服务器&#xff0c;DNS&#xff09; kali中带有…

目录,系统,网站漏洞扫描工具

目录扫描工具 1.yujian yujian是一款可以进行端口扫描和目录扫描的软件&#xff0c;图形化界面&#xff0c;使用也比较简单&#xff0c;例如&#xff0c;今天使用的是它的目录扫描。 yujian针对目录扫描有它自己默认的字典&#xff0c;通过字典对其网站目录进行扫描 这里要…

网站安全在线扫描工具

现在网络上有许多一些关于网站安全检测的工具软件。有收费的&#xff0c;也有免费的。在这我就列举2个免费的在线网站扫描工具。 对于站长的来说&#xff1a; 之前对与网站的的安全检测&#xff0c;我都是直接用***软件***自己网站&#xff0c;再从问题里面进行修复。不过现在已…

网站目录扫描工具

目录 御剑 dirbuster Webdirscan 网站后台扫描工具都是利用目录字典进行爆破扫描,字典越多,扫描到的结果也越多。常用的网站后台扫描工具御剑、dirbuster和Webdirscan,不管哪个工具,要想扫描到更多的东西,都必须要有一个强大的目录字典! 御剑 御剑也是一款好用的网站…

网站扫描(Wker_网站探测工具)

Wker_网站探测工具 对于网站的扫描&#xff0c;我们需要完整详细的数据&#xff0c;才能进行准确的分析。 对于网站的分析&#xff0c;我们大致需要以下一些数据。 一. 域名信息查询 whois查询&#xff08;联系人&#xff0c;联系邮箱&#xff0c;DNS&#xff09;SEO查询权重查…

常用Web安全扫描工具合集

初入门时&#xff0c;喜欢将目标站点直接丢扫描器&#xff0c;慢慢等扫描结果&#xff0c;极度依赖Web扫描器&#xff1b;而有一些漏洞高手&#xff0c;善于运用运用各种工具但并不依赖工具&#xff0c;经常可以找到扫描工具发现不了的漏洞。 一款好用的Web扫描器对于白帽子来说…

【网络安全干货分享】Web安全常用的扫描工具有哪些?

Web安全是网络安全的一部分&#xff0c;常用的扫描工具共分为两大类&#xff1a;系统扫描工具和应用扫描工具。那么Web安全常用的扫描工具有哪些?以下便是详细的内容介绍。 第一种&#xff1a;系统扫描工具  系统扫描工具主要是针对网络中系统软件的脆弱性进行信息安全评估&…