图像恢复(加噪与去噪)

article/2025/9/28 2:43:08

人工智能导论实验导航

实验一:斑马问题 https://blog.csdn.net/weixin_46291251/article/details/122246347

实验二:图像恢复 https://blog.csdn.net/weixin_46291251/article/details/122561220

实验三:花卉识别 https://blog.csdn.net/weixin_46291251/article/details/122561505

实验四:手写体生成 https://blog.csdn.net/weixin_46291251/article/details/122576478

实验源码: xxx

2.1实验介绍

2.1.1实验背景

机器学习:
机器学习是一类算法的总称,这些算法企图从大量历史数据中挖掘出其中隐含的规律,并用于预测或者分类,更具体的说,机器学习可以看作是寻找一个函数,输入是样本数据,输出是期望的结果,只是这个函数过于复杂,以至于不太方便形式化表达。需要注意的是,机器学习的目标是使学到的函数很好地适用于“新样本”,而不仅仅是在训练样本上表现很好。学到的函数适用于新样本的能力,称为泛化(Generalization)能力。

机器学习作为人工智能核心技术,本章主要围绕机器学习涉及的决策树、主成分分析和集成算法而设计的实验。本章实验难度分均为初级。

图像恢复:
图象是一种非常常见的信息载体,但是在图像的获取、传输、存储过程中可能由于各种原因使得图像受到噪声的影响。如何去除噪声的影响,恢复图像原本的信息是计算机视觉中的重要研究问题。
常见的图像恢复算法有基于空间域的中值滤波、基于小波域的小波去噪、基于偏微分方程的非线性扩散滤波等。本次实验对图像添加噪声,并对添加噪声的图像进行基于线性回归模型的去噪。

2.1.2实验目的

本章实验的主要目的是掌握机器学习相关基础知识点,了解机器学习相关基础知识,经典降维方法、决策树算法和集成算法。熟悉机器学习的一般流程,具备使用python语言和机器学习算法解决实际问题的能力。

学习Python的Opencv库进行图像相关处理
学习Python的Numpy库进行相关数值计算
学习线性回归模型的应用

2.1.3实验简介

A. 生成受损图像。
受损图像(X)是由原始图像(I∈RH∗W∗CI∈RH∗W∗C)添加了不同噪声遮罩(noise masks)(M∈RH∗W∗CM∈RH∗W∗C)得到的(X=I⨀MX=I⨀M),其中⨀⨀是逐元素相乘。
噪声遮罩仅包含 {0,1} 值。对原图的噪声遮罩的可以每行分别用 0.8/0.4/0.6 的噪声比率产生的,即噪声遮罩每个通道每行 80%/40%/60% 的像素值为 0,其他为 1。

B. 使用你最擅长的算法模型,进行图像恢复。

C. 评估误差为所有恢复图像(R)与原始图像(I)的 2-范数之和,此误差越小越好。
error=∑3i=1norm(Ri(:)−Ii(😃,2)error=∑i=13norm(Ri(:)−Ii(😃,2),其中(:)是向量化操作,其他评估方式包括 Cosine 相似度以及 SSIM 相似度。

2.2概要设计

程序分为以下几步:
首先进行图片的读取,这里要注意matplotlib和opencv读取图片格式的不同,需要进行转换。然后将数据线性归一化,然后在原图上生成噪声比率为0.6的噪声,得到含噪的图片,这里添加的噪声类型为椒盐噪声。然后用中值滤波器对图像滤波以实现图像恢复。

实验的关键是加噪和去噪
加噪用的是椒盐噪声,椒盐噪声(salt-and-pepper noise)即一种是盐噪声(salt noise),另一种是胡椒噪声(pepper noise)。盐=白色(0),椒=黑色(255)。前者是高灰度噪声,后者属于低灰度噪声。这里两种噪声同时出现,呈现在图像上就是黑白杂点
去噪用的是中值滤波法:使用滤波器窗口包含区域的像素值的中值来得到窗口中心的像素值。是一种非线性平滑滤波器。在去噪同时,较好的保持边缘轮廓细节,适合处理椒盐噪声,但对高斯噪声效果不好。

2.3详细设计

2.3.1 导入工具包

matplotlib数据库下的pyplot模块是一个常用于图像展示的模块;
Numpy数据库用于相关的数值计算;
cv2,即opencv库,计算机视觉库,常用于图像的处理;
从sklearn.linear_model模块下导入线性回归(LinearRegression),岭回归(Ridge),Lasso回归。
岭回归(Ridge):在线性回归的基础上加了L2正则化项(L2范数),增加线性回归的泛化性能,它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和一个调节线性回归项和正则化项权重的系数α。损失函数表达式如下:
J(θ)=(1/2)(Xθ−Y)T(Xθ−Y) + (1/2)α||θ||2
其中α为常数系数,需要进行调优。 ||θ||2 为L2范数。Ridge回归的解法和一般线性回归大同小异。
Lasso回归:有时也叫做线性回归的L1正则化,和Ridge回归的主要区别就是在正则化项,Ridge回归用的是L2正则化,而Lasso回归用的是L1正则化。Lasso回归的损失函数表达式如下:
J(θ)=(1/2)(Xθ−Y)T(Xθ−Y)+α||θ||1
其中α为常数系数,需要进行调优。 ||θ||1 为L1范数。

from matplotlib import pyplot as plt                                  # 展示图片
import numpy as np                                               # 数值处理
import cv2                                                       # opencv库
from sklearn.linear_model import LinearRegression, Ridge, Lasso          # 回归分析

2.3.2 读取图片:

读取图片我们采用 cv2.imread(filename[, flags]) 函数:

filename:文件路径
flags:指定加载图像颜色类型的标志
cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数,此时 flags=1。
cv2.IMREAD_GRAYSCALE:以灰度模式读入图像,此时 flags=0。
cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道,此时 flags=-1。

彩色图像使用 OpenCV 加载时是 BGR 模式,但是 Matplotlib 是 RGB 模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotlib 正确显示。因此我们将 BGR模式转换为 RGB 模式即可。

def read_image(img_path):
# 读取图片img = cv2.imread(img_path) # 如果图片是三通道,采用 matplotlib 展示图像时需要先转换通道if len(img.shape) == 3:img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)   
return imgimg_path = 'A.png'# 加载图片的路径和名称
img = read_image(img_path)  # 读取图片
print(type(img))# 读取图片后图片的类型
plt.imshow(img)  # 展示图片
plt.axis('off') # 关闭坐标

2.3.3 保存图片

OpenCV 保存一个图片使用函数 cv2.imwrite(filename, img[, params]):
filename:保存文件路径及文件名,文件名要加格式
img:需要保存的图片

def save_image(filename, image):# np.copy() 函数创建一个副本。# 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。img = np.copy(image)img = img.squeeze()# 从给定数组的形状中删除一维的条目if img.dtype == np.double:    # 将图片数据存储类型改为 np.uint8# 若img数据存储类型是 np.double ,则转化为 np.uint8 形式img = img * np.iinfo(np.uint8).maximg = img.astype(np.uint8)        # 转换图片数组数据类型img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)# 将 RGB 方式转换为 BGR 方式cv2.imwrite(filename, img)# 生成图片

2.3.4 归一化

机器学习过程中,数据归一化非常重要,归一化的目标主要有:
把数变为(0,1)或者(-1,1)之间的小数
把有量纲表达式变为无量纲表达式
常见的归一化方法有:
线性比例变换法 xi=xi / max(x)
min-max标准化 xi=[xi−min(x)] /[ max(x)−min(x)]
z-score 标准化 xi=[xi−mean(x) ]/ σ

下面我们来实现线性比例变化法:

def normalization(image):info = np.iinfo(image.dtype)  # 获取图片数据类型对象的最大值和最小值
return image.astype(np.double) / info.max    # 图像数组数据放缩在 0-1 之间
img_path = 'A.png'# 图片的路径和名称
img = read_image(img_path)# 读取图片
print("没有归一化的数据:\n", img[0, 0, :])# 展示部分没有归一化的数据:
img = normalization(img)# 图片数据归一化
print("归一化后的数据:\n", img[0, 0, :])# 展示部分 归一化后的数据

2.3.5 图片加噪

生成受损图像的实验要求:

受损图像(X)是由原始图像( I∈RH∗W∗C )添加了不同噪声遮罩(noise masks)( M∈RH∗W∗C )得到的( X=I⨀M ),其中 ⨀ 是逐元素相乘。

噪声遮罩仅包含 {0,1} 值。对原图的噪声遮罩的可以每行分别用 0.8/0.4/0.6 的噪声比率产生的,即噪声遮罩每个通道每行 80%/40%/60% 的像素值为0,其他为1。

椒盐噪声(salt-and-pepper noise)是指两种噪声,一种是盐噪声(salt noise),另一种是胡椒噪声(pepper noise)。盐=白色(0),椒=黑色(255)。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点
在这里插入图片描述

以下使用的是一个阈值(prob、thres)进行的噪声分布:

def noise_mask_image(img, noise_ratio):"""根据题目要求生成受损图片:param img: 图像矩阵,一般为 np.ndarray:param noise_ratio: 噪声比率,可能值是0.4/0.6/0.8:return: noise_img 受损图片, 图像矩阵值 0-1 之间,数据类型为 np.array, 数据类型对象 (dtype): np.double, 图像形状:(height,width,channel),通道(channel) 顺序为RGB"""# 受损图片初始化noise_img = np.zeros(img.shape, np.double)for i in range(img.shape[0]):for j in range(img.shape[1]):if random.random() < noise_ratio:  # 如果生成的随机数小于噪声比例则将该像素点添加黑点noise_img[i][j] = 0  # 1 / 0elif random.random() > 1-noise_ratio:noise_img[i][j] = 1  # 1 / 0else:noise_img[i][j] = img[i][j]return noise_img

2.3.6 误差评估

评估误差为所有恢复图像(R)与原始图像(I)的2-范数之和,此误差越小越好。 error=∑3i=1norm(Ri(:)−Ii(😃,2) ,其中(:)是向量化操作

def compute_error(res_img, img):error = 0.0    # 初始化res_img = np.array(res_img)    # 将图像矩阵转换成为np.narrayimg = np.array(img)if res_img.shape != img.shape:    # 如果2个图像的形状不一致,则打印出错误结果,返回值为 Noneprint("shape error res_img.shape and img.shape %s != %s" % (res_img.shape, img.shape))return Noneerror = np.sqrt(np.sum(np.power(res_img - img, 2)))    # 计算图像矩阵之间的评估误差
return round(error,3)

#计算平面二维向量的 2-范数值

img0 = [1, 0]
img1 = [0, 1]
print("平面向量的评估误差:", compute_error(img0, img1))

2.3.7 图像恢复

中值滤波器,使用滤波器窗口包含区域的像素值的中值来得到窗口中心的像素值。是一种非线性平滑滤波器。在去噪同时,较好的保持边缘轮廓细节,适合处理椒盐噪声,但对高斯噪声效果不好。
在这里插入图片描述

中值滤波原理:
选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。 例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值.
换成图像模板来理解就是将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值

中值滤波流程图:
在这里插入图片描述

def restore_image(noise_img, size=4):img = noise_imgsize = 5  # 核尺寸num = int((size - 1) / 2)  # 输入图像需要填充的尺寸img = cv2.copyMakeBorder(img, num, num, num, num, cv2.BORDER_REPLICATE)h, w = img.shape[0:2]  # 获取输入图像的长宽和高h-=4;w-=4img1 = np.zeros((h, w, 3), dtype="uint8")  # 定义空白图像,用于输出中值滤波后的结果for i in range(num, h - num):  # 遍历出原图像for j in range(num, w - num):sum = []; sum1 = []for k in range(i - num, i + num + 1):  # 求中心像素周围size*size区域内的像素的平均值for l in range(j - num, j + num + 1):sum = sum + [int(img[k, l][0]) + int(img[k, l][1]) + int(img[k, l][2])]  # 每个像素的3通道像素值相加,然后求中间数sum1 = sum1 + [(img[k, l][0], img[k, l][1], img[k, l][2])]  # 将对于的三通道像素值存在数组sum1中id = np.argsort(sum)  # 将像素值周围的点的数组进行排序,然后返回排序之前的像素值对应在数组中的序号id = id[int((size ** 2) / 2) + 1]  # 取返回序号的中间序号img1[i, j] = sum1[id]  # 通过中间序号找到在像素值数组中的3通道信号return img1

2.4运行测试

原图:
在这里插入图片描述

噪声
在这里插入图片描述

加噪后的图片:
在这里插入图片描述

去噪后的图片:
在这里插入图片描述

总体对比图:
在这里插入图片描述

程序计算出的误差与相似度:
在这里插入图片描述

即:
恢复图片与原始图片的评估误差:5140.961
恢复图片与原始图片的SSIM 相似度:0. 12262643111991207
恢复图片与原始图片的Cosine 相似度:0.8794560914526841

通过上述误差的分析和人眼对修复后的图片的观察可知程序在一定程度上修复了含有噪声的图片,但修复效果仍有一定的提升空间。


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

相关文章

去噪很有效的代码

去噪很有效的代码 主要思想&#xff1a;通过筛选面积小的联通区域&#xff0c;来实现去噪。 主要使用函数&#xff1a;cv2.connectedComponentsWithStats(img, connectivity)&#xff0c;详解见&#xff1a;计算不规则连同区域 1. 原图与效果图 2. 实现代码 import cv2 impo…

图像去噪技术

目录 1.1图像去噪的基本概念 1.2 去噪效果评价标准 ​ 1.3传统去噪方法&#xff08;简单介绍&#xff09; 1.4 非局部均值去噪&#xff08;NLmeans&#xff09; ​ 1.6基于稀疏模型的去噪方法 总结 噪声的产生是信号在采集、传输以及记录过程中&#xff0c;受到成像设备自…

图像修复与去噪

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

小波阈值去噪原理及实现

小波阈值去噪原理及实现 1.小波阈值去噪的基本原理2.小波阈值去噪需要考虑的问题3.小波阈值的实现 1.小波阈值去噪的基本原理 将信号通过小波变换&#xff08;采用Mallat算法&#xff09;后&#xff0c;信号产生的小波系数含有信号的重要信息&#xff0c;将信号经小波分解后小…

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

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

小波阈值去噪

目录 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;通过字典对其网站目录进行扫描 这里要…