Kategorie: Python


  • Bilder in SW konvertieren mit Python

    Bilder in SW konvertieren mit Python

    Dieses Python-Skript verwendet die PIL (Python Imaging Library) Bibliothek, um Bilder in Schwarzweiss umzuwandeln und dabei Kontrast und Helligkeit anzupassen. Hier ist eine kurze Anleitung zur Verwendung des Skripts:

    Das Python Script kann von meinem Github Repository heruntergeladen werden. https://github.com/tcicit/tci_sw_converter/tree/main

    Beispiele:

    Original Image
    Kontrast Faktor 1
    Kontrast Faktor 2

    Installiere PIL: Stelle sicher, dass die PIL-Bibliothek installiert ist. Du kannst sie mit dem folgenden Befehl installieren:

    pip install pillow

    Führe das Skript aus: Verwende die Kommandozeile, um das Skript auszuführen. Hier ist ein Beispiel:

    Ein einzelnes Bild konvertieren:

    Bash
    python3 tci_sw_converter.py -i input_image.jpg -o output_image.jpg -c 1.5 -b 0.8
      -i oder --input: Pfad zum Eingabebild (JPG).
      -o oder --output: Optionaler Pfad zum Ausgabebild (JPG). Wenn     nicht angegeben, wird ein Standardname im selben Verzeichnis erstellt.
      -c oder --contrast: Kontrastfaktor (Standard: 1.0).
      -b oder --brightness: Helligkeitsfaktor (Standard: 1.0).
    

    Mehrere Bilder im Verzeichnis konvertieren:

    Installiere PIL: Falls noch nicht installiert (wie oben beschrieben). Führe das Skript aus: Verwende die Kommandozeile, um das Skript für ein Verzeichnis mit Bildern auszuführen. Hier ist ein Beispiel:

    Bash
    python3 tci_sw_converter.py -d input_directory -c 1.5 -b 0.8
       -d oder --directory: Pfad zum Verzeichnis mit Bildern für die Stapelverarbeitung.
       -o oder --output: Optionaler Pfad zum Ausgabeverzeichnis. Wenn nicht angegeben, wird ein Ordner mit dem Namen "converted_images" im Eingabeverzeichnis erstellt.
       -c oder --contrast: Kontrastfaktor (Standard: 1.0).
       -b oder --brightness: Helligkeitsfaktor (Standard: 1.0).
    

    Hinweis:

    Stelle sicher, dass das Skript im gleichen Verzeichnis wie die Bilder oder im Systempfad liegt, damit es ohne Pfadangabe ausgeführt werden kann.



  • Grafik Code Konvertert (hex converter) in Python

    Grafik Code Konvertert (hex converter) in Python

    Das Modul kann verwendet werden, um einen HEX Farbcode (ff0000) in verschiedene Repräsentationen umzuwandeln. Das Modul ist entstanden, dass die Dokumentation von “colorsys” ziemlich rudimentär ist und ich lange Suchen musste, bis ich den richtigen Ansatz gefunden hatte.

    Dokumentation “colorsys”: https://docs.python.org/3/library/colorsys.html

    • CSS Namen: red
    • RGB: rgb(255,0,0)
    • HSL: hsl(0, 100%, 50%)
    • HSV: hsv(0, 100%, 100%)
    • YIQ: yiq(0.3000,0.5990,0.2130)

    Für mehr Information sie folgende Wikipedia-Artikel:

    https://de.wikipedia.org/wiki/Farbe

    https://de.wikipedia.org/wiki/RGB-Farbraum

    https://de.wikipedia.org/wiki/HSV-Farbraum

    https://de.wikipedia.org/wiki/YIQ-Farbmodell

    https://de.wikipedia.org/wiki/Webfarbe

    Beschreibung der fünf Funktionen, die mit der Umwandlung von Farbwerten arbeiten.

    Die Funktion hex_to_rgb akzeptiert einen Hexadezimalcode als Eingabe (z.B. “#ffffff”) und gibt ein Tupel zurück, das die Werte für Rot, Grün und Blau in Dezimal- und Normalisierungsformaten sowie eine RGB-Farbkodierung enthält. Wenn der Eingabewert kein gültiger Hexadezimalcode ist, gibt die Funktion eine Fehlermeldung aus.

    Die Funktion hex_to_name akzeptiert auch einen Hexadezimalcode als Eingabe und gibt den Namen der Farbe zurück, die dem Code am nächsten kommt, basierend auf den CSS-Namen. Wenn der Eingabewert kein gültiger Hexadezimalcode ist oder kein Name gefunden werden kann, gibt die Funktion den Wert “no css name” zurück.

    Die Funktionen rgb_to_hsl und rgb_to_hsv akzeptieren die normalisierten Werte für Rot, Grün und Blau als Eingabe und geben die Werte für die entsprechenden Farbräume HSL und HSV sowie die Farbkodierungen zurück. Die Funktionen verwenden die in Python eingebaute colorsys-Bibliothek, um die Umrechnungen durchzuführen.

    Schliesslich gibt es die Funktion grb_to_yiq, die die normalisierten Werte für Rot, Grün und Blau akzeptiert und die entsprechenden Werte für den Farbraum YIQ zurückgibt. Die Funktion verwendet auch die colorsys-Bibliothek.

    Python
    '''
    Ein keines Pyton Modul um Hex-Farbwerte in verschiedene Formate um zu wandeln.
    Das Modul wurde durch diesen Artikel inspieriert: https://coderz.club/RGB-to-HSL-HSV-YIQ/
    
    Das Error Handling ist mur ganz rudimentaer implementiert.
    
    Autor: Thomas Cigolla, 16.02.2023
    '''
    import colorsys
    import webcolors
    import re
    
    def hex_to_rgb(hex_string):  # input Format #ffffff
        
        match = re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', hex_string) # Test if strin a hex value
    
        if match:                      
    
            if len(hex_string) == 4:                                # if hex code only 3 digit then expand it to 6 digit
                hex_string = webcolors.normalize_hex(hex_string)
    
            if len(hex_string) == 7:
                # Strips the newline characters and '#'
                hexCodeStr = hex_string.strip("#\r\n")
    
                # Convert hex to decimal
                r = int(hexCodeStr[0:2], 16)
                g = int(hexCodeStr[2:4], 16)
                b = int(hexCodeStr[4:6], 16)
    
                # normalize 0 to 1
                r_norm = r / 255
                g_norm = g / 255
                b_norm = b / 255
                rgb = f'rgb({r},{g},{b})'
                return r, g, b, r_norm, g_norm, b_norm, rgb
            else:
                print ("String is not valid: ", hex_string )
                
        else:
            print ('Hex is not valid: ', hex_string)
    
    def hex_to_name(hex_string):
    
        try:
            name = webcolors.hex_to_name(hex_string)
            return name
        except ValueError: 
            #print (f'{hex_string} has no defined color name in html4.')
            return "no css name"
    
    def rgb_to_hsl(r_norm, g_norm, b_norm):    
    
        # Convert RGB to HLS (more commonly known as HSL)
        h,l,s = colorsys.rgb_to_hls(r_norm, g_norm, b_norm)
        h *= 360
        s *= 100
        l *= 100
        hsl = f'hsl({h:0.0f}, {s:0.0f}%, {l:0.0f}%)'
        return h, s, l, hsl
    
    def rgb_to_hsv(r_norm, g_norm, b_norm):
        # Convert RGB to HSV
        h,s,v =  colorsys.rgb_to_hsv(r_norm, g_norm, b_norm)
        h *= 360
        s *= 100
        v *= 100
        hsv = f'hsv({h:0.0f}, {s:0.0f}%, {v:0.0f}%)'
        return h, s, v, hsv
    
    def grb_to_yiq(r_norm, g_norm, b_norm):
        # Convert RGB to YIQ
        y,i,q = colorsys.rgb_to_yiq(r_norm, g_norm, b_norm)
        return y, i, q
        
    

    Beispiel:

    Python
    # example for usage
    def print_codes_comma_delimiter(hex_string):
        # Output
        r, g, b, r_norm, g_norm, b_norm, rgb = hex_to_rgb(hex_string)
        h, s, l, hsl = rgb_to_hsl(r_norm, g_norm, b_norm)
        h, s, v, hsv = rgb_to_hsv(r_norm, g_norm, b_norm)
        y, i, q = grb_to_yiq(r_norm, g_norm, b_norm)
        name = hex_to_name(hex_string)
    
        print(f'{hex_string},"{name}","{rgb}","rgb({r},{g},{b})","{hsl}","hsl({h:0.0f}°, {s:0.1f}%, {l:0.1f}%)","{hsv}","hsv({h:0.0f}°, {s:0.1f}%, {v:0.1f}%)","yiq({y:0.4f},{i:0.4f},{q:0.4f})"')
    

  • Python Pakete updaten

    Python Pakete updaten

    PIP der Paketmanager unter Python kennt kein Update oder Upgrade von installierten Paketen. Das ist auch sinnvoll, wenn man in einer Virtual Umgebung (virtualenv) arbeitet. Aber wenn man alleine auf einer Umgebung arbeitet, wünscht man sich manchmal eine einfache Möglichkeit um alle Paket, die nicht mehr aktuell sind zu aktualisieren.

    Anzeigen und upgrade kann mit folgendem Script gemacht werden.

    Zuerst muss das Script installiert werden.

    pip install pip-upgrade-outdated

    Danach kann das Script einfach laufengelassen werden und alle Pakete werden upgegradet.

    pip_upgrade_outdated

    Hier noch die restlichen Parameter.

    usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD] [--serial | --parallel | --sequential] [--user] [--dry_run] [--verbose] [--version] [--exclude PKG]
    
    Upgrade outdated python packages with pip. Any unknown arguments will be passed to pip.
    
    options:
      -h, --help            show this help message and exit
      -3                    use pip3
      -2                    use pip2
      --pip_cmd PIP_CMD     use PIP_CMD (default pip)
      --serial, -s          upgrade in serial via a single batch pip upgrade command (default)
      --parallel, -p        upgrade in parallel via individual pip ugrade commands
      --sequential, -q      upgrade in serial via individual pip ugrade commands
      --user, -u            Adds the --user flag when installing the packages
      --dry_run, -n         get list, but don't upgrade
      --verbose, -v         may be specified multiple times
      --version             show program's version number and exit
      --exclude PKG, -x PKG
                            exclude PKG; may be specified multiple times
    


  • Streifenbilder erzeugen mit Python

    Streifenbilder erzeugen mit Python

    Die Idee von diesem Programm ist, bestehende Bilder in Streifen zu zerschneiden und dann wieder zufällig zusammenzusetzen.

    Original

    Nach der Bearbeitung

    Hier können noch mehr Beispiele gefunden werden

    Um dies zu erreichen, öffnet das Programm zunächst das Bild und berechnet dann die Breite und Höhe des Bildes.

    Anschliessend wird das Bild in die vorgegebene Anzahl an Streifen zerschnitten, entweder in horizontaler oder vertikaler Richtung.

    Danach werden die Streifen in zufälliger Reihenfolge wieder zusammengesetzt und ein neues Bild erstellt.

    Das Programm erzeugt dann einen eindeutigen Dateinamen und speichert das neue Bild.

    Python
    import PIL import Image
    import random
    import uuid
    
    def horizontal_strips (img, width, height, num_strips):
    
        # Calculate the strip height
        strip_height = int(height/num_strips)
    
        strips = []
        for i in range(num_strips):
            # Get the current strip
            box = (0, i*strip_height, width, (i+1)*strip_height)
            strip = img.crop(box)
            strips.append(strip)
    
        return strip_height, strips
    
    
    def vertical_strips (img, width, height, num_strips):
    
        # Calculate the strip width
        strip_width = int(width/num_strips)
    
        strips = []
        for i in range(num_strips):
            # Get the current strip
            box = (i*strip_width, 0, (i+1)*strip_width, height)
            strip = img.crop(box)
            strips.append(strip)
    
        return strip_width, strips
    
    def main(inFile, num_strips, direction):
        try:
            # Open the image
            img = Image.open(inFile)    
        except:
            print("Something went wrong when opening the file: ", inFile) 
    
        # Get the height and width of the image
        width, height = img.size
    
        if (direction == "h"):
            strip_dim, strips = horizontal_strips (img, width, height, num_strips)
        else:
            strip_dim, strips = vertical_strips (img, width, height, num_strips)
    
        # Shuffle the strips
        random.shuffle(strips)
    
        # Reassemble the image
        reassembled_img = Image.new('RGB', (width, height))
    
        # for i in range num_strips:
        offset = 0
        for strip in strips:
            if (direction == "h"):
                reassembled_img.paste(strip, (0, offset))
            else:
                reassembled_img.paste(strip, (offset, 0))
    
            offset += strip_dim
    
        # make Filename
        id = str(uuid.uuid4())
        # Save the reassembled image
        reassembled_img.save(f'reassembled_image-{id}.jpg')
    
    if __name__ == "__main__":
        # ------- Init -------
        inFile = "berg.jpg" # Filename of input File 
        num_strips = 12     # Define the number of strips
        direction = "v"     # corp direction h = horizontal or v = vertical
    
        main(inFile, num_strips, direction)


  • Eindeutiger Filename in Python

    Eindeutiger Filename in Python

    Falls Sie kurze eindeutige IDs als Dateinamen oder für andere Fälle benötigen, versuchen Sie shortuuid. shortuuid verwendet Klein- und Grossbuchstaben und Ziffern und entfernt ähnlich aussehende Zeichen wie
    l, 1, I, O und 0.

    Das Paket shortuuid muss über den Paketmanager nachinstalliert werden.

    pip install shortuuid

    Danach kann das Paket verwendet werden.

    >>> import shortuuid
    >>> shortuuid.uuid()
    'Tw8VgM47kSS5iX2m8NExNa'
    >>> len(ui)
    22
    

    Wenn man shortuuid nicht installieren will, kann man auch das Modul uuid verwenden, welches viel längere Strings erzeugt.

    Das Modul uuid ist Bestandteil der Python Distribution.

    >>> import uuid
    >>> unique_filename = str(uuid.uuid4())
    >>> len(unique_filename)
    36
    >>> unique_filename
    '2d303ad1-79a1-4c1a-81f3-beea761b5fdf'