image_commons.py 2.3 KB
Newer Older
1
"""
Arne Gerdes's avatar
Arne Gerdes committed
2 3
Diese Klasse enthält Funktionen zum Bearbeiten von Bildern in OpenCV und PIL's Image.
PIL => PIL ist die Python-Imaging-Bibliothek
4 5 6 7 8 9 10 11
"""
import cv2
import numpy as np
from PIL import Image


def image_as_nparray(image):
    """
Arne Gerdes's avatar
Arne Gerdes committed
12
    Konvertiert PIL Image in ein Numpy Array
13
    :param image: PIL's Image object.
Arne Gerdes's avatar
Arne Gerdes committed
14
    :return: Numpy Array der Bilder.
15 16 17 18 19 20
    """
    return np.asarray(image)


def nparray_as_image(nparray, mode='RGB'):
    """
Arne Gerdes's avatar
Arne Gerdes committed
21
    Konvertiert Numpy Array der Bilder in PIL Image
22
    :param nparray: Numpy's array of image.
Arne Gerdes's avatar
Arne Gerdes committed
23 24
    :param mode: Modus der Umwandlung. Standardeinstellung ist "RGB".
    :return: PIL Image mit dem Bild
25 26 27 28 29 30
    """
    return Image.fromarray(np.asarray(np.clip(nparray, 0, 255), dtype='uint8'), mode)


def load_image(source_path):
    """
Arne Gerdes's avatar
Arne Gerdes committed
31 32 33
    Lädt das RGB-Bild und konvertiert es in Graustufen.
    :param source_path: Quellpfad des Bildes.
    :return: Bild wird vom Pfad geladen und in Graustufen konvertiert.
34 35 36 37 38 39 40
    """
    source_image = cv2.imread(source_path)
    return cv2.cvtColor(source_image, cv2.COLOR_BGR2GRAY)


def draw_with_alpha(source_image, image_to_draw, coordinates):
    """
Arne Gerdes's avatar
Arne Gerdes committed
41 42 43 44
    Zeichnet ein teilweise transparentes Bild über ein anderes Bild.
    :param source_image: Bild zum Übermalen.
    :param image_to_draw: Bild zum Zeichnen.
    :param coordinates: : Koordinaten um ein Bild zu zeichnen. Tupel von x, y, Breite und Höhe.
45 46 47 48 49 50 51
    """
    x, y, w, h = coordinates
    image_to_draw = image_to_draw.resize((h, w), Image.ANTIALIAS)
    image_array = image_as_nparray(image_to_draw)
    for c in range(0, 3):
        source_image[y:y + h, x:x + w, c] = image_array[:, :, c] * (image_array[:, :, 3] / 255.0) \
                                            + source_image[y:y + h, x:x + w, c] * (1.0 - image_array[:, :, 3] / 255.0)
52 53 54 55 56 57 58 59 60 61 62 63 64

def draw_img(source_image, image_to_draw, coordinates):
    """
    Zeichnet ein teilweise transparentes Bild über ein anderes Bild.
    :param source_image: Bild zum Übermalen.
    :param image_to_draw: Bild zum Zeichnen.
    :param coordinates: : Koordinaten um ein Bild zu zeichnen. Tupel von x, y, Breite und Höhe.
    """
    x, y, w, h = coordinates
    image_to_draw = image_to_draw.resize((h, w), Image.ANTIALIAS)
    image_array = image_as_nparray(image_to_draw)
    for c in range(0, 3):
        source_image[y:y + h, x:x + w, c] = image_array[:, :]