以特定形状调整图像大小

image resize with certain shape

我想改变图像的大小,它是一个 numpy 数组。 这张照片的尺寸是(480, 640, 3),我想把它变成(55, 74, 3)。

在我看到的 python 库中搜索后,大多数调整图像大小的函数采用均值函数或对像素求和以减小尺寸。

但在我的例子中,我想做些别的,我想取第一列的第一个像素然后放下第二个像素,取第三列的第三个像素然后放下第四个像素等等在。 对于剥离第二、第四、第六……的行。 形状应该是这样的 https://imgur.com/2jPRYiy 只取棕色像素。

我怎样才能实现图片中显示的内容?这有什么功能或图书馆吗? 谢谢

您可以使用 Numpy 来做到这一点,这是所有 Python 库(OpenCVPIL/Pillow, scikit-image, Wand, vips) 在下方使用。

所以,假设我们创建一个像这样的虚拟图像:

import numpy as np

# Synthetically create big image
big = np.arange(48, dtype=np.uint8).reshape((6,8))                                                                                                    

看起来像这样:

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]], dtype=uint8)

如果您现在想要每隔一行和每隔一列,请使用:

subsampled = big[0::2, 0::2]

你会在你的 subsampled 图片中看到这个:

array([[ 0,  2,  4,  6],
       [16, 18, 20, 22],
       [32, 34, 36, 38]], dtype=uint8)

如果你想重新应用它,再做同样的事情:

subsampledx2 = subsampled[0::2, 0::2]

你会得到这个:

array([[ 0,  4],
       [32, 36]], dtype=uint8)

我不确定您如何希望每隔一行和每隔一列将 640x480 的图像缩小到 74x55,也许您打算递归应用它?


抱歉,如果您有一个具有 3 个 RGB 通道的彩色图像,您可以使用额外的冒号来显式获取所有 3 个 RGB 通道:

subsampled = big[0::2, 0::2, :]