拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 动态裁剪影像边框

动态裁剪影像边框

白鹭 - 2022-01-24 2006 0 0

如何裁剪看起来像这样的影像并保存为 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")

uj5u.com热心网友回复:

最后我找到了解决方案。这是我所做的:

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))

我从这里找到的洗掉边框的功能

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

uj5u.com热心网友回复:

如果区域始终具有相同的大小和相同的顶部和底部坐标,则以下内容应该起作用:

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

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)

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *