使用 Scipy 在 Python 中进行多维图像处理

2025年3月17日 | 阅读 12 分钟

引言

在本文中,我们将讨论在 Python 中使用 Scipy 进行多维图像处理。SciPy 是一个用于科学和技术计算的 Python 库。它建立在 NumPy 之上,NumPy 是一个用于非专业数值计算的库。它提供了许多用于处理数组、数值优化、信号处理和科学计算中其他常见任务的函数。图像处理和分析通常被视为对二维值数组的操作。有几个领域需要分析更高维度的图像。这些示例包括科学成像和生物成像。NumPy 由于其固有的多维性质,非常适合这种类型的程序。scipy.ndimage 程序提供了一些标准图像处理和分析功能,这些功能旨在处理任意维度的数组。这些程序目前包括用于线性滤波和非线性滤波、二值形态学、B 样条插值和对象测量的功能。

图像处理是计算机科学领域,处理图像的操纵、分析和解释。在图像处理中,多维图像是具有额外维度的图像。这可以包括具有多个颜色通道(例如,彩色图像中的红色、绿色和蓝色通道)的图像、具有多个时间点(例如,视频)的图像以及具有多个空间维度(例如,3D 医学成像检查)的图像。

SciPy 提供了几个用于处理多维图像的功能,包括用于读取和写入图像、图像过滤、图像变形和图像分割的功能。“scipy.ndimage”是 SciPy 库中的一个模块,提供多维图像处理功能。它建立在 NumPy 之上,NumPy 是一个用于高效数值计算的库,并提供了许多用于处理数组的功能,包括图像处理功能。由于可以进行大量操作,因此该文章涵盖了一些基本操作。

  • 图像过滤:我们可以使用 scipy.ndimage.Filters 模块应用多种类型的图像过滤器,包括中值、高斯和 Sobel 过滤器。
  • 图像插值:我们可以使用 scipy.ndimage.Interpreter 模块使用各种插值技术(包括最近邻、线性插值和三次插值)扭曲图像。
  • 图像分割:我们可以使用 scipy.ndimage.measurements 模块执行图像分割任务,查找相关组件,并标记图像中的对象。
  • 图像操纵:我们可以使用 scipy.ndimage.morphology 模块执行图像操纵任务,例如腐蚀、膨胀以及开运算和闭运算。
  • 使用 SciPy 过滤图像:在图像处理中,过滤器是对图像执行的数学操作,以修改其外观或提取特定特征。过滤器可用于平滑、锐化、增强边缘、去除噪声等任务。图像处理中可以应用多种类型的过滤器,包括线性、非线性插值和形态学过滤器。线性过滤器应用输入图像像素的线性组合来生成输出图像,而非线性过滤器应用输入图像像素的非线性函数。形态学过滤器是一种基于图像像素形状或结构的非线性过滤器。

scipy.ndimage 模块提供了几种用于平滑、抛光和边缘检测任务的集体过滤功能。以下是 scipy.ndimage 提供的一些过滤功能的示例

  • 拉普拉斯过滤器:我们可以使用 scipy.ndimage.filters.laplace 函数在图像中应用拉普拉斯过滤器,这是一种二阶导数过滤器,可用于检测图像中的边缘和角点。
  • Prewitt 过滤器:Prewitt 过滤器是一种点检测过滤器,类似于 Sobel 过滤器。它计算图像强度的梯度并增强图像中的边缘以确定强度快速变化的区域。我们可以使用 scipy.ndimage.filters.prewitt 函数对图像应用 Prewitt 过滤器。
  • 中值过滤器:我们可以使用 scipy.ndimage.filters.median_filter 函数对图像应用中值过滤器,这可用于从图像中去除噪声。
  • 高斯过滤器:我们可以使用 scipy.ndimage.filters.gaussian_filter 函数对图像应用高斯过滤器,这可用于平滑图像或减少噪声。
  • Sobel 过滤器:我们可以使用 scipy.ndimage.filters.sobel 函数对图像应用 Sobel 过滤器,这是一种边缘检测过滤器,可增强图像中的边缘。

过滤函数的语法和参数

1. 拉普拉斯过滤器

语法

拉普拉斯过滤器的语法如下 -

参数

拉普拉斯过滤器的参数为 -

您可以使用 size 参数指定过滤器的大小。这可以是一个标量或一个整数元组。例如,size 3 应用 3×3 拉普拉斯过滤器,size (3, 5) 应用 3×5 拉普拉斯过滤器。

2. Prewitt 过滤器

语法

参数

Prewitt 过滤器的参数为 -

如果 axis 设置为 0 水平,1 垂直,您可以选择过滤器的方向。order 参数具有 0 用于平滑、1 用于一阶导数和 2 用于二阶导数的选项,可以帮助您选择导数的阶数。Mode 参数具有 reflecting、Wrap 和 regular 等选项,描述了图像边缘的处理方式。

3. 中值过滤器

语法

中值过滤器的语法如下 -

参数

size 参数指定过滤器的大小。这可以是一个标量或一个整数元组。例如,长度 3 应用 3×3 中值过滤器,长度 (3, 5) 应用 3×5 中值过滤器。footprint 参数允许您指定过滤器的布局。这可以是一个布尔数组或一系列索引。Mode 参数指定如何处理照片边缘以及使用 reflect、Wrap 和 regular 等替代方案。

4. 高斯过滤器

语法

高斯过滤器的语法如下 -

参数

sigma 参数指定高斯函数的标准差,它决定了在图像中应用的平滑量。order 参数允许您指定要应用的导数阶数,选项包括 0 用于平滑、1 用于一阶导数以及多个用于二阶导数。

5. Sobel 过滤器

语法

Sobel 过滤器的语法如下 -

参数

Sobel 过滤器的参数为 -

您可以使用 axis 参数指定过滤器的方向。0 是水平,1 是垂直。

所有功能共享的属性

所有函数共享一些不常见的属性。值得注意的是,所有函数都允许使用 output 参数指定输出数组。使用此参数,您可以指定一个数组,该数组可以就地修改为操作的结果。在这种情况下,结果不会减少。通常,使用 output 参数效率更高,因为使用现有数组来保存结果。返回的数组依赖于操作的形状,但其距离通常与输入的形状相同。如果使用 output 参数,则结果的类型与指定 output 参数的类型相同。如果没有给出 output 参数,即使可以指定输出结果,它也远非如此。这是通过将所需的 numpy 类型对象分配给 output 参数来完成的。例如

程序代码

这里我们给出一个 Python 代码示例。代码如下 -

结果

现在我们编译并运行上面的代码。然后结果如下 -

array([  0,  10,  26,  41,  57,  72,  88, 103, 119, 134, 150, 165, 181,196, 212, 227, 243, 258, 274, 289])

程序代码

这里我们给出一个示例片段,展示了所有过滤器在 Python 代码中的实现。代码如下 -

结果

现在我们编译并运行上面的代码。然后输出如下 -

Multidimensional image processing using Scipy in Python

使用 SciPy 进行图像插值

图像插值根据周围像素的值估算图像中像素的值。图像插值通常用于图像大小调整和图像失真校正。有几种可用于图像处理的插值技术,包括最近邻插值、双线性插值和双三次插值。插值技术的选择会影响结果图像的质量和平滑度,以及插值过程的计算复杂性。

以下是 scipy.ndimage 提供的不同类型的插值变换。

  • 移位:允许您将图像按指定量移位。这对于比较略微错位的图像(例如图像对齐和图像分析)非常有用。

    旋转:您可以将图像按指定量旋转。这对于比较略微错位的图像(例如图像对齐和图像分析)非常有用。

  • 仿射变换:仿射变换是保持直线性和平行性的线性变换。这是一种可用于旋转、缩放、移动或倾斜图像的变换。
  • 缩放:缩放功能允许您通过插值像素值来放大或缩小图像。这对于调整图像大小和以不同比例检查图像(例如图像大小调整和图像分析)非常有用。
  • 样条过滤器:样条过滤器是一种平滑过滤器,它使用样条函数将曲线拟合到图像中的像素值。这对于诸如图像去噪和平滑等任务很有用,旨在减少图像中的噪声或平滑粗糙边缘。

一些插值函数的参数和语法

1. 移位

语法

移位函数的语法如下

参数

移位函数的参数如下

shift 参数指定移位量,作为浮点数元组。第一个元素指定 x 方向上的移位,第二个元素指定 y 方向上的移位。

2. 旋转

语法

旋转函数的语法如下

参数

旋转函数的参数如下

Reshape 是旋转函数的参数。此参数指定是否调整输出图像大小以适应完整的旋转图像。默认情况下,输出图像与输入图像大小相同。

3. 仿射变换

语法

仿射变换函数的语法如下 -

参数

仿射变换函数的参数如下

output_shape、output_center 和 mode - 这是仿射变换函数的三个参数。

output_shape:此参数允许您指定输出图像的大小和形状。必须是整数元组。

output_center:此参数允许您设置输出图像的中心。必须是浮点数元组。

mode:此参数指定如何处理图像的边缘。选项包括复制、环绕和常量。

4. 缩放

语法

缩放函数的语法如下 -

参数

缩放函数的参数如下

zoom 参数指定一个缩放因子,它可以是一个标量或一个浮点数元组。例如,缩放因子为 2 会使图像大小加倍,缩放因子为 (2, 1) 会使宽度加倍,而高度保持不变。

5. 样条过滤器

语法

样条函数的语法如下

参数

样条函数的参数如下

order 是样条函数的参数。此参数允许您指定要应用的插值方法。选项包括 0 用于最近邻插值,1 用于双线性插值,3 用于双三次插值,依此类推。

程序代码

这里我们给出一个示例片段,显示了所有插值技术在 Python 代码中的实现。代码如下 -

输出

现在我们编译并运行上面的代码。然后结果如下 -

Multidimensional image processing using Scipy in Python

使用 SciPy 进行图像分割

图像分割是根据特定标准将图像划分为不同区域或段的过程。它是一种常用于图像处理和计算机视觉应用程序的方法,用于识别和提取图像中的对象或感兴趣区域。

scipy 库的 scipy.ndimage.measurements 模块提供了许多可用于图像分割的功能。这里有一些例子

scipy.ndimage.measurements.variance:此功能允许您计算图像或数组值的方差。

scipy.ndimage.measurements.standard_deviation:此功能允许您计算图像或数组值的标准差。

scipy.ndimage.measurements.mean:此选择允许您计算图像或数组值的平均值。

scipy.ndimage.measurements.label:此功能允许您标记图像中相关的成分。它通常用作分割图像中对象的预处理步骤。

scipy.ndimage.measurements.center_of_mass:此功能允许您计算图像或图像区域的质心。它可用于识别图像中对象的位置。

程序代码

这里我们给出一个示例片段,显示了 Python 代码中标签大小功能的实现。代码如下 -

输出

现在我们编译并运行上面的代码。然后结果如下 -

Multidimensional image processing using Scipy in Python

程序代码

这里我们给出一个示例,展示了 ndimage 库在 Python 代码中提供的其他几种测量功能的实现。代码如下 -

输出

现在我们编译并运行上面的代码。然后结果如下 -

The Minimum pixel value of the image is 0.3333333333333333 on the location (567, 258)
The Maximum pixel value of the image is 254.0 on the location (245, 568)
Mean: 110.16274388631183 
Center of Mass: (356.6752247435916, 469.240201083681) 
Standard Deviation: 54.975712030326186 
Variance: 3022.3289132413515