python - 如何使用 PIL 在单个白色背景上检测和裁剪多个图像?
问题描述
我刚刚开始使用 PIL,我需要帮助来使用 PIL 检测和裁剪单个白色背景上的多个图像。它们可以是不同的大小并且位于不同的位置。现在,我只能裁剪出一张图像。请帮忙,谢谢!
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)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
else:
print("No image detected")
image1 = Image.open('multiple.jpg')
image2 = test(image1)
解决方案
这可以提高效率,但这会使答案复杂化。
from PIL import Image, ImageChops
def crop(im, white):
bg = Image.new(im.mode, im.size, white)
diff = ImageChops.difference(im, bg)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
def split(im, white):
# Is there a horizontal white line?
whiteLine = Image.new(im.mode, (im.width, 1), white)
for y in range(im.height):
line = im.crop((0, y, im.width, y+1))
if line.tobytes() == whiteLine.tobytes():
# There is a white line
# So we can split the image into two
# and for efficiency, crop it
ims = [
crop(im.crop((0, 0, im.width, y)), white),
crop(im.crop((0, y+1, im.width, im.height)), white)
]
# Now, because there may be white lines within the two subimages
# Call split again, making this recursive
return [sub_im for im in ims for sub_im in split(im, white)]
# Is there a vertical white line?
whiteLine = Image.new(im.mode, (1, im.height), white)
for x in range(im.width):
line = im.crop((x, 0, x+1, im.height))
if line.tobytes() == whiteLine.tobytes():
ims = [
crop(im.crop((0, 0, x, im.height)), white),
crop(im.crop((x+1, 0, im.width, im.height)), white)
]
return [sub_im for im in ims for sub_im in split(im, white)]
# There are no horizontal or vertical white lines
return [im]
def trim(im):
# You have defined the pixel at (0, 0) as white in your code
white = im.getpixel((0,0))
# Initial crop
im = crop(im, white)
if im:
return split(im, white)
else:
print("No image detected")
image1 = Image.open('multiple.jpg')
trim(image1)
推荐阅读
- php - 如何使用 Laravel 进行多模板
- mongodb - 为非关系数据分配大数据存储
- python - 从头开始构建 Python Pandas DataFrames(即将计算结果存储在 DataFrame 中)
- python - 带冒号的函数参数
- python - 当我使用 matplotlib.pyplot 时,为什么 y 轴下方的数字更大?
- java - LocalDateTime 解析为纪元秒
- azure-service-fabric - 使用 Service Fabric url 调用本地 Service Fabric 无状态 API
- r - 关于总和值到特定条件的变化
- javascript - 如何检查多个输入是否具有相同类的相同值(jQuery)
- javascript - Bootstrap 导航栏折叠按钮不起作用