Inpaint-Anything / utils /utils.py
pg56714's picture
Upload 13 files
7e0cd5c verified
Raw
History Blame Contribute Delete
2.46 kB
import cv2
import numpy as np
from PIL import Image
from typing import Any, Dict, List
def load_img_to_array(img_p):
img = Image.open(img_p)
if img.mode == "RGBA":
img = img.convert("RGB")
return np.array(img)
def save_array_to_img(img_arr, img_p):
Image.fromarray(img_arr.astype(np.uint8)).save(img_p)
def dilate_mask(mask, dilate_factor=15):
mask = mask.astype(np.uint8)
mask = cv2.dilate(
mask,
np.ones((dilate_factor, dilate_factor), np.uint8),
iterations=1
)
return mask
def erode_mask(mask, dilate_factor=15):
mask = mask.astype(np.uint8)
mask = cv2.erode(
mask,
np.ones((dilate_factor, dilate_factor), np.uint8),
iterations=1
)
return mask
def show_mask(ax, mask: np.ndarray, random_color=False):
mask = mask.astype(np.uint8)
if np.max(mask) == 255:
mask = mask / 255
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
color = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])
h, w = mask.shape[-2:]
mask_img = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
ax.imshow(mask_img)
def show_points(ax, coords: List[List[float]], labels: List[int], size=375):
coords = np.array(coords)
labels = np.array(labels)
color_table = {0: 'red', 1: 'green'}
for label_value, color in color_table.items():
points = coords[labels == label_value]
ax.scatter(points[:, 0], points[:, 1], color=color, marker='*',
s=size, edgecolor='white', linewidth=1.25)
def get_clicked_point(img_path):
img = cv2.imread(img_path)
cv2.namedWindow("image")
cv2.imshow("image", img)
last_point = []
keep_looping = True
def mouse_callback(event, x, y, flags, param):
nonlocal last_point, keep_looping, img
if event == cv2.EVENT_LBUTTONDOWN:
if last_point:
cv2.circle(img, tuple(last_point), 5, (0, 0, 0), -1)
last_point = [x, y]
cv2.circle(img, tuple(last_point), 5, (0, 0, 255), -1)
cv2.imshow("image", img)
elif event == cv2.EVENT_RBUTTONDOWN:
keep_looping = False
cv2.setMouseCallback("image", mouse_callback)
while keep_looping:
cv2.waitKey(1)
cv2.destroyAllWindows()
return last_point