高斯噪声、高斯滤波详解

1 图像噪声

由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们 对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。

高斯噪声

高斯噪声是指噪声密度函数服从高斯分布的一类噪声。由于高斯噪声在空间 和频域中数学上的易处理性,这种噪声(也称为正态噪声)模型经常被用于实践中。高斯随机变量z的概率密度函数由下式给出:

其中z表示灰度值,μ表示z的平均值或期望值,σ表示z的标准差。标准差 的平方σ2σ2称为z的方差。高斯函数的曲线如图所示。 

那么我们一般怎样来判断图像中的噪声是否是高斯噪声呢?有以下几种方法:

  1. 视觉观察:

    • 高斯噪声通常表现为均匀分布在整个图像上的细小颗粒状噪点。
    • 噪声应该看起来是随机的,没有明显的模式或规律。
    • 与椒盐噪声不同,高斯噪声不会产生极端的黑白点。

  2. 直方图分析:

    • 对图像的灰度直方图进行分析。
    • 如果噪声是高斯分布的,图像的灰度直方图应该呈现近似正态分布的形状。
    • 可以使用统计软件或图像处理工具来绘制和分析直方图。
  3. Q-Q图(Quantile-Quantile Plot):

    • Q-Q图是用来比较两个概率分布的图形方法。
    • 如果噪声是高斯分布,Q-Q图应该呈现一条直线。
    • 可以使用统计软件如R或Python的scipy库来绘制Q-Q图。
  4. 统计检验:

    • 使用统计检验方法,如Kolmogorov-Smirnov检验或Shapiro-Wilk检验,来判断噪声分布是否符合正态分布。
    • 这些检验可以给出一个p值,用于判断数据与正态分布的符合程度。
  5. 频域分析:

    • 对图像进行傅里叶变换,分析其频谱特性。
    • 高斯噪声在频域中应该表现为均匀分布的高频成分。
  6. 噪声提取:

    • 如果有原始的无噪声图像,可以通过减法操作提取噪声。
    • 分析提取出的噪声的统计特性,如均值、方差等。

 以下是一个使用Python实现的进行直方图分析和Q-Q图分析的示例,大家有兴趣可以试一试:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import cv2

# 读取图像
img = cv2.imread('noisy_image.jpg', 0)  # 以灰度模式读取

# 计算并绘制直方图
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.hist(img.ravel(), bins=256, range=[0, 256])
plt.title('Histogram')

# Q-Q图
plt.subplot(122)
stats.probplot(img.ravel(), dist="norm", plot=plt)
plt.title('Q-Q Plot')

plt.tight_layout()
plt.show()

# 进行Shapiro-Wilk检验
_, p_value = stats.shapiro(img.ravel())
print(f"Shapiro-Wilk test p-value: {p_value}")

2 图像平滑简介

图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。 根据滤波器的不同可分为均值滤波,高斯滤波,中值滤波, 双边滤波。

高斯平滑(滤波)

高斯平滑(Gaussian Blurring)是一种常用的图像处理技术,通过将图像与一个高斯核(Gaussian Kernel)进行卷积来实现。高斯平滑的关键在于生成高斯核,这个核的权重矩阵是根据二维高斯函数计算的。

计算二维高斯核的权重矩阵

二维高斯函数的定义如下:

其中,σ 是标准差,决定了高斯核的宽度和程度,G(x,y)的分布是一个突起的帽子的形状。这里的σ可以看作两个值,一个是x方向的标准差σx,另一个是y方向的标准差σy。

当σ​x​​和σ​y​​取值越大,整个形状趋近于扁平;当σ​x​​和σ​y​​,整个形状越突起。

正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。计算平滑结果时,只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

高斯平滑在从图像中去除高斯噪声方面非常有效。

 步骤:
1. 确定核的大小:一般来说,核的大小(如 :k*k)选择为奇数,以保证中心点的对称性。常用的尺寸有 3*3, 5*5 等。核的大小与 σ​有关,通常选择大约 ( 6σ​ + 1 ) 作为尺寸来确保足够的覆盖范围。

2. 生成权重矩阵:根据高斯函数公式对每个位置计算权重。

3. 归一化:为了保证核的权重和等于1(即卷积不会改变图像的亮度),需要将所有权重值归一化。

 示例:计算 3 *3  高斯核

假设标准差 ( σ​ = 1.5 ),核的大小为3 *3 ,计算过程如下:

    1. 确定核中心:对于 3 *3 核,中心为 (0, 0),该卷积核如下:

    2. 计算权重:为了计算权重矩阵,需要设定σ的值。我们之前已经假定σ=1.5,使用二维高斯公式:

左下角的权重 G(-1, -1)  计算该点的权重:

可以使用以下代码来计算该点的权重: 

import numpy as np

def gaussian_weight(x, y, sigma):
    return (1 / (2 * np.pi * sigma**2)) * np.exp(-((x**2 + y**2) / (2 * sigma**2)))

sigma = 1.5
x, y = -1, -1
weight = gaussian_weight(x, y, sigma)
print(f"Weight at position ({x}, {y}) is: {weight}")

类似地,计算其他位置的权重,得出模糊半径为1的权重矩阵如下:

3. 归一化:将所有权重值相加,得到总和,然后每个权重除以总和进行归一化,这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还 必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。

示例Python代码:

另外再给一个计算和应用 5*5高斯核的示例:

import numpy as np
import cv2

def gaussian_kernel(size, sigma=1):
    kernel = np.zeros((size, size))
    center = size // 2
    sum_val = 0
    
    for x in range(size):
        for y in range(size):
            diff = np.sqrt((x - center) ** 2 + (y - center) ** 2)
            kernel[x, y] = np.exp(-(diff ** 2) / (2 * sigma ** 2))
            sum_val += kernel[x, y]
    
    # 归一化
    kernel = kernel / sum_val
    return kernel

# 核大小和标准差
kernel_size = 5
sigma = 1
gauss_kernel = gaussian_kernel(kernel_size, sigma)

# 打印生成的高斯核
print("Gaussian Kernel:")
print(gauss_kernel)

# 读取图像
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用高斯平滑
smoothed_image = cv2.filter2D(image, -1, gauss_kernel)

# 显示原始和平滑后图像
cv2.imshow('Original Image', image)
cv2.imshow('Smoothed Image', smoothed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.计算高斯模糊 :有了权重矩阵,就可以计算高斯模糊的值了。 假设现有9个像素点,灰度值(0-255)如下:

 每个点乘以对应的权重值:

将这9个值加起来,就是中心点的高斯模糊的值。 对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图 片,可以对RGB三个通道分别做高斯平滑。 

  • 36
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值