37

中央で画像をトリミングするにはどうすればよいですか? ボックスが左、上、右、および下のピクセル座標を定義する 4 タプルであることはわかっていますが、これらの座標を取得する方法がわからないため、中央でトリミングされます。

4

7 に答える 7

84

トリミングしたいサイズ (new_width X new_height) がわかっていると仮定します。

import Image
im = Image.open(<your image>)
width, height = im.size   # Get dimensions

left = (width - new_width)/2
top = (height - new_height)/2
right = (width + new_width)/2
bottom = (height + new_height)/2

# Crop the center of the image
im = im.crop((left, top, right, bottom))

小さな画像を大きくトリミングしようとすると、これは壊れますが、それを試みないことを前提としています (または、そのケースをキャッチして画像をトリミングしないことができます)。

于 2013-05-20T11:09:48.677 に答える
13

提案されたソリューションの潜在的な問題の 1 つは、目的のサイズと古いサイズの間に奇妙な違いがある場合です。両側に 0.5 ピクセルを配置することはできません。追加のピクセルを配置する側を選択する必要があります。

水平方向に奇数の差がある場合、以下のコードは余分なピクセルを右に配置し、垂直方向に奇数の差がある場合、余分なピクセルを下に配置します。

import numpy as np

def center_crop(img, new_width=None, new_height=None):        

    width = img.shape[1]
    height = img.shape[0]

    if new_width is None:
        new_width = min(width, height)

    if new_height is None:
        new_height = min(width, height)

    left = int(np.ceil((width - new_width) / 2))
    right = width - int(np.floor((width - new_width) / 2))

    top = int(np.ceil((height - new_height) / 2))
    bottom = height - int(np.floor((height - new_height) / 2))

    if len(img.shape) == 2:
        center_cropped_img = img[top:bottom, left:right]
    else:
        center_cropped_img = img[top:bottom, left:right, ...]

    return center_cropped_img
于 2015-09-03T21:38:51.557 に答える
1

作物の中心とその周辺:

def im_crop_around(img, xc, yc, w, h):
    img_width, img_height = img.size  # Get dimensions
    left, right = xc - w / 2, xc + w / 2
    top, bottom = yc - h / 2, yc + h / 2
    left, top = round(max(0, left)), round(max(0, top))
    right, bottom = round(min(img_width - 0, right)), round(min(img_height - 0, bottom))
    return img.crop((left, top, right, bottom))


def im_crop_center(img, w, h):
    img_width, img_height = img.size
    left, right = (img_width - w) / 2, (img_width + w) / 2
    top, bottom = (img_height - h) / 2, (img_height + h) / 2
    left, top = round(max(0, left)), round(max(0, top))
    right, bottom = round(min(img_width - 0, right)), round(min(img_height - 0, bottom))
    return img.crop((left, top, right, bottom))
于 2019-12-17T21:24:54.000 に答える