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

文章目录

  • 数字图像处理——第五章 图像复原与重建
  • 写在前面
  • 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)的信息。具体来说,在空间域中退化图像可由下式给出:
重构图片 神经网络 图像重构和图像重建_python_02
频率域表示:
重构图片 神经网络 图像重构和图像重建_opencv_03

2 噪声模型

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

2.1 高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。高斯噪声信号x的概率密度函数如下:
重构图片 神经网络 图像重构和图像重建_重构图片 神经网络_04
特殊情况的高斯图像如下图所示:可自己编写函数实现

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

重构图片 神经网络 图像重构和图像重建_opencv_05

接着代码实现下给原图加上高斯噪声,步骤大概如下:首先将图片转成灰度图,然后确定噪声点数量,最后随机生成噪声点在图中的坐标,然后将该点处的灰度值设置成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] = 255
    return G_Noiseimg

重构图片 神经网络 图像重构和图像重建_python_06

2.2 椒盐噪声

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

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

def salt_pepperNoise(img, noiseNum):
    image = img.copy()
    ndim = src.ndim
    row, 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-pepper
        salt_or_pepper = np.random.randint(0, 2)
        if salt_or_pepper == 0:
            image[x, y, :] = 0
        else:
            image[x, y, :] = 255
    return image

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

重构图片 神经网络 图像重构和图像重建_机器学习_07

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

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

当一幅图像中唯一存在的退化是噪声时,上述的空间域和时间域公式为:
重构图片 神经网络 图像重构和图像重建_计算机视觉_08

重构图片 神经网络 图像重构和图像重建_重构图片 神经网络_09

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

3.1 均值滤波器

均值滤波器有分很多种类,比如算数均值滤波器
重构图片 神经网络 图像重构和图像重建_python_10
这是最简单的均值滤波器。令S表示中心在点(x, y)处、大小为m×n的矩形子图像窗口(邻域)的一组坐标。算术均值滤波器在S定义的区域中计算被污染图像g(x,y)的平均值。在点(x, y)处复原图像f_hat的值。这个操作可以使用大小为m×n的一个空间滤波器来实现,其所有的系数均为其值的1/m×n。均值滤波平滑一幅图像中的局部变化,虽然模糊了结果,但降低了噪声。

几何均值滤波器
重构图片 神经网络 图像重构和图像重建_重构图片 神经网络_11
其中,每个复原的像素由子图像窗口中像素的乘积的1/m×n 次幂给出。

谐波均值滤波器
重构图片 神经网络 图像重构和图像重建_重构图片 神经网络_12
谐波均值滤波器对于盐粒噪声效果较好,但不适用于胡椒噪声。它善于处理像高斯噪声那样的其他噪声。

逆谐波均值滤波器
重构图片 神经网络 图像重构和图像重建_python_13
其中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))

重构图片 神经网络 图像重构和图像重建_机器学习_14

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

3.2 统计排序滤波器

顺序统计滤波器的响应是基于由滤波器包围的图像区域中像素点的排序,任一点的响应由排序结果决定。也包含好几种:中值滤波
重构图片 神经网络 图像重构和图像重建_计算机视觉_15
如其名称所暗示的那样,它使用一个像素邻域中的灰度级的中值来替代该像素的值。中值滤波同样也需要一卷积核、与卷积滤波不同的是,它不会用卷积核的每个系数与对应的像素值做算术计算,而是把对应的像素值做排序,取中间值作为输出。

既然核心是排序,除了中值,必然还有头和尾,也就是最大值和最小值滤波器
重构图片 神经网络 图像重构和图像重建_python_16

重构图片 神经网络 图像重构和图像重建_重构图片 神经网络_17

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

3.3 自适应滤波器

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

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

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

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

  • 带阻滤波器
    它的主要应用之一是在频率域噪声成分的一般位置近似一直的应用中消除噪声。
  • 带通滤波器
    它执行与带阻滤波器相反的操作。
  • 陷波滤波器
    阻止(或通过)事先定义的中心频率邻域内的频率。

5 逆滤波和维纳滤波

对如下公式:
重构图片 神经网络 图像重构和图像重建_opencv_03

如果不存在噪声,则上面的式子可以简化为:
重构图片 神经网络 图像重构和图像重建_opencv_19

我们将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)

对于维纳滤波,也叫最小均方误差滤波,是一种建立在最小化统计准则的基础上的复原方法,在平均意义上,它可以看成是最优的。维纳滤波综合了退化函数和噪声统计特征两个方面进行复原处理,在认为图像和噪声是随机过程的基础上,以恢复图像和原图像的均方误差最小为准则。维纳滤波用来去除含有噪声的模糊图像,其目标是找到未污染图像的一个估计,使它们之间的均方差最小,可以去除噪声,同时清晰化模糊图像:
重构图片 神经网络 图像重构和图像重建_重构图片 神经网络_20
通过实验了解下维纳滤波的复原效果,效果如下:

重构图片 神经网络 图像重构和图像重建_计算机视觉_21

代码如下:

from scipy.signal import wiener
import cv2
import numpy as np
import matplotlib.pyplot as plt

def 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 + noise
    if out.min() < 0:
        low_clip = -1.
    else:
        low_clip = 0.
    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out*255)

    return out

if __name__ == '__main__':
    lena = cv2.imread(r' ') # filepath
    if 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章中那样,一定的复原任务,譬如降低随机噪声,是在空间域中使用卷积模板来执行的。我们也发现频率域对于降低周期性噪声和对于某些重要的退化建模是很理想的,如在图像获取期间因为运动导致的模糊。我们还发现,对于表达复原滤波器来说,频率域也是很有用的工具,如维纳滤波器和约束最小二乘方滤波器。