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