如何裁剪看起來像這樣的影像并保存為 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)
對每列的總和也可以這樣做,但這里檢查多個左右值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394688.html
