zoukankan      html  css  js  c++  java
  • SciPy

    滤波

    滤波常用于降噪;

    滤波有多种,中值滤波,均值滤波,等等,说的很高大上,其实很简单,各种滤波原理类似。

    中值滤波为例,把 每一点的数据该点指定邻域内数的中位数 代替

    如 数据 [1,8,3],邻域大小为3,则8经过滤波后是3,[1,3,8]的中位数;数据可以是多维的,邻域也可以为多维;

    其过程类似卷积

    python 中值滤波函数为 scipy.signal.medfilt(signal, kernel_size),第一个参数为信号值,第二个参数为滑框大小,注意第二个参数必须为奇数,即左+1+右;

    如果滑框内没数据,以 0 填充

    import random
    import numpy as np
    import scipy.signal as signal
    
    # 一维中值滤波
    x=np.arange(0,100,10)
    random.shuffle(x)
    print x
    # [70 20 10 30 40  0 60 80 90 50]
    print signal.medfilt(x,3)   # 一维中值滤波
    # [20. 20. 20. 30. 30. 40. 60. 80. 80. 50.]
    
    
    # 二维中值滤波
    x=np.random.randint(1,1000,(4,4))
    print x
    # [[711  77 365 518]
    #  [987 621 734  19]
    #  [652 370 615 467]
    #  [852 420 880 175]]
    print signal.medfilt(x,(3,3))
    # [[  0. 365.  77.   0.]
    #  [370. 621. 467. 365.]
    #  [420. 652. 467. 175.]
    #  [  0. 420. 370.   0.]]

    二维中值滤波还可以用 signal.medfilt2d(),速度快,但只支持 int8,float32,float64

    滑框维度总是可以为1,如果大于1,其维度必须等于信号维度

    也就是说,如果信号为3维,滑框必须为3维

    图像去噪

    滤波常用于图像预处理

    import numpy as np
    from PIL import Image
    import scipy.signal as signal
    
    
    im=Image.open('test2.png')   # 读入图片并建立Image对象im
    # im=im.convert('L')          # 转为灰度图
    data=[]                     # 存储图像中所有像素值的list(二维)
    width,height=im.size        # 图片尺寸,长宽,或者说宽高-->横竖
    print(width, height)
    
    # 读取图像像素的值
    for w in range(width):      # 对每个行号h
        row=[]                  # 记录每一行像素
        for h in range(height): # 对每行的每个像素列位置w
            value=im.getpixel((w, h))    # 用getpixel读取这一点像素值
            row.append(value)            # 把它加到这一行的list中去
        data.append(row)        # 把记录好的每一行加到data的子list中去,就建立了模拟的二维list
    
    ### 彩色图滤波
    # data=signal.medfilt(data,kernel_size=3)           # 二维中值滤波
    # data=signal.medfilt(data,kernel_size=5)
    data=signal.medfilt(data,kernel_size=(3, 3, 3))
    
    ### 灰度图滤波
    ##1
    # data=signal.medfilt(data,kernel_size=(3, 3))
    ##2
    # data = np.uint8(data)
    # data=signal.medfilt2d(data,kernel_size=(11, 11))
    
    #
    data=np.int32(data)                         # 转换为int类型,以使用快速二维滤波
    # data=np.int8(data)
    print(data)
    
    # 创建并保存结果
    for w in range(width):       # 对每一行
        for h in range(height):  # 对该行的每一个列号
            im.putpixel((w,h),tuple(data[w][h])) # 将data中该位置的值存进图像,要求参数为tuple
            # im.putpixel((w,h),data[w][h])       # 灰度图的处理方式
    
    im.save('result2.jpg')       # 存储

    图1 为原图;图2 使用 领域为3的中值滤波处理;图3 使用 领域为5的中值滤波处理

    当使用中值滤波处理图片时,图像的边缘可能变得模糊,领域越大,越模糊。

    图3 的边缘就比 图1 模糊。

    也就是说滤波对图像的有去躁和模糊的作用。

    参考资料:

    https://blog.csdn.net/shu15121856/article/details/76273137

    https://blog.csdn.net/qq_38131594/article/details/80758567

    https://blog.csdn.net/qinghuaci666/article/details/81737624

  • 相关阅读:
    win10安装virtualBox创建CentOS6.5虚拟机
    ES系列二、CentOS7安装ES head6.3.1
    ES系列一、CentOS7安装ES 6.3.1、集成IK分词器
    Python easyGUI 猜数字
    Python easyGUI 登录框 非空验证
    Python easyGUI 文件浏览 显示文件内容
    Python easyGUI 文件对比 覆盖保存
    Python 统计代码量
    什么是一个人真正的魅力?
    Python学习笔记(15)- osos.path 操作文件
  • 原文地址:https://www.cnblogs.com/yanshw/p/11170841.html
Copyright © 2011-2022 走看看