49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
import logging
|
|
import os
|
|
from typing import List
|
|
from PIL import Image, ImageDraw, ImageFont, ImageFilter
|
|
from PIL.Image import composite
|
|
|
|
from ml.element_detection import BoundBox
|
|
|
|
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
|
def show_image_with_boxes(
|
|
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
|
|
):
|
|
img = Image.open(in_image_path)
|
|
draw = ImageDraw.Draw(img)
|
|
font_path = DIR_PATH + "/assets/fonts/arial.ttf"
|
|
font = ImageFont.truetype(font_path, 25)
|
|
for i, box in enumerate(bounding_boxes):
|
|
draw.rectangle(box.get_params(), outline="red", width=2, fill=None)
|
|
draw.text((box.x1 + 5, box.y1 + 5), str(i + 1), fill="red", font=font)
|
|
if not out_image_path:
|
|
out_image_path = (
|
|
in_image_path.split(".")[0] + "_out." + in_image_path.split(".")[1]
|
|
)
|
|
img.save(out_image_path)
|
|
|
|
|
|
def blur_boxes_on_image(
|
|
in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None
|
|
):
|
|
img = Image.open(in_image_path)
|
|
blur_img = img.filter(ImageFilter.GaussianBlur(radius=13)) # to increase the blur, increase the radius
|
|
mask = Image.new("L", img.size, 255)
|
|
draw_mask = ImageDraw.Draw(mask)
|
|
for box in bounding_boxes:
|
|
if box.selected:
|
|
if box.object == "plate":
|
|
draw_mask.rectangle(box.get_params(), fill=0)
|
|
elif box.object == "face":
|
|
draw_mask.ellipse(box.get_params(), fill=0)
|
|
mask = mask.filter(ImageFilter.GaussianBlur(radius=3))
|
|
img = composite(img, blur_img, mask)
|
|
if not out_image_path:
|
|
out_image_path = (
|
|
in_image_path.split(".")[0] + "_blurred." + in_image_path.split(".")[1]
|
|
)
|
|
img.save(out_image_path)
|