• Python计算机视觉3:模糊,平滑,去噪


    我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢


    图像的模糊和平滑是同一个层面的意思,平滑的过程就是一个模糊的过程。

    而图像的去噪可以通过图像的模糊、平滑来实现(图像去噪还有其他的方法)


    那么怎么才能对一幅图像进行模糊平滑呢?

    图像的模糊平滑是对图像矩阵进行平均的过程。相比于图像锐化(微分过程),图像平滑处理是一个积分的过程

    图像平滑过程可以通过原图像和一个积分算子进行卷积来实现。

    下面介绍两种积分算子


     全1算子 

    最简单的积分算子就是全1算子

    利用全1算子可以对图像进行模糊平滑操作,有一定的去噪能力。

    下面是python实例

    import numpy as np
    from PIL import Image
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    
    
    suanzi = np.ones((3,3)) # 创建全1算子 
    
    # 打开图像并转化成灰度图像
    image = Image.open("pika.jpg").convert("L")
    image_array = np.array(image)
    
    # 原图像与全1算子进行卷积
    image2 = signal.convolve2d(image_array,suanzi,mode="same")
    
    # 将结果灰度值转化到0-255
    image2 = (image2/float(image2.max()))*255
    
    # 显示图像
    plt.subplot(2,1,1)
    plt.imshow(image_array,cmap=cm.gray)
    plt.axis("off")
    plt.subplot(2,1,2)
    plt.imshow(image2,cmap=cm.gray)
    plt.axis("off")
    
    plt.show()

    运行结果如下图,(为了看到效果,图像经过人工局部放大

    上图为原图像,下图为经过模糊处理图像

    比较两幅图可以看出,全1算子有一定的模糊平滑效果


     高斯算子 

    利用高斯算子进行模糊处理就是我们常听到的高斯模糊。

    标准差为σ的高斯分布如下式

    我们可以通过numpy模块的fromfunction()方法来生成高斯算子。

    import numpy as np
    
    # 乘以100是为了使算子中的数便于观察
    # sigma指定高斯算子的标准差
    
    def func(x,y,sigma=1):
        return 100*(1/(2*np.pi*sigma))*np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2))
    
    # 生成标准差都2的5*5高斯算子
    a = np.fromfunction(func,(5,5),sigma=2)
    
    print(a)
    # 结果
    [[ 2.92749158  4.25947511  4.82661763  4.25947511  2.92749158]
     [ 4.25947511  6.19749972  7.02268722  6.19749972  4.25947511]
     [ 4.82661763  7.02268722  7.95774715  7.02268722  4.82661763]
     [ 4.25947511  6.19749972  7.02268722  6.19749972  4.25947511]
     [ 2.92749158  4.25947511  4.82661763  4.25947511  2.92749158]]

     对上面的5*5高斯算子每个元素进行四舍五入,可以得到下面矩阵

     

    看到有些地方直接用上面的矩阵对图像进行高斯模糊,实际上是运用的是标准差为2的高斯近似算子。

    利用高斯算子对图像进行模糊,程序如下

    import numpy as np
    from PIL import Image
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    import scipy.signal as signal
    
    # 生成高斯算子的函数
    def func(x,y,sigma=1):
        return 100*(1/(2*np.pi*sigma))*np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2))
    
    # 生成标准差为2的5*5高斯算子
    suanzi = np.fromfunction(func,(5,5),sigma=2)
    
    # 打开图像并转化成灰度图像
    image = Image.open("pika.jpg").convert("L")
    image_array = np.array(image)
    
    # 图像与高斯算子进行卷积
    image2 = signal.convolve2d(image_array,suanzi,mode="same")
    
    # 结果转化到0-255
    image2 = (image2/float(image2.max()))*255
    
    # 显示图像
    plt.subplot(2,1,1)
    plt.imshow(image_array,cmap=cm.gray)
    plt.axis("off")
    plt.subplot(2,1,2)
    plt.imshow(image2,cmap=cm.gray)
    plt.axis("off")
    
    plt.show()

    运行结果如下图,(为了看到效果,图像经过人工局部放大

    上图为原图像,下图为经过高斯模糊处理图像

    对比高斯算子和全1算子,可以看出,高斯算子的模糊想过似乎更好。

    而且,我们可以通过更改高斯算子的标准差和维数来调整模糊效果

    一般来说,高斯算子标准差越大,维数越大,图像越模糊


    参考列表

    1.《python计算机视觉编程》

    2.度娘,感谢那些热爱分享知识的朋友

  • 相关阅读:
    tensorflow基础【3】-Session、placeholder、feed、fetch
    tensorflow基础【2】-Variable 详解
    字符串处理、变量初始值处理、扩展的脚本技巧、正则表达式
    循环结构、while循环、case、函数及中断控制
    数值运算、条件测试、 if选择结构
    逻辑+系统管理命令
    PXE 装机服务器的搭建
    DNS服务器的功能
    RAID阵列概述,进程管理,日志管理,systemctl控制,源码包编译安装
    快照制作、vim编辑技巧、发布网络YUM源、查看本机网络连接信息
  • 原文地址:https://www.cnblogs.com/smallpi/p/4562345.html
Copyright © 2020-2023  润新知