Python Downsample 数组
本篇文章将讨论在 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 个值。
相关文章
Python 中 PermissionError: [WinError 5] Access Is Denied 错误
发布时间:2023/05/13 浏览次数:165 分类:Python
-
我们将简单介绍如何解决 PermissionError: [WinError 5] Access is denied in Python 。PermissionError: [WinError 5] Python 拒绝访问
Python 中 ZeroDivisionError: Float Division by Zero 错误
发布时间:2023/05/13 浏览次数:123 分类:Python
-
我们将介绍为什么会出现 ZeroDivisionError 以及我们如何通过 Python 中的示例轻松解决它。Python ZeroDivisionError: Float Division by Zero
Python 中 Segmentation Fault 11 错误
发布时间:2023/05/13 浏览次数:85 分类:Python
-
我们可以通过检查代码中的错误、增加堆栈大小、使用调试工具、更新 Python 版本、重新安装 Python 或检查系统内存来修复 osx in Python 中的分段错误 11。
Python 中的 IndexError: Tuple Index Out of Range 错误
发布时间:2023/05/13 浏览次数:128 分类:Python
-
在本文中,我们将演示为什么会出现 IndexError: tuple index out of range 错误,以及如何通过示例在 Python 中解决该错误。
修复 Python 中 TypeError: List Indices Must Be Integers, Not List 错误
发布时间:2023/05/13 浏览次数:94 分类:Python
-
我们将介绍嵌套列表以及许多程序员在尝试通过 Python 中的示例访问其中的元素时遇到的常见错误。修复 TypeError: list indices must be integers, not list in Python 列表是 Python 最常用和最通用的数据类型之
python 修复 TypeError: 'float' Object Cannot Be Interpreted as an Integer 错误
发布时间:2023/05/13 浏览次数:118 分类:Python
-
我们将介绍为什么会出现 TypeError: 'float' object cannot be interpreted as an integer 错误,以及我们如何在 Python 中解决它。
Python 修复 TypeError: Object of Type 'Int64' Is Not JSON Serializable 错误
发布时间:2023/05/13 浏览次数:123 分类:Python
-
我们将介绍如何正确序列化 JSON 而不会出现错误,例如 Object of type 'int64' is not JSON serializable with examples in Python。
在 Python 中向集合添加值
发布时间:2023/05/13 浏览次数:90 分类:Python
-
有 2 个主要方法可用于向 Python 中的现有集合添加更多值,即 add() 方法和 update() 方法。
在 Python 中从 Env 文件中读取环境变量
发布时间:2023/05/13 浏览次数:164 分类:Python
-
本文提供了两种将环境变量导入 Python 代码的方法。 第一个直接从本地环境文件读取变量,而另一个使用 shell 脚本来自动执行该过程。