有人能帮我弄清楚我的图像自动裁剪脚本中发生了什么吗?我有一个很大的透明区域/空间的png图像。我希望能够自动裁剪出那个空间,并留下必要的东西。原始图像有一个正方形的画布,最好是长方形的,只封装分子。
原图如下:
在做一些谷歌搜索时,我遇到了PIL/python代码,据报道它可以工作,但在我手中,运行下面的代码会过度裁剪图像。
import Image
import sys
image=Image.open('L_2d.png')
image.load()
imageSize = image.size
imageBox = image.getbbox()
imageComponents = image.split()
rgbImage = Image.new("RGB", imageSize, (0,0,0))
rgbImage.paste(image, mask=imageComponents[3])
croppedBox = rgbImage.getbbox()
print imageBox
print croppedBox
if imageBox != croppedBox:
cropped=image.crop(croppedBox)
print 'L_2d.png:', "Size:", imageSize, "New Size:",croppedBox
cropped.save('L_2d_cropped.png')
输出是这样的:
有没有更熟悉图像处理/PLI的人能帮我解决这个问题?
发布于 2013-01-08 17:21:59
您可以使用numpy,将图像转换为数组,找到所有非空列和行,然后从以下内容创建图像:
import Image
import numpy as np
image=Image.open('L_2d.png')
image.load()
image_data = np.asarray(image)
image_data_bw = image_data.max(axis=2)
non_empty_columns = np.where(image_data_bw.max(axis=0)>0)[0]
non_empty_rows = np.where(image_data_bw.max(axis=1)>0)[0]
cropBox = (min(non_empty_rows), max(non_empty_rows), min(non_empty_columns), max(non_empty_columns))
image_data_new = image_data[cropBox[0]:cropBox[1]+1, cropBox[2]:cropBox[3]+1 , :]
new_image = Image.fromarray(image_data_new)
new_image.save('L_2d_cropped.png')
结果看起来像是
如果有什么不清楚的地方,尽管问。
发布于 2013-01-08 17:30:27
对我来说,它是这样工作的:
import Image
image=Image.open('L_2d.png')
imageBox = image.getbbox()
cropped=image.crop(imageBox)
cropped.save('L_2d_cropped.png')
按mask=imageComponents[3]
搜索边界时,仅按蓝色通道搜索。
发布于 2018-02-04 15:57:57
我测试了在这篇文章中回答的大部分答案,然而,我最终得到了我自己的答案。我用的是蟒蛇python3。
from PIL import Image, ImageChops
def trim(im):
bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
diff = ImageChops.difference(im, bg)
diff = ImageChops.add(diff, diff, 2.0, -100)
#Bounding box given as a 4-tuple defining the left, upper, right, and lower pixel coordinates.
#If the image is completely empty, this method returns None.
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
if __name__ == "__main__":
bg = Image.open("test.jpg") # The image to be cropped
new_im = trim(bg)
new_im.show()
https://stackoverflow.com/questions/14211340
复制相似问题