使用PIL自动裁剪图片

5
我有一个包含许多图像的文件夹,每个图像都至少包含4个较小的图像。我想知道如何使用Python PIL剪切这些较小的图像,使它们作为独立的图像文件存在。幸运的是,有一个常数,背景要么是白色要么是黑色,所以我猜我需要一种通过搜索完全为黑色或完全为白色的行或列来剪切这些图像的方法。以下是一个示例图像:
enter image description here
从上面的图像中,将会得到10个单独的图像,每个图像都包含一个数字。谢谢。
编辑:我还有一个更现实的样本图像,因为其中一些较小的图像的背景颜色与它们所包含的图像的背景颜色相同,例如:
enter image description here
输出将会是13个单独的图像,每个图像都包含一个字母。

之前有一个类似的关于裁剪的问题被提出过...https://dev59.com/EXNA5IYBdhLWcg3wI6R4 你可以将那段代码放入一个循环中,使用正确的坐标进行更改,使其像自动裁剪一样工作。 - AurA
谢谢回复,但裁剪框从预定义的x、y坐标开始工作。正如我所说,唯一的常数是背景颜色,留下整列的黑白。手动处理比那种方式更快。 - Py-Newbie
将其放在某个循环下,并均匀增加坐标,基本上是左侧坐标,这样我希望它比手动操作更快,而且一旦代码准备好,就可以将其应用于n个图像。 - AurA
上面的图片只是用来帮助澄清我的问题,是的,它可以在该图片上工作。但是,我拥有的图像大小各不相同,其中包含的图像也是如此。从一个图像循环到下一个将产生可以被认为是随机的结果。这就是为什么我需要能够让PIL查找“全黑”像素列并将它们之间的内容分割成单独的图像。 - Py-Newbie
1个回答

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,上面的代码在第一个示例图像上运行得很好,不幸的是我似乎无法调整它以适应我最近添加的第二个图像。任何建议将不胜感激。谢谢。 - Py-Newbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接