数字图像处理——第五章 图像复原与重建

article/2025/3/2 14:27:47

数字图像处理——第五章 图像复原与重建

文章目录

  • 数字图像处理——第五章 图像复原与重建
    • 写在前面
    • 1 图像退化/复原过程的模型
    • 2 噪声模型
      • 2.1 高斯噪声
      • 2.2 椒盐噪声
    • 3 仅有噪声的复原——空间滤波
      • 3.1 均值滤波器
      • 3.2 统计排序滤波器
      • 3.3 自适应滤波器
    • 4 用频率域滤波消除周期噪声
    • 5 逆滤波和维纳滤波

写在前面

图像退化:图像在形成、记录、处理和传输过程中,由于成像系统、记录设备、传输介质和处理方法的不完善,导致图像质量的下降。

图像增强:旨在改善图像质量,提高图像的可懂度,更偏向主观判断。即要突出所关心的信息,满足人的视觉系统,具有好的视觉效果。

图像复原:根据图像畸变或退化的原因,进行模型化处理,将质量退化的图像重建或恢复到原始图像。即恢复退化图像的本来面目,忠于原图像,因此必须根据一定的图像退化模型来进行图像复原。

图像复原技术主要是以预先确定的目标来改善图像,与之前我们学习的图像增强相比,虽然有重叠之处,但是图像增强主要是一个主观过程,而图像复原大部分是一个客观过程。图像复原试图利用退化现象的某种先验知识来复原被退化的图像。因此,复原技术是面向退化模型的,并且采用相反的过程处理,以便恢复出原图像。

1 图像退化/复原过程的模型

图像复原,就是通过某种方法,将退化后的图像进行改善,尽量使复原后的图像接近理想图像的过程。整个退化和复原的过程可以用如下图表示:

在这里插入图片描述

其中,f(x, y)表示输入图像,退化后的图像用g(x, y)表示,退化过程可以分为退化函数h(x, y)以及加载在图像上的噪声η(x, y)表示,经过复原滤波器后便能得到复原后的图像。通常,我们希望复原后的图像尽可能的接近原始图像,所以需要尽可能的知道h(x, y)和η(x, y)的信息。具体来说,在空间域中退化图像可由下式给出:
g ( x , y ) = h ( x , y ) , ⋆ 代 表 卷 积 操 作 f ( x , y ) + η ( x , y ) , ⋆ 代 表 空 间 卷 积 操 作 g(x, y)=h(x, y) ,\star代表卷积操作 f(x, y)+\eta(x, y),\star代表空间卷积操作 g(x,y)=h(x,y)f(x,y)+η(x,y)
频率域表示:
G ( u , v ) = H ( u , v ) F ( u , v ) + N ( u , v ) G(u, v)=H(u, v) F(u, v)+N(u, v) G(u,v)=H(u,v)F(u,v)+N(u,v)

2 噪声模型

在图像预处理中,图像去噪是一个十分重要的步骤,对于后面图像的后处理会有很大的影响。需要选择适当的滤波技术来增强图像。图像噪声是图像信息或者像素亮度的随机变化。它是由一些因素造成的图像信号的退化。图像通常会包含很多噪声,这样的图像一般表现为:图像越亮的区域,噪声越多。噪声的本质是真实信号与理想信号之间存在的偏差,由于在图像的获取、传输和存储过程中,受到各种噪声的干扰和影响,图像的质量会有不同程度的下降。

2.1 高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。高斯噪声信号x的概率密度函数如下:
p ( x ) = 1 2 π σ e − ( x − μ ) 2 / 2 σ 2 , 其 中 μ 表 示 噪 声 x 均 值 或 期 望 值 , σ 表 示 噪 声 x 的 标 准 差 p(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-(x-\mu)^{2} / 2 \sigma^{2}},其中\mu表示噪声x均值或期望值,\sigma表示噪声x的标准差 p(x)=2π σ1e(xμ)2/2σ2μxσx
特殊情况的高斯图像如下图所示:可自己编写函数实现

def draw_gaussian(x, mu, sigma):return np.exp(-1*(((x - mu)**2) / (2*sigma**2))) / (np.sqrt(2*np.pi) * sigma)

在这里插入图片描述

接着代码实现下给原图加上高斯噪声,步骤大概如下:首先将图片转成灰度图,然后确定噪声点数量,最后随机生成噪声点在图中的坐标,然后将该点处的灰度值设置成255,具体代码如下:

def addGaussianNoise(image, G_NoiseNum):# 不copy原图会被污染G_Noiseimg = image.copy()# 噪点数量for i in range(G_NoiseNum):# 随机生成坐标temp_x = np.random.randint(0, G_Noiseimg.shape[0])temp_y = np.random.randint(0, G_Noiseimg.shape[1])G_Noiseimg[temp_x][temp_y] = 255return G_Noiseimg

在这里插入图片描述

2.2 椒盐噪声

椒盐噪声也称泊松噪声。,一般是由图像传感器、传输信道及解码处理等产生的黑白相见的亮暗点噪声,椒盐噪声常由图像切割产生。椒盐噪声是指两种噪声: 椒盐噪声 = 椒噪声 + 盐噪声盐噪声一般是白色噪声,椒噪声一般是黑色噪声,前者高灰度噪声,后者属于低灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点

生成椒盐噪声的步骤如下:首先读取图片,然后确定噪声点的数量,最后随机生成噪声点在图中的坐标,随机定义01生成器,当结果为0代表生成椒噪声,结果为1表示盐噪声,代码如下:

def salt_pepperNoise(img, noiseNum):image = img.copy()ndim = src.ndimrow, col = src.shape[0:2]for i in range(noiseNum):x = np.random.randint(0, row)y = np.random.randint(0, col)# 0-salt, 1-peppersalt_or_pepper = np.random.randint(0, 2)if salt_or_pepper == 0:image[x, y, :] = 0else:image[x, y, :] = 255return image

实验结果如下所示,和上述高斯噪声不一样的地方在于高斯噪声读取的图片为灰度图,此次的椒盐噪声用的则是RGB的彩色图像,其实都可以.代码上就是image[x, y, :]和image[x, y]的区别,彩色图像多一个维度。

在这里插入图片描述

由上图可以看出,图像模拟添加椒盐噪声是通过随机获取像素值点并设置为高亮点来实现的。

3 仅有噪声的复原——空间滤波

当一幅图像中唯一存在的退化是噪声时,上述的空间域和时间域公式为:
g ( x , y ) = f ( x , y ) + η ( x , y ) g(x, y)=f(x, y)+\eta(x, y) g(x,y)=f(x,y)+η(x,y)

G ( u , v ) = F ( u , v ) + N ( u , v ) G(u, v)=F(u, v)+N(u, v) G(u,v)=F(u,v)+N(u,v)

在这种情况下,使用空间滤波来降低噪声。

3.1 均值滤波器

均值滤波器有分很多种类,比如算数均值滤波器
f ^ ( x , y ) = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x, y)=\frac{1}{m n} \sum_{(s, t) \in S_{xy}} g(s, t) f^(x,y)=mn1(s,t)Sxyg(s,t)
这是最简单的均值滤波器。令S表示中心在点(x, y)处、大小为m×n的矩形子图像窗口(邻域)的一组坐标。算术均值滤波器在S定义的区域中计算被污染图像g(x,y)的平均值。在点(x, y)处复原图像f_hat的值。这个操作可以使用大小为m×n的一个空间滤波器来实现,其所有的系数均为其值的1/m×n。均值滤波平滑一幅图像中的局部变化,虽然模糊了结果,但降低了噪声。

几何均值滤波器
f ^ ( x , y ) = [ ∏ ( s , t ) ∈ S x y g ( s , t ) ] 1 m n \hat{f}(x, y)=\left[\prod_{(s, t) \in S_{x y}} g(s, t)\right]^{\frac{1}{m n}} f^(x,y)=(s,t)Sxyg(s,t)mn1
其中,每个复原的像素由子图像窗口中像素的乘积的1/m×n 次幂给出。

谐波均值滤波器
f ^ ( x , y ) = m n ∑ ( s , t ) ∈ S x y 1 g ( s , t ) \hat{f}(x, y)=\frac{m n}{\sum_{(s, t) \in S_{x y}} \frac{1}{g(s, t)}} f^(x,y)=(s,t)Sxyg(s,t)1mn
谐波均值滤波器对于盐粒噪声效果较好,但不适用于胡椒噪声。它善于处理像高斯噪声那样的其他噪声。

逆谐波均值滤波器
f ^ ( x , y ) = ∑ ( s , t ) ∈ S y y g ( s , t ) Q + 1 ∑ ( s , t ) ∈ S x g ( s , t ) Q \hat{f}(x, y)=\frac{\sum_{(s, t) \in S_{y y}} g(s, t)^{Q+1}}{\sum_{(s, t) \in S_{x}} g(s, t)^{Q}} f^(x,y)=(s,t)Sxg(s,t)Q(s,t)Syyg(s,t)Q+1
其中Q称为滤波器的阶数。这种滤波器适合减少或在实际中消除椒盐噪声的影响。当Q值为正时,该滤波器消除胡椒噪声;当Q值为负时,该滤波器消除盐粒噪声。但它不能同时消除这两种噪声。注意,当Q=0时,逆谐波均值滤波器简化为算术均值滤波器;而当Q=-1时,则为谐波均值滤波器。

添加噪声代码上面有,均值滤波器调用OpenCV代码如下,其中cv2.blur的参数为原图像,核的大小。

# 分别实现滤波
# 使用7×7的滤波器
img_mean = cv2.blur(img, (7, 7))
gaussian_mean = cv2.blur(out1, (7,7))
salt_pepper_mean = cv2.blur(out2, (7,7))

在这里插入图片描述

由实验可知,经过均值滤波器后,图片变模糊,但同样也减弱了噪声的影响。均值滤波器对椒盐噪声处理结果较好,对高斯噪声处理结果较差。

3.2 统计排序滤波器

顺序统计滤波器的响应是基于由滤波器包围的图像区域中像素点的排序,任一点的响应由排序结果决定。也包含好几种:中值滤波
f ^ ( x , y ) = median ⁡ ( s , t ) ∈ S n { g ( s , t ) } \hat{f}(x, y)=\operatorname{median}_{(s, t) \in S_{n}}\{g(s, t)\} f^(x,y)=median(s,t)Sn{g(s,t)}
如其名称所暗示的那样,它使用一个像素邻域中的灰度级的中值来替代该像素的值。中值滤波同样也需要一卷积核、与卷积滤波不同的是,它不会用卷积核的每个系数与对应的像素值做算术计算,而是把对应的像素值做排序,取中间值作为输出。

既然核心是排序,除了中值,必然还有头和尾,也就是最大值和最小值滤波器
f ^ ( x , y ) = max ⁡ ( s , t ) ∈ S x y { g ( s , t ) } \hat{f}(x, y)=\max _{(s, t) \in S_{xy}}\{g(s, t)\} f^(x,y)=(s,t)Sxymax{g(s,t)}

f ^ ( x , y ) = min ⁡ ( s , t ) ∈ S x y { g ( s , t ) } \hat{f}(x, y)=\min _{(s, t) \in S_{xy}}\{g(s, t)\} f^(x,y)=(s,t)Sxymin{g(s,t)}

中值滤波可以抑制椒盐噪声;
最大值滤波可以填充小的闭合区域以及狭窄的间断;
最小值滤波可以去除小的图像噪声或者图像元素对象的大小丝黏连)
或者抑制图像像素极小值与极大值最大值最小值滤波)。

3.3 自适应滤波器

自适应滤波器的行为变化基于由m×n矩形窗口Sxy定义的区域内图像的统计特性,它的性能要明显优于前面介绍的滤波器,代价是滤波器的复杂度。滤波器作用于局部区域Sxy,滤波器在中心化区域中任何点(x,y)上的滤波器响应基于以下4个量:

  • g(x, y)表示噪声图像在点(x, y)上的值
  • 干扰f(x, y)以形成g(x, y)的噪声方差
  • 在Sxy上像素点的局部均值
  • 在Sxy上像素点的局部方差

4 用频率域滤波消除周期噪声

频率域技术滤除周期噪声可行的原因是周期噪声在对应于周期干扰的频率处,以集中的能量脉冲形式出现。滤除的方法之一是选择性滤波器(带阻、带通和陷波)。

  • 带阻滤波器

    它的主要应用之一是在频率域噪声成分的一般位置近似一直的应用中消除噪声。

  • 带通滤波器

    它执行与带阻滤波器相反的操作。

  • 陷波滤波器

    阻止(或通过)事先定义的中心频率邻域内的频率。

5 逆滤波和维纳滤波

对如下公式:
G ( u , v ) = H ( u , v ) F ( u , v ) + N ( u , v ) G(u, v)=H(u, v) F(u, v)+N(u, v) G(u,v)=H(u,v)F(u,v)+N(u,v)

如果不存在噪声,则上面的式子可以简化为:
G ( u , v ) = H ( u , v ) F ( u , v ) G(u, v)=H(u, v) F(u, v) G(u,v)=H(u,v)F(u,v)

我们将1/H(u, v)称为逆滤波器。逆滤波复原步骤:
(1) 对退化图像g(x,y)作二维离散傅里叶变换,得到G(u,v);
(2) 计算系统点扩散函数(即退化函数)h(x,y)的二维离散傅里叶变换,得到H(u,v);
(3) 逆滤波计算F(u,v) = G(u,v)/H(u,v)
(4) 计算F(u,v)的逆傅里叶变换,求得f(x,y)

对于维纳滤波,也叫最小均方误差滤波,是一种建立在最小化统计准则的基础上的复原方法,在平均意义上,它可以看成是最优的。维纳滤波综合了退化函数和噪声统计特征两个方面进行复原处理,在认为图像和噪声是随机过程的基础上,以恢复图像和原图像的均方误差最小为准则。维纳滤波用来去除含有噪声的模糊图像,其目标是找到未污染图像的一个估计,使它们之间的均方差最小,可以去除噪声,同时清晰化模糊图像:
e 2 = E { ( f − f ^ ) 2 } e^{2}=E\left\{(f-\widehat{f})^{2}\right\} e2=E{(ff )2}
通过实验了解下维纳滤波的复原效果,效果如下:

在这里插入图片描述

代码如下:

from scipy.signal import wiener
import cv2
import numpy as np
import matplotlib.pyplot as pltdef gasuss_noise(image, mean=0, var=0.008):'''添加高斯噪声mean : 均值var : 方差'''image = np.array(image/255, dtype=float)noise = np.random.normal(mean, var ** 0.5, image.shape)out = image + noiseif out.min() < 0:low_clip = -1.else:low_clip = 0.out = np.clip(out, low_clip, 1.0)out = np.uint8(out*255)return outif __name__ == '__main__':lena = cv2.imread(r' ') # filepathif lena.shape[-1] == 3:lenaGray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)else:lenaGray = lena.copy()plt.figure(dpi = 180)plt.subplot(131)plt.title("原图")plt.imshow(lenaGray, cmap='gray')# 添加高斯噪声lenaNoise = gasuss_noise(lenaGray)plt.subplot(132)plt.title("高斯噪声")plt.imshow(lenaNoise, cmap='gray')# 维纳滤波lenaNoise = lenaNoise.astype('float64')lenaWiener = wiener(lenaNoise, [3, 3])lenaWiener = np.uint8(lenaWiener / lenaWiener.max() * 255)plt.subplot(133)plt.title("维纳滤波")plt.imshow(lenaWiener, cmap='gray')plt.tight_layout()plt.show()lenaNoise.astype('float64')lenaWiener = wiener(lenaNoise, [3, 3])lenaWiener = np.uint8(lenaWiener / lenaWiener.max() * 255)plt.subplot(133)plt.title("维纳滤波")plt.imshow(lenaWiener, cmap='gray')plt.tight_layout()plt.show()

本章中的复原结果都是有前提的,即图像退化可建模为一个线性的、位置不变的过程,以及与图像值不相关的加性噪声。就像在第3章和第4章中那样,一定的复原任务,譬如降低随机噪声,是在空间域中使用卷积模板来执行的。我们也发现频率域对于降低周期性噪声和对于某些重要的退化建模是很理想的,如在图像获取期间因为运动导致的模糊。我们还发现,对于表达复原滤波器来说,频率域也是很有用的工具,如维纳滤波器和约束最小二乘方滤波器。


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

相关文章

机器人群控避障算法ORCA

最优互补避碰ORCA算法 建议参考资料 ORCA-有关机器人群碰撞避免算法解读&#xff08;柳朦朦&#xff09; 导航动态避让算法RVO的优化ORCA(Optimal Reciprocal Collision Avoidance)-漫漫之间n Reciprocal n-body Collision Avoidance英文PDF 避障算法-VO、RVO 以及 ORCA&a…

限流算法的原理

计数器算法 在一定时间内&#xff0c;对处理的请求数进行计数&#xff0c;每次到达时间临界点则计数器清零。在一定时间间隔内&#xff0c;若计数器数字超限&#xff0c;则进行限流。 该算法的问题是&#xff0c;在两端临界点附加可能出现两倍的流速。 滑动窗口算法 基于计…

A*算法图解

A*&#xff08;A-star&#xff09;算法是一种静态网路中求解最短路径最有效的直接搜索算法。在电子游戏中最主要的应用是寻找地图上两点间的最佳路线。在机器人领域中&#xff0c;A*算法常用于移动机器人路径规划。 为了便于理解&#xff0c;本文将以正方形网格地图为例进行讲解…

a 算法原理 java_最短路径A*算法原理及java代码实现(看不懂是我的失败)

算法只要懂原理了&#xff0c;代码都是小问题&#xff0c;先看下面理论&#xff0c;尤其是红色标注的(要源码请留下邮箱&#xff0c;有测试用例&#xff0c;直接运行即可)A*算法百度上的解释&#xff1a;A*[1](A-Star)算法是 算法只要懂原理了&#xff0c;代码都是小问题&#…

A*算法原理简析

引言 。 A算法是一种启发式的搜索算法&#xff0c;它是基于深度优先算法和广度优先算法的一种融合算法&#xff0c;按照一定规则确定如何选取下一个节点。在介绍A算法之前&#xff0c;需要了解一下什么是启发式搜索算法&#xff0c;深度优先算法以及广度优先算法。 启发式搜…

A*算法原理

A* 算法 概述 虽然掌握了 A* 算法的人认为它容易&#xff0c;但是对于初学者来说&#xff0c; A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点&#xff0c;但是这两点之间被一堵墙隔开。如图 1 &#xff0c;绿色是 A &#xff0c;红色是 B…

A Star算法原理及其实现

A &#xff0d;Star算法 A*&#xff08;A-Star)算法是一种求解最短路径最有效的直接搜索方法&#xff0c;也是许多其他问题的常用启发式算法。 一、简介 二、寻路方式 三、运行机制 四、常用估价算法 五、示例 一、简介 A*&#xff08;A-Star)算法是一种求解最短路径最有…

sift算法原理,按步骤记录

sitf算法是一种描述图像特征的&#xff0c;重要的&#xff0c;基础的方法。主要由以下几个步骤构成&#xff1a; 0.尺度空间理论 尺度空间理论认为&#xff0c;人眼在认知画面时&#xff0c;在不同的尺度上使用的是不同特征&#xff0c;例如观察树叶时使用的是小尺度特征&…

DQN算法流程及原理

相关名词解释&#xff1a; Agent&#xff1a;智能体&#xff1b;s—state&#xff1a;状态&#xff08;放在格子游戏中&#xff0c;就是智能体的位置坐标(x,y))a—action&#xff1a;智能体采取的动作&#xff08;例如上下左右&#xff09;r—reward&#xff1a;奖励&#xff…

D*算法原理与程序详解(Python)

提示&#xff1a;前文写了D搜索算法&#xff0c;是一种贪心算法。 文章目录 一、D*算法是什么&#xff1f;二、原理以及代码步骤1.原理分析2.代码解释 总结 一、D*算法是什么&#xff1f; D*算法也是用于机器人路径规划问题的启发式方法&#xff0c;它是一种局部规划方法&…

unityA星寻路算法基础原理

作者&#xff1a; 风不停息丶 文章目录 &#x1f9d1;‍&#x1f4bb;A星寻路简介&#x1f449;代码基础架构&#x1f44d;代码实现格子类寻路管理类效果 结尾总结 &#x1f9d1;‍&#x1f4bb;A星寻路简介 A*寻路就是用来计算玩家行进路径的&#xff0c;通过它可以计算出避开…

【YOLO系列】YOLO.v1算法原理详解

YOLO(You Only Look Once)系列算法原理 前言 &#xff1a;详细介绍了yolo系列目标检测算法的原理和发展过程。 系列&#xff1a; 【YOLO系列】YOLO.v1算法原理详解 【YOLO系列】YOLO.v2算法原理详解 【YOLO系列】YOLO.v3算法原理详解 【YOLO系列】YOLO.v4 & YOLO.v5算法原…

A*算法原理与实现

前言 A*算法最初发表于1968年&#xff0c;由Stanford研究院的Peter Hart, Nils Nilsson以及Bertram Raphael发表。它可以被认为是Dijkstra算法的扩展。 由于借助启发函数的引导&#xff0c;A*算法通常拥有更好的性能。 一、 A*吸取了Dijkstra 算法中的cost_so_far&#xff0c;为…

激光SLAM之NDT算法(1)算法原理

/在激光SLAM之NDT算法&#xff08;2&#xff09;-建图中我会给出实测可用的建图代码,并予以解释代码结构,这里就先讲讲原理吧!!!/ 无人车激光SLAM系统简单可以分为建图和定位两部分&#xff0c;无人车的定位问题&#xff0c;实际上就是要找出无人车当前在地图的那个位置&#x…

A*算法的原理及应用

A*算法的原理 A* 算法是一种高效的启发式搜索算法&#xff0c;在二维的栅格地图上寻路效果好&#xff0c;它通过估算节点的代价评估函数值并作为节点的综合优先级&#xff0c;当选择下一个需要遍历的节点时&#xff0c;再选取综合优先级最高的节点&#xff0c;逐步地找到最优路…

Bresenham 画圆算法原理

文章目录 前言Bresenham 画圆算法原理两个近似构造判别式圆与网格点的关系关系由来关系含义p i p_i pi​ 递推画圆程序伪码圆与网格点的关系图示前言 首先简要介绍一下生成圆的方法: 直接利用圆的方程生成圆利用圆的对称性生成圆方法一由于会涉及到浮点运算等因素,不采取该方…

Js中读取、移除属性及隐藏组件方法研究

添加、移除组件属性方法: $(".class名").attr("属性名","属性值");//设置指定属性 $(".class名").attr("属性名");//读取指定属性值 or document.getElementById("id值").getAttribute("属性名…

js获取属性值,自定义属性,修改移除属性值

补充&#xff1a;由于不清楚一些属性是内置属性还是自定义属性 所以h5规定 自定义属性使用date-开头作为属性并赋值 案例1: <body><div date-index"1"></div> </body> <script>var div document.querySelector(div);console.log(div…

获取/移除属性值

1.获取属性值&#xff1a; element.属性 获取属性值 element.getAttribute&#xff08;‘属性’&#xff09;&#xff1b; 2.区别&#xff1a; element.属性 获取内置属性值&#xff08;元素本身自带的属性&#xff09; element.getAttribute&#xff08;‘属性’&#xff09;&…

JavaScript移除对象中不必要的属性

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 业务开发中&#xff0c;我们经常会遇到&#xff1a;基于后端返回接口数据&#xff0c;前端保存到对象 Object 中&#xff0c;前端开发过程中为了一些场景的便利性&#xff0c;需要在该对象中增加相应的…