【问题标题】:Auto-cropping images with PIL使用 PIL 自动裁剪图像
【发布时间】:2012-10-01 17:51:31
【问题描述】:

我有一个充满图像的文件夹,每个图像至少包含 4 个较小的图像。我想知道如何使用 Python PIL 剪切较小的图像,以便它们都作为独立的图像文件存在。幸运的是,有一个常数,背景是白色或黑色,所以我猜我需要一种通过搜索完全黑色或完全白色的行或最好是列来剪切这些图像的方法,这是一个示例图像:

从上图中,将有 10 个单独的图像,每个图像都包含一个数字。提前致谢。

编辑:我有另一个更真实的示例图像,因为一些较小图像的背景与它们所在图像的背景颜色相同。例如

输出 13 个独立的图像,每个包含 1 个字母

【问题讨论】:

  • 之前有人问过关于裁剪的类似问题...stackoverflow.com/questions/1076638/… 您可以将该代码放入一个循环中,并使用正确的坐标进行更改以使其像自动裁剪一样工作
  • 感谢您的回复,但cropbox 使用预定义的 x、y 坐标。正如我所说,唯一不变的是背景颜色留下整列黑/白。手动操作会比手动操作更快。
  • 放入某个循环并基本均匀地增加坐标左侧坐标,这样我希望它比手动干预更快,而且一旦代码准备好,你可以将它应用于 n 个图像。
  • 上面的图片只是用来帮助澄清我的问题,是的,它适用于上述图片。但是,我拥有的图像大小不同,其中包含的图像也是如此。从一个图像循环到下一个图像会产生可以被认为是随机的结果。这就是为什么我需要能够获得 PIL 类似的东西以找到“全黑”像素列并将它们之间的内容拆分为单独的图像。

标签: python image-processing image-manipulation python-imaging-library crop


【解决方案1】:

使用 scipy.ndimage 进行标注:

import numpy as np
import scipy.ndimage as ndi
import Image

THRESHOLD = 100
MIN_SHAPE = np.asarray((5, 5))

filename = "eQ9ts.jpg"
im = np.asarray(Image.open(filename))
gray = im.sum(axis=-1)
bw = gray > THRESHOLD
label, n = ndi.label(bw)
indices = [np.where(label == ind) for ind in xrange(1, n)]
slices = [[slice(ind[i].min(), ind[i].max()) for i in (0, 1)] + [slice(None)]
          for ind in indices]
images = [im[s] for s in slices]
# filter out small images
images = [im for im in images if not np.any(np.asarray(im.shape[:-1]) < MIN_SHAPE)]

【讨论】:

  • 感谢 Nicolas,上面的代码在第一个示例图像上效果很好,不幸的是我似乎无法调整它以使用我没有长时间添加的第二个图像。任何意见,将不胜感激。谢谢。
猜你喜欢
  • 2012-12-22
  • 2012-04-16
  • 2013-03-06
  • 2011-02-25
  • 2018-12-11
  • 2019-03-26
  • 2021-10-01
  • 2019-12-04
  • 1970-01-01
相关资源
最近更新 更多