• 处理模糊图片

    一,使用傅里叶变换处理模糊图片
    傅里叶变换是将表示值的值转换为表示变化的值(大概应该是吧)
    原图登月图片
    观察图片发现白色像素块较多。可利用傅里叶变换转换后将变化较大的值置为0

    导入使用模块

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.fftpack import fft2,ifft2
    

    使用plt读取图片
    moon = plt.imread(’./img/moonlanding.png’)

    查看图片
    plt.imshow(moon,cmap=‘gray’)

    查看图片数据
    moon

    进行傅里叶变换
    moon_fft2 = fft2(moon)
    moon_fft2

    找出变换较大的值将其置为0
    cond = np.abs(moon_fft2) > 1e3
    moon_fft2[cond] = 0

    反傅里叶变换。重新变回表示值的值
    moon_ifft2 = ifft2(moon_fft2)
    moon_ifft2

    因为是经过傅里叶变化后复数。取实数部分作为结果值
    moon_clear = np.real(moon_ifft2)
    moon_clear

    展示图片
    plt.figure(figsize=(12,8))
    plt.imshow(moon_clear,cmap=‘gray’)

    保存
    plt.imsave(’./img/moon_fft2.png’,moon_clear,cmap=‘gray’)

    moon_fft2 = fft2(moon)
    cond = (np.abs(moon_fft2)>1e3)
    moon_fft2[cond] = 0
    moon_ifft2 = ifft2(moon_fft2)
    moon_clear = moon_ifft2.real
    plt.imshow(moon_clear,cmap='gray')
    plt.imsave('./img/moon_fft2.png',moon_clear,cmap='gray')
    

    原图
    原图
    转化后的图片
    傅里叶变换处理后的图

    二、使用图片降噪方法过滤噪声

    高斯滤波
    中值滤波
    维纳滤波

    导入模块

    import matplotlib.pyplot as plt
    import scipy.ndimage as ndimage
    import scipy.signal as signal
    

    导入图片

    moon = plt.imread('./img/moonlanding.png')
    

    高斯滤波

    moon_gaosi = ndimage.gaussian_filter(moon,2)
    plt.imshow(moon_gaosi,cmap='gray')
    

    保存图片

    plt.imsave('./img/moon_gaosi.png',moon_gaosi,cmap='gray')
    

    moon_gaosi = ndimage.gaussian_filter(moon,sigma)中sigma值可以根据效果调试设置
    高斯滤波处理后图片
    高斯滤波

    中值滤波同高斯滤波

    moon_median = ndimage.median_filter(moon,6)
    plt.imshow(moon_median,cmap='gray')
    

    保存图片

    plt.imsave('./img/moon_median.png',moon_median,cmap='gray')
    

    中值滤波效果不甚好
    中值滤波

    不同于高斯滤波与中值滤波。维纳滤波所依赖库不是scipy.ndimage而是scipy.signal
    使用方面相似

    moon_wiener = signal.wiener(moon,5)
    plt.imshow(moon_wiener,cmap='gray')
    

    保存图片

    plt.imsave('./img/moon_wiener.png',moon_wiener,cmap='gray')
    

    维纳滤波
    维纳滤波

    展开全文
  • 本文主要介绍了一些简单易懂最常用的Python图像处理库 当今世界充满了各种数据,而图像是其中高的重要组成部分。然而,若想其有所应用,我们需要对这些图像进行处理。图像处理是分析和操纵数字图像的过程,旨在提高...

     

    本文主要介绍了一些简单易懂最常用的Python图像处理库

    当今世界充满了各种数据,而图像是其中高的重要组成部分。然而,若想其有所应用,我们需要对这些图像进行处理。图像处理是分析和操纵数字图像的过程,旨在提高其质量或从中提取一些信息,然后将其用于某些方面。

    图像处理中的常见任务包括显示图像,基本操作(如裁剪、翻转、旋转等),图像分割,分类和特征提取,图像恢复和图像识别等。 Python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。

    让我们看一下用于图像处理任务的一些常用Python库。

    1. scikit Image

    scikit-image是一个基于numpy数组的开源Python包。 它实现了用于研究、教育和工业应用的算法和实用程序。 即使是对于那些刚接触Python的人,它也是一个相当简单的库。 此库代码质量非常高并已经过同行评审,是由一个活跃的志愿者社区编写的。

    使用说明文档:

    https://scikit-image.org/docs/stable/user_guide.html

    用法举例:图像过滤、模版匹配

    可使用“skimage”来导入该库。大多数功能都能在子模块中找到。 

    import matplotlib.pyplot as plt%matplotlib inline

    from skimage import data,filters

    image = data.coins()# ... or any other NumPy array!

    edges = filters.sobel(image)

    plt.imshow(edges, cmap='gray')

     

    模版匹配(使用match_template函数)

     

    gallery上还有更多例子。

    https://scikit-image.org/docs/dev/auto_examples/

    2. Numpy

    Numpy是Python编程的核心库之一,支持数组结构。 图像本质上是包含数据点像素的标准Numpy数组。 因此,通过使用基本的NumPy操作——例如切片、脱敏和花式索引,可以修改图像的像素值。 可以使用skimage加载图像并使用matplotlib显示。

    使用说明文档:

    http://www.numpy.org/

    用法举例:使用Numpy来对图像进行脱敏处理

    import numpy as np

    from skimage import data

    import matplotlib.pyplot as plt%matplotlib inline

    image = data.camera()type(image)numpy.ndarray #Image is a numpy array

    mask = image < 87

    image[mask]=255

    plt.imshow(image, cmap='gray')

    3. Scipy

    scipy是Python的另一个核心科学模块,就像Numpy一样,可用于基本的图像处理和处理任务。值得一提的是,子模块scipy.ndimage提供了在n维NumPy数组上运行的函数。 该软件包目前包括线性和非线性滤波、二进制形态、B样条插值和对象测量等功能。

    使用说明文档:

    https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution

    用法举例:使用SciPy的高斯滤波器对图像进行模糊处理

    from scipy import misc,ndimage

    face = misc.face()

    blurred_face = ndimage.gaussian_filter(face, sigma=3)

    very_blurred = ndimage.gaussian_filter(face, sigma=5)#Results

    plt.imshow()

     

    4. PIL/ Pillow

    PIL (Python Imaging Library)是一个免费的Python编程语言库,它增加了对打开、处理和保存许多不同图像文件格式的支持。 然而,它的发展停滞不前,其最后一次更新还是在2009年。幸运的是, PIL有一个正处于积极开发阶段的分支Pillow,它非常易于安装。Pillow能在所有主要操作系统上运行并支持Python 3。该库包含基本的图像处理功能,包括点操作、使用一组内置卷积内核进行过滤以及颜色空间转换。

    使用说明文档:

    https://pillow.readthedocs.io/en/3.1.x/index.html

    用法举例:使用ImageFilter增强Pillow中的图像

    from PIL import Image, ImageFilter#Read image

    im = Image.open( 'image.jpg' )#Display image

    im.show()

    from PIL import ImageEnhance

    enh = ImageEnhance.Contrast(im)

    enh.enhance(1.8).show("30% more contrast")

    5. OpenCV-Python

    OpenCV( 开源计算机视觉库,Open Source Computer Vision Library)是计算机视觉应用中使用最广泛的库之一。OpenCV-Python是OpenCV的python API。 OpenCV-Python不仅速度快(因为后台由用C / C ++编写的代码组成),也易于编码和部署(由于前端的Python包装器)。 这使其成为执行计算密集型计算机视觉程序的绝佳选择。

    使用说明文档:

    https://github.com/abidrahmank/OpenCV2-Python-Tutorials

    用法举例:使用Pyramids创建一个名为'Orapple'的新水果的功能

     

    6. SimpleCV

    SimpleCV也是用于构建计算机视觉应用程序的开源框架。 通过它可以访问如OpenCV等高性能的计算机视觉库,而无需首先了解位深度、文件格式或色彩空间等。学习难度远远小于OpenCV,并且正如他们的标语所说,“ 它使计算机视觉变得简单 ”。支持SimpleCV的一些观点是:

    即使是初学者也可以编写简单的机器视觉测试

    摄像机、视频文件、图像和视频流都可以交互操作

    使用说明文档:

    https://simplecv.readthedocs.io/en/latest/

    用法举例

     

    7. Mahotas

    Mahotas是另一个用于Python的计算机视觉和图像处理库。 它包含传统的图像处理功能(如滤波和形态学操作)以及用于特征计算的更现代的计算机视觉功能(包括兴趣点检测和局部描述符)。 该接口使用Python,适用于快速开发,但算法是用C ++实现的,并且针对速度进行了优化。Mahotas库运行很快,它的代码很简单,(对其它库的)依赖性也很小。 建议阅读他们的官方文档以了解更多内容。

    使用说明文档:

    https://mahotas.readthedocs.io/en/latest/install.html

    用法举例

    Mahotas库使用简单的代码来完成工作。 对于“ 寻找Wally ”的问题,Mahotas完成的得很好,而且代码量非常小。

    8. SimpleITK

    ITK(Insight Segmentation and Registration Toolkit)是一个开源的跨平台系统,为开发人员提供了一整套用于图像分析的软件工具。 其中, SimpleITK是一个建立在ITK之上的简化层,旨在促进其在快速原型设计、教育以及脚本语言中的使用。SimpleITK是一个包含大量组件的图像分析工具包,支持一般的过滤操作、图像分割和配准。 SimpleITK本身是用C++编写的,但可用于包括Python在内的大量编程语言。

    使用说明文档:

    https://github.com/hhatto/pgmagick

    这里有大量说明了如何使用SimpleITK进行教育和研究活动的Jupyter notebook。notebook中演示了如何使用SimpleITK进行使用Python和R编程语言的交互式图像分析。

    用法举例

    下面的动画是使用SimpleITK和Python创建的可视化的严格CT / MR配准过程。

     

    9. pgmagick

    pgmagick是GraphicsMagick库基于Python的包装器。GraphicsMagick 图像处理系统有时被称为图像处理的瑞士军刀。它提供了强大而高效的工具和库集合,支持超过88种主要格式图像的读取、写入和操作,包括DPX,GIF,JPEG,JPEG-2000,PNG,PDF,PNM和TIFF等重要格式。

    使用说明文档:

    https://github.com/hhatto/pgmagick

    用法举例:图片缩放、边缘提取

     

    图片缩放

     

    边缘提取

    10. Pycairo

    Pycairo是图形库cairo的一组python绑定。 Cairo是一个用于绘制矢量图形的2D图形库。 矢量图形很有趣,因为它们在调整大小或进行变换时不会降低清晰度。Pycairo库可以从Python调用cairo命令。

    使用说明文档:

    https://github.com/pygobject/pycairo

    用法:Pycairo可以绘制线条、基本形状和径向渐变

     

    以上就是一些免费的优秀图像处理Python库。有些很知名,你可能已经知道或者用过,有些可能对你来说还是新的。那正好现在就上手操作一下,试一试吧

    展开全文
  • Py之Scipy:Python库之Scipy库的简介、安装、使用方法详细攻略 目录 Scipy库的简介 Scipy库的安装 Scipy库的使用方法 Scipy库的简介 Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控...

    Py之Scipy:Python库之Scipy库的简介、安装、使用方法详细攻略

     

     

     

    目录

    Scipy库的简介

    Scipy库的安装

    Scipy库的使用方法

    1、Scipy库的子包

    1.1、子包导入方法

    1.2、常见的子包


     

     

    Scipy库的简介

          Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算、统计分析,所以可以说是基于Numpy之上了。Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法等等。SciPy则是在NumPy的基础上构建的更为强大,应用领域也更为广泛的科学计算包。正是出于这个原因,SciPy需要依赖NumPy的支持进行安装和运行。

          Scipy是世界上著名的Python开源科学计算库,建立在Numpy之上。它增加的功能包括数值积分、最优化、统计和一些专用函数。 SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。
          Scipy是基于Numpy构建的一个集成了多种数学算法和方便的函数的Python模块。通过给用户提供一些高层的命令和类,SciPy在python交互式会话中,大大增加了操作和可视化数据的能力。通过SciPy,Python的交互式会话变成了一个数据处理和一个system-prototyping环境,足以和MATLAB,IDL,Octave,R-Lab,以及SciLab抗衡。   更重要的是,在Python中使用SciPy,还可以同时用一门强大的语言————Python来开发复杂和专业的程序。用SciPy写科学应用,还能获得世界各地的开发者开发的模块的帮助。从并行程序到web到数据库子例程到各种类,都已经有可用的给Python程序员了。这些强大的功能,SciPy都有,特别是它的数学库。
          Scipy是在Python的NumPy扩展上构建的数学算法和方便函数的集合。它通过为用户提供高级命令和类来操作和可视化数据,为交互式Python会话添加了强大的功能。有了SciPy,交互式Python会话就变成了一个数据处理和系统原型环境,可以与MATLAB、IDL、Octave、R-Lab和SciLab等系统相匹敌。
          以Python为基础的SciPy的另一个好处是,它还提供了一种强大的编程语言,可用于开发复杂的程序和专门的应用程序。使用SciPy的科学应用程序受益于世界各地的开发人员在软件领域的许多小众领域中开发的附加模块。从并行编程到web和数据库的子例程和类,Python程序员都可以使用。除了SciPy中的数学库之外,所有这些功能都是可用的

     

    scipy
    scipy.org
    Numpy:Python之numpy库简介、安装、使用方法之详细攻略


     

    Scipy库的安装

    pip install scipy

    哈哈,安装成功,大功告成!继续学习去啦!

     

    升级阶段
    先pip install numpy-1.15.0rc1+mkl-cp36-cp36m-win_amd64.whl
    再pip install scipy==0.19.1

    继续更新版本

     

     

    继续降低版本180704  1154

     

    Scipy库的使用方法

    1、Scipy库的子包

    1.1、子包导入方法

    from scipy import linalg, optimize

     

    1.2、常见的子包

    Subpackage

    Description

    cluster

    Clustering algorithms

    聚类算法在信息理论、目标检测、通信、压缩等领域有着广泛的应用。vq模块只支持矢量量化和k-均值算法。

    constants

    Physical and mathematical constants

    fftpack

    Fast Fourier Transform routines

    integrate

    Integration and ordinary differential equation solvers

    interpolate

    Interpolation and smoothing splines

    此子包包含样条函数和类、一维和多维(单变量和多变量)插值类、Lagrange和Taylor多项式插值器以及FITPACK和DFITPACK函数的包装器。

    io

    Input and Output

    linalg

    Linear algebra

    ndimage

    N-dimensional image processing

    odr

    Orthogonal distance regression

    optimize

    Optimization and root-finding routines

    signal

    Signal processing

    sparse

    Sparse matrices and associated routines

    spatial

    Spatial data structures and algorithms

    special

    Special functions

    stats

    Statistical distributions and functions

    该模块包含大量的概率分布以及不断增长的统计函数库。每个单变量分布都是rv_连续(rv_离散用于离散分布)的一个子类的实例。

     

     

     

     

     

     

     

     

     

    展开全文
  • scipy-图像操作

    2017-10-27 16:05:11
    1、https://docs.scipy.org/doc/scipy/reference/ndimage.html#module-scipy.ndimage 2、http://scipy-lectures.github.com/advanced/image_processing/index.html 3、http://blog.csdn.net/zt_706/article/detai

    参考:
    1、https://docs.scipy.org/doc/scipy/reference/ndimage.html#module-scipy.ndimage
    2、http://scipy-lectures.github.com/advanced/image_processing/index.html
    3、http://blog.csdn.net/zt_706/article/details/11476433

    这个教程中使用的工具:

    from scipy import ndimage
    • 一些例子用到了使用np.array的特殊的工具箱:
      • Scikit Image
      • scikit-learn

    图像中的常见问题有:

    • 输入/输出:呈现图像
    • 基本操作:裁剪、翻转、旋转、比例缩放……
    • 图像滤镜:消噪,锐化
    • 图像分割:不同对应对象的像素标记

    更有力和完整的模块:

    • OpenCV (Python绑定)
    • CellProfiler
    • ITK,Python绑定
    • 更多……

    1、打开和读写图像文件

    将一个数组写入文件:

    In [1]: from scipy import misc
    
    In [2]: l = misc.lena()
    
    In [3]: misc.imsave('lena.png', l)  # uses the Image module (PIL)
    
    In [4]: import pylab as pl
    
    In [5]: pl.imshow(l)
    Out[5]: <matplotlib.image.AxesImage at 0x4118110>

    从一个图像文件创建数组:

    import matplotlib.pyplot as plt
    from scipy import misc
    import pylab as pl
    
    img1=misc.imread('Lenna.png',mode='L')
    img2=misc.imread('Lenna.png',mode='RGB')
    img3=misc.imread('Lenna.png',mode='RGBA')
    
    pl.imshow(img2,cmap='gray')
    pl.show()
    misc.imsave('lena.png',img2) # 保存
    # pl可以使用plt替换

    from scipy import ndimage
    
    ndimage.imread('lena.png',mode='L') # 加载灰度图
    ndimage.imread('lena.png', mode='RGB')  # 加载RGB图
    ndimage.imread('lena.png', mode='RGBA')  # 加载RGBA图

    打开一个raw文件(相机, 3-D图像)

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import numpy as np
    import pylab as pl
    
    img=misc.imread('Lenna.png',mode='L')
    # print(img.dtype) # uint8
    
    img.tofile('lena.raw') # 创建一个raw文件
    
    lena_from_raw = np.fromfile('lena.raw',np.uint8) # 加载 lena.raw 文件
    
    print(lena_from_raw.shape)
    
    # lena_from_raw=np.reshape(lena_from_raw,[512,512])
    lena_from_raw.shape = (512, 512)
    
    pl.imshow(lena_from_raw,cmap='gray')
    pl.show()
    
    import os
    
    os.remove('lena.raw') # 删除文件

    对于大数据,使用np.memmap进行内存映射:

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import numpy as np
    import pylab as pl
    
    img=misc.imread('Lenna.png',mode='RGB')
    # print(img.dtype) # uint8
    
    img.tofile('lena.raw') # 创建一个raw文件 保存成raw文件
    
    lena_memmap = np.memmap('lena.raw', dtype=np.uint8, shape=(512,512,3)) # 加载raw文件
    
    pl.imshow(lena_memmap,cmap='gray')
    pl.show()
    
    import os
    
    os.remove('lena.raw') # 删除文件

    批量处理图像文件:

    In [22]: for i in range(10):
       ....:     im = np.random.random_integers(0, 255, 10000).reshape((100, 100))
       ....:     misc.imsave('random_%02d.png' % i, im)
       ....:     
    
    In [23]: from glob import glob
    
    In [24]: filelist = glob('random*.png')
    
    In [25]: filelist.sort()

    2、呈现图像

    使用matplotlibimshow将图像呈现在matplotlib图像(figure)中:

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import numpy as np
    import pylab as pl
    import matplotlib.pyplot as plt
    
    img=misc.imread('Lenna.png',mode='L')
    
    plt.imshow(img,cmap=plt.cm.gray)
    plt.imshow(img, cmap='gray', vmin=30, vmax=200) # 设置最大最小之增加对比
    # 更好地观察强度变化,使用interpolate=‘nearest’
    plt.imshow(img[200:220, 200:220], cmap=plt.cm.gray, interpolation='nearest')
    plt.axis('off')  # 移除axes和ticks
    plt.contour(img, [60, 211])  # 绘制等高线
    
    plt.show()
    
    # ---将plt换成pl-----------------------------------------------------------------
    
    pl.imshow(img,cmap=plt.cm.gray)
    pl.imshow(img, cmap='gray', vmin=30, vmax=200) # 设置最大最小之增加对比
    # 更好地观察强度变化,使用interpolate=‘nearest’
    pl.imshow(img[200:220, 200:220], cmap=pl.cm.gray, interpolation='nearest')
    pl.axis('off')  # 移除axes和ticks
    pl.contour(img, [60, 211])  # 绘制等高线
    
    pl.show()

    其它包有时使用图形工具箱来可视化(GTK,Qt)

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import numpy as np
    import skimage.io as im_io
    
    img=misc.imread('Lenna.png',mode='L')
    
    im_io.use_plugin('gtk', 'imshow')
    
    im_io.imshow(img)
    
    im_io.show()

    3-D可视化:Mayavi

    参见可用Mayavi进行3-D绘图和体积数据

    • 图形平面工具
    • 等值面
    • ……

    3、基本操作

    图像是数组(numpy array)。

    >>> lena = misc.lena()
    >>> lena[0, 40]
    166
    >>> # Slicing
    >>> lena[10:13, 20:23]
    array([[158, 156, 157],
    [157, 155, 155],
    [157, 157, 158]])
    >>> lena[100:120] = 255
    >>>
    >>> lx, ly = lena.shape
    >>> X, Y = np.ogrid[0:lx, 0:ly]
    >>> mask = (X - lx/2)**2 + (Y - ly/2)**2 > lx*ly/4
    >>> # Masks
    >>> lena[mask] = 0
    >>> # Fancy indexing
    >>> lena[range(400), range(400)] = 255

    统计信息

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import numpy as np
    import pylab as pl
    import matplotlib.pyplot as plt
    import cv2
    
    lena=misc.imread('Lenna.png',mode='L') # 数据类型 numpy array
    lena.mean() # 平均值
    lena.max() # 最大值
    lena.min() # 最小值
    
    # 图像直方图
    # 1、使用np.histogram
    hist, bins = np.histogram(lena.ravel(), bins=256, range=[0,256],normed=True)
    plt.plot(hist)
    plt.legend(loc='best')
    plt.show()
    
    # 2、使用plt.hist
    plt.hist(lena.ravel(),256,[0,256]); plt.show()
    
    # 3、使用opencv
    hist_full = cv2.calcHist([lena],[0],None,[256],[0,256])
    plt.plot(hist_full)
    plt.xlim([0,256])
    plt.show()

    几何转换

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import numpy as np
    import scipy
    import pylab as pl
    import matplotlib.pyplot as plt
    import cv2
    
    lena=misc.imread('Lenna.png',mode='L') # 数据类型 numpy array
    lx, ly = lena.shape
    
    # 裁剪
    crop_lena = lena[lx/4:-lx/4, ly/4:-ly/4]
    
    # 上下翻转
    flip_ud_lena = np.flipud(lena)
    
    # 左右翻转
    flip_lr_lena = np.fliplr(lena)
    
    # 任意角度旋转
    rotate_lena = ndimage.rotate(lena, 45)
    rotate_lena_noreshape = ndimage.rotate(lena, 45, reshape=False) # 不改变原图大小
    
    # 任意缩放
    zoomed_lena = ndimage.zoom(lena, 2) # 放大2倍
    zoomed_lena2 = ndimage.zoom(lena, 0.5) # 缩小1/2倍

    4、图像滤镜

    局部滤镜
    :用相邻像素值的函数替代当前像素的值。

    相邻:方形(指定大小),圆形, 或者更多复杂的结构元素。

    模糊/平滑

    scipy.ndimage中的高斯滤镜:

    >>> from scipy import misc
    >>> from scipy import ndimage
    >>> lena = misc.lena()
    >>> blurred_lena = ndimage.gaussian_filter(lena, sigma=3)
    >>> very_blurred = ndimage.gaussian_filter(lena, sigma=5)

    均匀滤镜

    >>> local_mean = ndimage.uniform_filter(lena, size=11)

    锐化

    锐化模糊图像:

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import pylab as pl
    from scipy import ndimage
    
    
    lena=misc.imread('Lenna.png',mode='L') # 数据类型 numpy array
    
    # 锐化模糊图像
    blurred_l = ndimage.gaussian_filter(lena, 3)
    
    # 通过增加拉普拉斯近似增加边缘权重
    filter_blurred_l = ndimage.gaussian_filter(blurred_l, 1)
    alpha = 30
    sharpened = blurred_l + alpha * (blurred_l - filter_blurred_l)
    
    pl.subplot(131),pl.imshow(blurred_l,cmap='gray'),pl.axis('off'),pl.title('blurred_l')
    pl.subplot(132),pl.imshow(filter_blurred_l,cmap='gray'),pl.axis('off'),pl.title('filter_blurred_l')
    pl.subplot(133),pl.imshow(sharpened,cmap='gray'),pl.axis('off'),pl.title('sharpened')
    
    pl.show()
    

    消噪

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import pylab as pl
    from scipy import ndimage
    import numpy as np
    
    lena=misc.imread('Lenna.png',mode='L') # 数据类型 numpy array
    
    # 向lena增加噪声
    l = lena[230:310, 210:350]
    noisy = l + 0.4*l.std()*np.random.random(l.shape)
    
    # 高斯滤镜平滑掉噪声……还有边缘
    gauss_denoised = ndimage.gaussian_filter(noisy, 2)
    
    # 大多局部线性各向同性滤镜都模糊图像(ndimage.uniform_filter)
    unif_denoised=ndimage.uniform_filter(noisy,2)
    
    # 中值滤镜更好地保留边缘
    med_denoised = ndimage.median_filter(noisy, 3)
    
    pl.subplot(141),pl.imshow(noisy,cmap='gray'),pl.axis('off'),pl.title('noisy')
    pl.subplot(142),pl.imshow(gauss_denoised,cmap='gray'),pl.axis('off'),pl.title('gauss_denoised')
    pl.subplot(143),pl.imshow(unif_denoised,cmap='gray'),pl.axis('off'),pl.title('unif_denoised')
    pl.subplot(144),pl.imshow(med_denoised,cmap='gray'),pl.axis('off'),pl.title('med_denoised')
    
    pl.show()

    去噪效果对比

    其它排序滤波器:
    ndimage.maximum_filter,ndimage.percentile_filter

    其它局部非线性滤波器:
    维纳滤波器(scipy.signal.wiener)等

    非局部滤波器

    总变差(TV)消噪。找到新的图像让图像的总变差(正态L1梯度的积分)变得最小,当接近测量图像时

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    from scipy import misc
    import pylab as pl
    from scipy import ndimage
    import numpy as np
    # from skimage.filter import denoise_tv_bregman,denoise_tv_chambolle
    from skimage.restoration import denoise_tv_bregman,denoise_tv_chambolle
    
    
    lena=misc.imread('Lenna.png',mode='L') # 数据类型 numpy array
    
    # 向lena增加噪声
    l = lena[230:310, 210:350]
    noisy = l + 0.4*l.std()*np.random.random(l.shape)
    
    tv_denoised_b = denoise_tv_bregman(noisy, weight=10)
    tv_denoised_c = denoise_tv_chambolle(noisy, weight=10)
    
    ax=pl.figure()
    ax.add_subplot(131),pl.imshow(noisy,cmap='gray'),pl.axis('off'),pl.title('noisy')
    pl.show()
    
    
    # pl.subplot(131),pl.imshow(noisy,cmap='gray'),pl.axis('off'),pl.title('noisy')
    # pl.subplot(132),pl.imshow(tv_denoised_b,cmap='gray'),pl.axis('off'),pl.title('tv_denoised_b')
    # pl.subplot(133),pl.imshow(tv_denoised_c,cmap='gray'),pl.axis('off'),pl.title('tv_denoised_c')
    #
    # pl.show()
    

    5、数学形态学

    结构元素

    >>> el = ndimage.generate_binary_structure(2, 1)
    >>> el
    array([[False,  True, False],
           [ True,  True,  True],
           [False,  True, False]], dtype=bool)
    >>> el.astype(np.int)
    array([[0, 1, 0],
           [1, 1, 1],
           [0, 1, 0]])

    腐蚀 = 最小化滤镜。用结构元素覆盖的像素的最小值替代一个像素值:

    >>> a = np.zeros((7,7), dtype=np.int)
    >>> a[1:6, 2:5] = 1
    >>> a
    array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])
    >>> ndimage.binary_erosion(a).astype(a.dtype)
    array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 1, 0, 0, 0],
           [0, 0, 0, 1, 0, 0, 0],
           [0, 0, 0, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])
    >>> #Erosion removes objects smaller than the structure
    >>> ndimage.binary_erosion(a, structure=np.ones((5,5))).astype(a.dtype)
    array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])

    膨胀:最大化滤镜:

    >>> a = np.zeros((5, 5))
    >>> a[2, 2] = 1
    >>> a
    array([[ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.]])
    >>> ndimage.binary_dilation(a).astype(a.dtype)
    array([[ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  1.,  1.,  1.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.]])

    对灰度值图像也有效

    >>> np.random.seed(2)
    >>> x, y = (63*np.random.random((2, 8))).astype(np.int)
    >>> im[x, y] = np.arange(8)
    
    >>> bigger_points = ndimage.grey_dilation(im, size=(5, 5), structure=np.ones((5, 5)))
    
    >>> square = np.zeros((16, 16))
    >>> square[4:-4, 4:-4] = 1
    >>> dist = ndimage.distance_transform_bf(square)
    >>> dilate_dist = ndimage.grey_dilation(dist, size=(3, 3), \
    ...         structure=np.ones((3, 3)))

    开操作:腐蚀+膨胀
    应用:移除噪声

    >>> square = np.zeros((32, 32))
    >>> square[10:-10, 10:-10] = 1
    >>> np.random.seed(2)
    >>> x, y = (32*np.random.random((2, 20))).astype(np.int)
    >>> square[x, y] = 1
    
    >>> open_square = ndimage.binary_opening(square)
    
    >>> eroded_square = ndimage.binary_erosion(square)
    >>> reconstruction = ndimage.binary_propagation(eroded_square, mask=square)

    这里写图片描述

    示例代码

    闭操作:膨胀+腐蚀

    许多其它数学分形:击中(hit)和击不中(miss)变换,tophat等等。

    6、特征提取

    边缘检测

    使用梯度操作(Sobel)来找到搞强度的变化
    这里写图片描述

    示例源码

    canny滤镜

    Canny滤镜可以从skimage中获取(文档)

    >>> #from skimage.filter import canny
    >>> #or use module shipped with tutorial
    >>> im += 0.1*np.random.random(im.shape)
    >>> edges = canny(im, 1, 0.4, 0.2) # not enough smoothing
    >>> edges = canny(im, 3, 0.3, 0.2) # better parameters

    这里写图片描述

    示例代码

    分割

    基于直方图的分割(没有空间信息)

     >>> n = 10
      >>> l = 256
      >>> im = np.zeros((l, l))
      >>> np.random.seed(1)
      >>> points = l*np.random.random((2, n**2))
      >>> im[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
      >>> im = ndimage.gaussian_filter(im, sigma=l/(4.*n))
    
      >>> mask = (im > im.mean()).astype(np.float)
      >>> mask += 0.1 * im
      >>> img = mask + 0.2*np.random.randn(*mask.shape)
    
      >>> hist, bin_edges = np.histogram(img, bins=60)
      >>> bin_centers = 0.5*(bin_edges[:-1] + bin_edges[1:])
    
      >>> binary_img = img > 0.5

    这里写图片描述

    示例代码

    自动阈值:使用高斯混合模型

    >>> mask = (im > im.mean()).astype(np.float)
    >>> mask += 0.1 * im
    >>> img = mask + 0.3*np.random.randn(*mask.shape)
    
    >>> from sklearn.mixture import GMM
    >>> classif = GMM(n_components=2)
    >>> classif.fit(img.reshape((img.size, 1))) 
    GMM(...)
    
    >>> classif.means_
    array([[ 0.9353155 ],
           [-0.02966039]])
    >>> np.sqrt(classif.covars_).ravel()
    array([ 0.35074631,  0.28225327])
    >>> classif.weights_
    array([ 0.40989799,  0.59010201])
    >>> threshold = np.mean(classif.means_)
    >>> binary_img = img > threshold

    这里写图片描述

    使用数学形态学来清理结果:

    >>> # Remove small white regions
    >>> open_img = ndimage.binary_opening(binary_img)
    >>> # Remove small black hole
    >>> close_img = ndimage.binary_closing(open_img)

    这里写图片描述

    示例源码

    其他略

    参考:http://scipy-lectures.github.com/advanced/image_processing/index.html

    展开全文
  • from scipy.misc import imread / imsave / imshow imresize / imrotate / imfilter ...1. scipy.misc 下的图像处理 from scipy.misc import imread, imresize, imsave I = imread('./cat....

    from scipy.misc import
    imread / imsave / imshow
    imresize / imrotate / imfilter

    1. scipy.misc 下的图像处理

    from scipy.misc import imread, imresize, imsave
    I = imread('./cat.jpg')
    I_tinted = I * (1, .95, .9)
    I_tinted = imresize(I_tinted, (300, 300))
                    # print(I_tinted.shape)
    imsave('./figs/cat_tinted.jpg', I_tinted)
    • imread():返回的是 numpy.ndarray 也即 numpy 下的多维数组对象;
    • I_tinted = imresize(I_tinted, (300, 300)),经过 imresize 操作得到的 I_tinted 仍然是 3 维的彩色信息(I_tinted.shape ⇒ (300, 300, 3));

    若想显示图像,则一般使用 matplotlib 下的 相关函数:

    import matplotlib.pyplot as plt
    plt.subplot(1, 2, 1)
    plt.imshow(I)
    plt.subplot(1, 2, 2)
    plt.imshow(I_tinted)
    plt.axis('off')
    plt.show()

    2. scipy.ndimage

    3. matplotlib 下的图像处理

    • 改变颜色空间:matplotlib.colors.rgb_to_hsv:
      • 注意接收的参数必须在 [0, 1] 区间内;
      • 返回值也是 [0, 1] 区间内;

    转载于:https://www.cnblogs.com/mtcnn/p/9422204.html

    展开全文
  • Scipy库(win下安装)

    2017-03-19 13:56:05
    Scipy库 SciPy 库建立在 Numpy 库之上,提供了大量科学算法Document特殊函数 (scipy.special) 积分 (scipy.integrate) 最优化 (scipy.optimize) 插值 (scipy.interpolate) 傅立叶变换 (scipy.fftpack) 信号处理 ...
  • 一 代码 ...from scipy import signal, misc import matplotlib.pyplot as plt image = misc.ascent() w = signal.gaussian(50,10.0) image_new = signal.sepfir2d(image, w, w) plt.fig
  • Scipy提供了真正的矩阵,以及大量基于矩阵运算的对象与函数,功能包含最优化,线性代数,积分,插值,拟合,特殊函数,快速傅里叶变换,信号处理和图像处理,常微分方程求解等,Scipy依赖于Numpy,因此安装Scipy时...
  • python中的scipy库

    2017-11-29 13:38:25
    Scipy建立在Numpy的基础之上,用于数值运算.具有很多搞笑操作,如数值积分、优化、统计、信号处理,以及图像处理功能。
  • python之scipy库详解

    2020-05-11 16:45:04
    Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。 ...
  • SciPy库主要功能

    2016-10-16 12:56:08
    scipy 基类 bool8类型 byte类型 intN 运行时Warning 计算平台限制 numpy相关数学函数 scipy.io 导入导出matlab文件 导入图像 scipy.linalg 线性代数: 矩阵求逆 分解 行列式 scipy.special 特殊函数: 贝塞尔 椭圆...
  • SciPy-数值计算

    2017-04-26 17:09:09
    例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。由于其涉及的领域众多、本书没有能力对其一一的进行介绍。作为入门介绍,让我们看看如何用SciPy进行插值处理、信号滤波以及用C语言加速计算。...
  • 机器学习之Scipy库

    2018-10-17 21:31:01
    它包括统计、优化、涉及线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等众多数学包。 1.2 代表性函数使用介绍 1.最优化 (1)数据建模和拟合 SciPy函数curve_fit使用基于卡方的方法进行线性回归...
  • python:Scipy库

    2019-09-30 10:37:48
    Scipy库的简介 Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算、统计分析,所以可以说是基于Numpy之上了。Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法等等...
  • 003 Scipy库简介

    2019-01-13 23:08:54
    参考文档补充原本的文档: ... Scipy库是基于python生态的一款开源数值计算,科学与工程应用的开源软件,包括常用的NumPy,pandas,matplotlib等库。  https://www.scipy.org/:     2.介绍  SciPy是一...
  • Scipy库的简介 Scipy库的安装 Scipy库的简介 Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算、统计分析,所以可以说是基于Numpy之上了。Scipy有很多子模块可以应对不同的...
  • scipy库numpy常用方法

    2018-11-19 20:50:19
    它是一个由多维数组对象和用于处理数组的例程集合组成的。 Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 ...
  • SciPy快速入门教程

    2017-11-26 12:58:58
    python在科学计算领域有三个非常受欢迎,numpy、SciPy、matplotlib。numpy是一个高性能的多维数组的计算SciPy是构建在numpy的基础之上的,它提供了许多的操作numpy的数组的函数。SciPy是一款方便、易于使用、...
  • 一、Scipy库简介 1、简介 Scipy库是基于Python生态的一款开源数值计算、科学与工程应用的开源软件,主要包括NumPy、Scipy、pandas、matplotlib等等。(官方文档:https://scipy.org/) 2、numPy、Scipy、pandas、...
  • 1.安装numpy NumPy使用Python进行科学计算,尤其是数据分析时,所用到的一个基础。它是大量Python数学和科学计算包的基础,比如我们后面会讲到的pandas就用到了NumPy。pandas专门用于数据分析,充分借鉴...
1 2 3 4 5 ... 20
收藏数 7,860
精华内容 3,144