SciPy Ndimage SciPy Linalg SciPy优化 SciPy ndimage子模块专用于图像处理。这里,ndimage意味着一个n维图像。 图像处理中一些最常见的任务如下:miuns; 输入/输出,显示图像 基本操作 - 裁剪,翻转,旋转等 图像过滤 - 去噪,锐化等 图像分割 - 标记对应于不同对象的像素 分类 特征提取 注册 让我们讨论一下如何使用SciPy实现其中的一些。 打开和写入图像文件 SciPy中的 misc软件包 附带了一些图像。我们使用这些图像来学习图像操作。让我们考虑下面的例子。 from scipy import misc f = misc.face() misc.imsave('face.png', f) # uses the Image module (PIL) import matplotlib.pyplot as plt plt.imshow(f) plt.show() 上述程序将生成以下输出。 其原始格式的任何图像是由矩阵格式中的数字表示的颜色的组合。机器只能根据这些数字理解和操作图像。RGB是一种流行的表示方式。 让我们看看上面图片的统计信息。 from scipy import misc face = misc.face(gray = False) print face.mean(), face.max(), face.min() 上述程序将生成以下输出。 110.16274388631184, 255, 0 现在,我们知道图像是由数字组成的,所以数字值的任何变化都会改变原始图像。让我们对图像执行一些几何变换。基本的几何操作是裁剪 from scipy import misc face = misc.face(gray = True) lx, ly = face.shape # Cropping crop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4] import matplotlib.pyplot as plt plt.imshow(crop_face) plt.show() 上述程序将生成以下输出。 我们也可以执行一些基本的操作,例如像下面描述的那样颠倒图像。 # up <-> down flip from scipy import misc face = misc.face() flip_ud_face = np.flipud(face) import matplotlib.pyplot as plt plt.imshow(flip_ud_face) plt.show() 上述程序将生成以下输出。 除此之外,我们有 rotate()函数 ,它以指定的角度旋转图像。 # rotation from scipy import misc,ndimage face = misc.face() rotate_face = ndimage.rotate(face, 45) import matplotlib.pyplot as plt plt.imshow(rotate_face) plt.show() 上述程序将生成以下输出。 过滤器 让我们讨论过滤器如何帮助图像处理。 图像处理中的过滤是什么? 过滤是一种修改或增强图像的技术。例如,您可以过滤图像以强调某些功能或删除其他功能。通过滤波实现的图像处理操作包括平滑,锐化和边缘增强。 滤波是一种邻域操作,其中输出图像中任何给定像素的值是通过对相应输入像素的邻域中的像素的值应用某种算法来确定的。现在让我们使用SciPy ndimage执行一些操作。 模糊 模糊广泛用于减少图像中的噪声。我们可以执行过滤操作并查看图像中的更改。让我们考虑下面的例子。 from scipy import misc face = misc.face() blurred_face = ndimage.gaussian_filter(face, sigma=3) import matplotlib.pyplot as plt plt.imshow(blurred_face) plt.show() 上述程序将生成以下输出。 西格玛值表示5级模糊程度。通过调整西格玛值,我们可以看到图像质量的变化。有关模糊的更多详细信息,请单击→DIP(数字图像处理)教程。 边缘检测 让我们讨论边缘检测如何帮助图像处理。 什么是边缘检测? 边缘检测是一种用于查找图像内物体边界的图像处理技术。它通过检测亮度不连续性来工作。边缘检测用于诸如图像处理,计算机视觉和机器视觉等领域的图像分割和数据提取。 最常用的边缘检测算法包括 索贝尔 谨慎的 普鲁伊特 罗伯茨 模糊逻辑方法 让我们考虑下面的例子。 import scipy.ndimage as nd import numpy as np im = np.zeros((256, 256)) im[64:-64, 64:-64] = 1 im[90:-90,90:-90] = 2 im = ndimage.gaussian_filter(im, 8) import matplotlib.pyplot as plt plt.imshow(im) plt.show() 上述程序将生成以下输出。 图像看起来像一个方块的颜色。现在,我们将检测这些彩色块的边缘。这里,ndimage提供了一个叫 Sobel 的功能来执行这个操作。而NumPy提供了 Hypot 函数来将两个合成矩阵合并为一个。 让我们考虑下面的例子。 import scipy.ndimage as nd import matplotlib.pyplot as plt im = np.zeros((256, 256)) im[64:-64, 64:-64] = 1 im[90:-90,90:-90] = 2 im = ndimage.gaussian_filter(im, 8) sx = ndimage.sobel(im, axis = 0, mode = 'constant') sy = ndimage.sobel(im, axis = 1, mode = 'constant') sob = np.hypot(sx, sy) plt.imshow(sob) plt.show() 上述程序将生成以下输出。 SciPy Linalg SciPy优化