【问题标题】:Crop image borders dynamically动态裁剪图像边框
【发布时间】:2022-01-23 13:56:29
【问题描述】:

如何裁剪像这样的图像并保存为 3 张不同的图像?

问题是图像大小不同且不成比例,所以我想制作一个动态切割黑色边框的代码,而不是图片内部的黑色部分。

这是期望的结果:

以下是我制作的示例代码,仅适用于一个特定的图像。

from PIL import Image
im = Image.open(r"image.jpg")

# Setting the points for cropped image1
# im1 = im.crop((left, top, right, bottom))
im1 = im.crop((...))
im2 = im.crop((...))
im3 = im.crop((...))

im1 = im1.save(r"image1.jpg")
im2 = im2.save(r"image2.jpg")
im3 = im3.save(r"image3.jpg")

【问题讨论】:

  • 基本技巧。计算背景颜色的掩码,反转,查找连接的组件(或轮廓)。您的代码无济于事,因为甚至没有任何方法的提示。
  • @ChristophRackwitz 感谢您的回复和想法。我会尝试提出解决方案并在这里分享

标签: python image-processing


【解决方案1】:

我终于找到了解决方案。这是我所做的:

from PIL import Image, ImageChops

def RemoveBlackBorders(img):
    bg = Image.new(img.mode, img.size, img.getpixel((0,0)))
    diff = ImageChops.difference(img, bg)
    diff = ImageChops.add(diff, diff, 2.0, -100)
    bbox = diff.getbbox()
    if bbox:
        return img.crop(bbox)

# Opens a image in RGB mode
im = Image.open(r"C:\Path\Image.jpg")

# removing borders

im = RemoveBlackBorders(im)

# getting midpoint from size

width, height = im.size
mwidth = width/2

# assign shape of figure from the midpoint

     #crop((x,y of top left, x, y of bottom right))
im1 = im.crop((0, 0, mwidth-135, height))
im2 = im.crop((mwidth-78, 0, mwidth+84, height))
im3 = im.crop((mwidth+135, 0, width, height))

我从here找到的删除边框的功能。

虽然该解决方案不是完全动态的,但它仍然以大约 90% 的准确率解决了我的问题。但我相信应该有一个更通用的方法来解决这个问题。

【讨论】:

    【解决方案2】:

    如果这些区域始终具有相同的大小和相同的顶部和底部坐标,那么以下应该可以工作:

    可以通过计算每行和每列的总和,然后分析它们来检索作物的坐标。

    import cv2
    import numpy as np
    im = cv2.imread(image_path)
    sum_of_rows = np.sum(im, axis=(1,2))
    sum_of_cols = np.sum(im, axis=(0,2))
    

    可以通过计算每一行的总和来计算顶部和底部(每个总和值计算R+G+B,黑色的值应该为零)。然后寻找与零不同的第一个值和与零不同的最后一个值。都表示顶部和底部。

    top = np.argmax(sum_of_rows > 0)
    bottom = top + np.argmax(sum_of_rows[top:]==0)
    

    对每一列的总和也可以这样做,但这里检查多个左右值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2019-08-02
      • 2020-03-20
      • 2020-08-12
      • 2012-11-18
      • 1970-01-01
      相关资源
      最近更新 更多