【问题标题】:Vectorizing the reshaping and cropping of images using PIL使用 PIL 对图像进行矢量化整形和裁剪
【发布时间】:2017-01-22 10:56:49
【问题描述】:

我有许多图像要裁剪,然后再整形。为了帮助我解决这个问题,我编写了两个辅助函数:

def crop_images(images_data):
    cropped_images = []
    for image_data in images_data:
        image = Image.fromarray(image_data)
        cropped_image = np.asarray(image.crop((25,40,275,120)))
        cropped_images.append(cropped_image)
    return(np.array(cropped_images))

def resize_images(images_data):
    resized_images = []
    width, height = images_data.shape[2], images_data.shape[1]
    resized_width, resized_height = int(width/2), int(height/2)
    for image_data in images_data:
        image = Image.fromarray(image_data)
        image = image.resize((resized_width, resized_height), Image.ANTIALIAS)
        resized_images.append(np.asarray(image))
    return(np.array(resized_images))

然后我会将这两个函数链接在一起来处理我的图像,例如: resize_images(crop_images(images_data))

但我想知道是否有办法对这些操作进行矢量化,因为我知道 numpy 理想情况下应该是矢量化操作,因为它更快。

【问题讨论】:

  • 您似乎正在裁剪为相同的形状?如果是这样,如果您还没有这样做,那么使用初始化的输出数组将是有意义的。
  • 在这种情况下,使用 numpy 进行裁剪似乎比使用 Image 库进行裁剪更为理想。

标签: python numpy python-imaging-library


【解决方案1】:

这是更高级别的迭代 - 超过图像数组 - 通常关于“矢量化”的讨论并不适用。

图像数组的大小往往类似于 (400,400,3) 或更大。如果您不需要,您不想迭代这 400 条边之一。所以对图像数组进行“矢量化”操作很有意义。

但是,如果处理 100 个这些图像,则图像循环并不是那么糟糕。 “矢量化”的唯一方法是将它们组装成一个更大的数组(N、400、400、3),然后找到适用于 4d 的表达式,或者那个大数组的切片。如果 N 为 1000 或更大,则很容易走这条路,但对于像这样的大型阵列,内存管理问题开始影响任何速度提升。

对于迭代,我认为追加到列表和插入到预先分配的数组中都是有用的。我还没有看到明确的证据表明在所有情况下一个都比另一个快。

alist = []
for arr in source:
    <process arr>
    alist.append(arr)
bigarr = np.array(alist)

bigarr = np.zeros((N,..)
for i in range(N):
    arr = source[i,...]
    <process arr>
    bigarr[i,...] = arr

在尝试“矢量化”批处理操作时,代码清晰度也会受到影响。

【讨论】:

  • 谢谢,这很有意义
【解决方案2】:

对于裁剪,如果您将所有图像放入一个 3-D 数组中,那么您可以一次将它们全部裁剪(第三维是图像轴):

cropped = images[top:bottom, left:right, :]

但不确定这是否会更快 - 将所有图像两次放入内存的内存成本可能会减慢速度。

【讨论】:

  • 另外,这些将是视图,所以应该会好得多。虽然不熟悉 PIL 的裁剪。
  • 对!忘了他们的意见:)
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 2012-04-16
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2019-04-29
  • 2013-03-06
  • 2012-12-22
相关资源
最近更新 更多