迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python Downsample 数组

作者:迹忆客 最近更新:2023/05/11 浏览次数:

本篇文章将讨论在 Python 中对图像进行下采样的方法。


在 Python3 中使用切片对数组进行下采样

在 Python 中,图像是一个多维数组。 灰度图像用 2 维数组表示,而彩色或 RGB 图像用 3 维数组表示。

为了简单起见,本教程将重点关注缩小二维灰度图像的大小,但此处讨论的方法也可用于缩小 RGB 图像的大小。

我们的第一种方法非常简单。 顾名思义,在切片中,我们从整体大图像中取出一小部分。

在切片图像时,我们可以提供一个步骤参数,指定在获取下一个值之前要跳过多少个值。 默认情况下,此值设置为 1。

以下代码示例演示了如何使用数组切片对图像进行下采样。

import numpy as np
b = np.arange(0,100)
c = b.reshape([10,10])
print("Original Array:")
print(c)
print("Downsized Array:")
print(c[::2,::2])

输出:

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

上面的代码将我们原始图像c的尺寸从(10, 10)缩小到(5, 5),存入new_c。

需要注意的重要一点是,此方法从我们最初的 100 个值中选择了 25 个值。 其余值中的信息在此方法中完全丢失。


在 Python 中使用 zoom() 函数对数组进行下采样

ndimage.interpolation.zoom() 函数还用于在 Python 中对图像进行上采样或下采样。 这个函数有两个参数; 需要缩放的原始图像和缩放比例。

这种方法与切片方法非常相似。 它还会跳过中间值,并在下采样时仅从我们的原始图像中选择几个值。

以下代码示例演示了我们如何使用 ndimage.interpolation.zoom() 函数对图像进行下采样。

import numpy as np
from scipy import ndimage

b = np.arange(0,100)
c = b.reshape([10,10])

new_c = ndimage.interpolation.zoom(c, 0.5)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

输出:

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

上面的代码的工作方式与前面的示例相同,将我们的原始图像 c 的大小从 (10, 10) 减小到 (5, 5)。

这种方法优于简单切片,因为它也可用于对图像进行上采样。 我们必须指定一些大于 1 的缩放值。

在下采样时,这种方法是无效的,因为它会跳过许多像素值并只从我们的原始图像中选择一些。 下面介绍一种更有效的方法,通过组合多个像素值来估计新值。


使用 Python 中的 block_reduce() 函数对数组进行下采样

切片和缩放方法都会导致阶梯效应,即使我们对输入图像进行下采样,也会使整个图像模糊。

处理中间值的更好方法是使用它们周围的像素来估计它们。 这可以通过不同的方式完成,例如插值和简单均值。

为了简单起见,我们将使用简单方法。 python 的 skimage.measure 模块中的 block_reduce() 函数用于缩减多维数组的大小。

这个 block_reduce() 函数有 3 个主要参数; 原始数组、块大小和要应用于每个块的函数。

块大小告诉我们原始图像中有多少值将组合成缩小图像中的一个值,而 func 参数指定将应用于将所有值组合到一个块中的函数。

因为在我们之前的所有示例中,我们一直在将 (10, 10) 图像缩小为 (5, 5) 图像,所以我们的块大小将为 (2, 2),因为我们希望新值是平均值 整个块的值而不是块中的一个值,我们将使用 np.mean 作为 func。

以下代码示例演示了如何使用 block_reduce() 方法对图像进行下采样。

import numpy as np
from skimage.measure import block_reduce

b = np.arange(0,100)
c = b.reshape([10,10])

new_c = block_reduce(c, block_size=(2,2), func=np.mean)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

输出:

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 5.5  7.5  9.5 11.5 13.5]
 [25.5 27.5 29.5 31.5 33.5]
 [45.5 47.5 49.5 51.5 53.5]
 [65.5 67.5 69.5 71.5 73.5]
 [85.5 87.5 89.5 91.5 93.5]]

上一节中编写的代码从我们的原始图像 c 中取出一个 (2, 2) 块,取该块内所有 4 个值的平均值,并将结果放入我们的新图像 new_c 中。

这种方法优于上面讨论的前两种方法,因为它采用了所有值的组合效果,而不是仅从原始图像块中获取 1 个值并跳过每个块中其余 3 个值。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中 Segmentation Fault 11 错误

发布时间:2023/05/13 浏览次数:85 分类:Python

我们可以通过检查代码中的错误、增加堆栈大小、使用调试工具、更新 Python 版本、重新安装 Python 或检查系统内存来修复 osx in Python 中的分段错误 11。

在 Python 中向集合添加值

发布时间:2023/05/13 浏览次数:90 分类:Python

有 2 个主要方法可用于向 Python 中的现有集合添加更多值,即 add() 方法和 update() 方法。

在 Python 中从 Env 文件中读取环境变量

发布时间:2023/05/13 浏览次数:164 分类:Python

本文提供了两种将环境变量导入 Python 代码的方法。 第一个直接从本地环境文件读取变量,而另一个使用 shell 脚本来自动执行该过程。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便