TARA / shared /utils /image.py
bpiyush's picture
Update TARA to latest Tarsier2 checkpoint and runnable demo.
7daf628
Raw
History Blame Contribute Delete
2.4 kB
"""Image operations."""
from copy import deepcopy
from PIL import Image
import numpy as np
def center_crop(im: Image):
width, height = im.size
new_width = width if width < height else height
new_height = height if height < width else width
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))
return im
def pad_to_square(im: Image, color=(0, 0, 0)):
im = deepcopy(im)
width, height = im.size
vert_pad = (max(width, height) - height) // 2
hor_pad = (max(width, height) - width) // 2
if len(im.mode) == 3:
color = (0, 0, 0)
elif len(im.mode) == 1:
color = 0
else:
raise ValueError(f"Image mode not supported. Image has {im.mode} channels.")
return add_margin(im, vert_pad, hor_pad, vert_pad, hor_pad, color=color)
def add_margin(pil_img, top, right, bottom, left, color=(0, 0, 0)):
"""Ref: https://note.nkmk.me/en/python-pillow-add-margin-expand-canvas/"""
width, height = pil_img.size
new_width = width + right + left
new_height = height + top + bottom
result = Image.new(pil_img.mode, (new_width, new_height), color)
result.paste(pil_img, (left, top))
return result
def resize_image(image, new_height, new_width):
# Convert the numpy array image to PIL Image
pil_image = Image.fromarray(image)
# Resize the PIL Image
resized_image = pil_image.resize((new_width, new_height))
# Convert the resized PIL Image back to numpy array
resized_image_np = np.array(resized_image)
return resized_image_np
def pad_to_width(pil_image, new_width, color=(0, 0, 0)):
"""Pad the image to the specified width."""
# Convert the numpy array image to PIL Image
# pil_image = Image.fromarray(image)
# Get the current width and height of the image
width, height = pil_image.size
assert new_width > width, f"New width {new_width} is less than the current width {width}."
# Calculate the padding required
hor_pad = new_width - width
# Add padding to the image
padded_image = add_margin(pil_image, 0, hor_pad, 0, 0, color=color)
# Convert the padded PIL Image back to numpy array
# padded_image_np = np.array(padded_image)
return padded_image