photomappe.de

Python in Gimp: Channel-Mixer

Mit dem Channel-Mixer (Colors - Components - Channel-Mixer / Farben - Komponenten - Kanalmixer) lassen sich in Gimp aus Farbbildern besser Schwarzweissbilder erzeugen als über die Funktion Desaturate (Colors - Desaturate / Farben - Entättigen). Die individuellen Möglichkeiten sind viel besser.

In Python-Fu bzw. in dem Procedure Browser wird die Funktion allerdings ohne das Flag Preserve luminosity (Leuchtstärke erhalten) aufgeführt, man kann dies also nicht in einem Script setzen (Falls ich da falsch liege bitte ich um Nachricht).

Was macht also dieses Flag?
Eine Suche im Internet fördert folgendes zutage: Die Summe der einzelnen Kanalwerte wird auf 100% begrenzt, egal was dort eingestellt wird.
Sollten alle Kanäle (Rot, Grün; Blau) gleich berücksichtigt werden dann wäre bereits bei 33,3% pro Kanal diese Bedingung erfüllt.

Also müssen die einzelnen Werte nur vor dem Aufruf der Funktion plug_in_colors_channel_mixer umgerechnet werden.

def channel_mixer(workimg, rg, gg, bg, blacknwhite=True):
    """
    Umrechnung der einzelnen Werte pro Farbkanal um das Verhalten
    des Flags "preserve luminosity (Leuchtstärke erhalten)
    in Python-Fu nachzuempfinden.
    Summe der Kanalwerte bilden und dann die einzelnen Werte
    als Teil von 100% berechnen.
    """
    channel_sum = rg + gg + (bg * 1.0)
    rg /= channel_sum
    gg /= channel_sum
    bg /= channel_sum
    drawable = pdb.gimp_image_get_active_drawable(workimg)
    pdb.plug_in_colors_channel_mixer(workimg, drawable, blacknwhite,
                                     rg, gg, bg, rg, gg, bg, rg, gg, bg)
    
Die Funktion chanel_mixer kann jetzt mit dem geladenen Bild und den gewünschten Werten für die Anteile Rot, Grün und Blau aufgerufen werden. z.B.:
import os

# Das Bild soll im Homeverzeichnis des Users liegen
srcdir = os.path.expanduser('~')
filename = 'der Name des zu ladenen Bildes...'

# Bild laden
image = pdb.file_jpeg_load(os.path.join(srcdir, filename), '')
# Darstellung des Bildes oeffnen
pdb.gimp_display_new(image)
# und konvertieren
channel_mixer(image, 1.0, 2.0, 1.0)