Python——通过统计图像像素值初步分析图像噪声类型

2024-01-10 08:40:40

图像噪声是指图像中不随真实场景变化而变化的随机干扰。噪声会影响图像的质量,因此需要对其进行去噪处理。

一、图像噪声

图像的像素值统计是指对图像中所有像素值进行统计分析,包括均值、方差、峰度、偏度等。这些统计量可以反映图像的整体特征,也能够用来判断噪声的类型。

1.1 噪声类型

根据均值和方差的不同组合,可以将噪声分为以下几种类型:

均值为零、方差为常数的噪声,称为高斯噪声。高斯噪声是一种常见的噪声类型,其特征是噪声分布符合高斯分布。

均值为零、方差随空间位置变化的噪声,称为高斯白噪声。高斯白噪声是高斯噪声的一种特殊形式,其特征是噪声在空间上是均匀分布的。

均值不为零、方差为常数的噪声,称为均值偏移高斯噪声。均值偏移高斯噪声的特征是噪声在均值上有一个固定的偏差。

均值不为零、方差随空间位置变化的噪声,称为均值偏移高斯白噪声。均值偏移高斯白噪声是均值偏移高斯噪声的一种特殊形式,其特征是噪声在空间上是均匀分布的。

通过计算图像的均值和方差,可以初步判断噪声的类型。例如,如果图像的均值为零、方差为常数,则该图像可能受到高斯噪声的污染。

1.2 结合峰度和偏度判断噪声

仅仅根据均值和方差还不能完全确定噪声的类型,还需要结合其他特征进行判断。例如,可以通过计算噪声的峰度和偏度来进一步判断噪声的类型。

以下是一些常用的图像噪声类型判断方法:

均值和方差:如果均值为零、方差为常数,则可能是高斯噪声;如果均值为零、方差随空间位置变化,则可能是高斯白噪声;如果均值不为零、方差为常数,则可能是均值偏移高斯噪声;如果均值不为零、方差随空间位置变化,则可能是均值偏移高斯白噪声。

峰度和偏度:如果峰度和偏度均接近于零,则可能是高斯噪声;如果峰度和偏度均不为零,则可能是其他噪声类型。

直方图:如果直方图呈现出高斯分布,则可能是高斯噪声;如果直方图呈现出其他分布,则可能是其他噪声类型。

1.2.1 峰度和偏度

噪声的峰度和偏度是噪声的两个重要特征,可以用来描述噪声的分布形状。

峰度(Kurtosis)是指噪声分布尾部的形状。峰度越大,噪声分布尾部越厚,越容易出现极端值。

偏度(Skewness)是指噪声分布对称性的度量。偏度越大,噪声分布越不对称,越容易出现偏离均值的值。

噪声的峰度和偏度可以通过以下公式计算:
在这里插入图片描述
其中xi表示噪声的每个值,μ 表示噪声的均值,σ 表示噪声的标准差。

噪声的峰度和偏度可以通过直方图来直观地观察。如果直方图呈现出高斯分布,则噪声的峰度和偏度均接近于零。如果直方图呈现出其他分布,则噪声的峰度和偏度可能不为零。

1.2.2 常见噪声的峰度和偏度

高斯噪声:峰度接近于 3,偏度接近于 0。

均值偏移高斯噪声:峰度接近于 3,偏度接近于均值偏移量。

拉普拉斯噪声:峰度为 3.69,偏度为 1.58。

指数噪声:峰度为 0,偏度为 0。

二、代码

使用代码,只需要修改导入图片路径即可,具体代码如下:

import numpy as np
import matplotlib.pyplot as plt
import cv2

def noise_type(img):
    """
    判断图像的噪声类型

    Args:
        img: 图像

    Returns:
        噪声类型
    """

    # 计算图像的均值和方差
    img_mean = np.mean(img)
    img_var = np.var(img)

    print("图像均值为:",img_mean)
    print("图像方差为:",img_var)

    # 计算图像的峰度和偏度
    img_kurtosis = np.mean((img - img_mean)**4) / (img_var**2)
    img_skewness = np.mean((img - img_mean)**3) / (img_var**1.5)
    print("图像的峰度为",img_kurtosis)
    print("图像的偏度为", img_skewness)

    # 判断噪声类型
    if img_mean == 0 and img_var == img_var.max():
        return "高斯白噪声"
    elif img_mean != 0 and img_var == img_var.max():
        return "均值偏移高斯白噪声"
    elif img_kurtosis == 3 and img_skewness == 0:
        return "高斯噪声"
    elif img_kurtosis == 3.69 and img_skewness == 1.58:
        return "拉普拉斯噪声"
    elif img_kurtosis == 0 and img_skewness == 0:
        return "指数噪声"
    else:
        return "其他噪声"

def plot_hist(img):
    """
    绘制图像直方图

    Args:
        img: 图像
    """

    plt.hist(img, bins=256)
    plt.show()

if __name__ == "__main__":
    # 读取图像
    img = cv2.imread("Images/input-resize_480360/1.bmp",0)

    # 判断噪声类型
    noise_type = noise_type(img)
    print("噪声类型:", noise_type)

    # 绘制直方图
    plot_hist(img)

三、测试结果

运行上面代码后得到的结果如下,运行代码后需要等待一会。

在这里插入图片描述

下面是图像的直方图
在这里插入图片描述

四、总结

以上就是使用Python,通过统计图像像素值初步分析图像噪声类型。

注意,博文中的方法只是初步大致估计,并不能准确确定噪声类型,具体噪声类型还要根据实际情况判断。

总结不易,多多支持,谢谢!

文章来源:https://blog.csdn.net/qq_40280673/article/details/135485537
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。