SciPy - Ndimage
SciPy ndimage 子模块专用于图像处理。此处,ndimage 表示 n 维图像。
图像处理中一些最常见的任务如下 &miuns;
- 输入/输出,显示图像
- 基本操作 − 裁剪、翻转、旋转等。
- 图像过滤 − 去噪、锐化等。
- 图像分割 −标记与不同对象相对应的像素
- 分类
- 特征提取
- 配准
让我们讨论一下如何使用 SciPy 实现其中一些功能。
打开和写入图像文件
SciPy 中的 misc 包 附带一些图像。我们使用这些图像来学习图像处理。让我们考虑以下示例。
from scipy import misc f = misc.face() misc.imsave('face.png', f) # 使用图像模块 (PIL) import matplotlib.pyplot as plt plt.imshow(f) plt.show()
The above program will generate the following output.

任何原始格式的图像都是由矩阵格式的数字表示的颜色组合。机器仅根据这些数字来理解和处理图像。 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 # 裁剪 crop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4] import matplotlib.pyplot as plt plt.imshow(crop_face) plt.show()
上述程序将生成以下输出。

我们还可以执行一些基本操作,例如如下所述将图像上下翻转。
# up <->向下翻转 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() 函数,它可以以指定的角度旋转图像。
# 旋转 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()
上述程序将生成以下输出。

sigma 值以 5 为单位表示模糊程度。我们可以通过调整 sigma 值来查看图像质量的变化。有关模糊的更多详细信息,请单击 → DIP(数字图像处理)教程。
边缘检测
让我们讨论一下边缘检测如何帮助图像处理。
什么是边缘检测?
边缘检测是一种用于查找图像中物体边界的图像处理技术。它通过检测亮度的不连续性来工作。边缘检测用于图像处理、计算机视觉和机器视觉等领域的图像分割和数据提取。
最常用的边缘检测算法包括
- Sobel
- Canny
- Prewitt
- Roberts
- 模糊逻辑方法
让我们考虑以下示例。
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作为 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()
上述程序将生成以下输出。
