首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python/PIL自动裁剪图像

使用python/PIL自动裁剪图像
EN

Stack Overflow用户
提问于 2013-01-08 16:57:17
回答 8查看 46.4K关注 0票数 28

有人能帮我弄清楚我的图像自动裁剪脚本中发生了什么吗?我有一个很大的透明区域/空间的png图像。我希望能够自动裁剪出那个空间,并留下必要的东西。原始图像有一个正方形的画布,最好是长方形的,只封装分子。

原图如下:

在做一些谷歌搜索时,我遇到了PIL/python代码,据报道它可以工作,但在我手中,运行下面的代码会过度裁剪图像。

代码语言:javascript
复制
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的人能帮我解决这个问题?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-01-08 17:21:59

您可以使用numpy,将图像转换为数组,找到所有非空列和行,然后从以下内容创建图像:

代码语言:javascript
复制
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')

结果看起来像是

如果有什么不清楚的地方,尽管问。

票数 34
EN

Stack Overflow用户

发布于 2013-01-08 17:30:27

对我来说,它是这样工作的:

代码语言:javascript
复制
import Image

image=Image.open('L_2d.png')

imageBox = image.getbbox()
cropped=image.crop(imageBox)
cropped.save('L_2d_cropped.png')

mask=imageComponents[3]搜索边界时,仅按蓝色通道搜索。

票数 42
EN

Stack Overflow用户

发布于 2018-02-04 15:57:57

我测试了在这篇文章中回答的大部分答案,然而,我最终得到了我自己的答案。我用的是蟒蛇python3。

代码语言:javascript
复制
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()
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14211340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档