5

我有充滿圖像的文件夾,每個圖像至少包含4個較小的圖像。我想知道如何使用Python PIL將較小的圖像剪切出來,這樣它們將作爲獨立的圖像文件存在。幸運的是,有一個常數,背景是白色或黑色,所以我猜測我需要的是通過搜索行或最好是完全黑色或完全白色的列來剪切這些圖像的方法,下面是一個示例圖像:使用PIL自動裁剪圖像

enter image description here

從上面的圖像,將有10個單獨的圖像,每個圖像包含許多。提前致謝。

編輯:我有另一個更實際的示例圖像,其中一些較小圖像的背景與它們所包含圖像的背景是相同的顏色。

enter image description here

其輸出爲13個獨立的圖像,每個圖像containng 1個信

+0

上裁剪一個類似的問題被提出之前... http://stackoverflow.com/questions/1076638/trouble-using-python-pil-library-to-crop-and-save-image你可以把這個代碼放在一個循環中,改變它的正確座標,使它像autocrop一樣工作 – AurA

+0

感謝您的答覆,但作物箱從pred開始工作被定義的x,y座標。正如我所說,唯一的常數是背景顏色留下整個黑色/白色列。手動操作比以這種方式操作會更快。 –

+0

放在一些循環下,基本上統一增加座標左邊的座標,這樣我希望它比人工干預更快,一旦代碼準備就緒,你可以將它應用到n個圖像。 – AurA

回答

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)] 
+0

感謝Nicolas,上面的代碼在第一個示例圖像上效果很好,不幸的是, t似乎調整它與我沒有添加的第二張圖片一起工作。任何建議,將不勝感激。謝謝。 –