Darstellung mit Farbtabellen

In diesem Beispiel wenden Sie Farbtabellen auf Grauwertbilder an. Sie nutzen im Wesentlichen die folgenden Funktionen:

Erklärung

Es gibt mehrere Gründe, warum Sie eine Farbtabelle auf ein monochromes Bild anwenden wollen. Dazu zählen z. B. eine angenehmere Optik und eine für das menschliche Auge klarere Darstellung des Wertebereichs. Dies ist vor allem für 16-Bit Bilder relevant, da das Wertespektrum wesentlich besser erkennbar ist, wenn es auf drei Farbkanäle verteilt wird.

Je nach Anwendungsfall möchten Sie verschiedene Farbtabellen verwenden. TwinCAT Vision stellt über das Enum ETcVnColorMap einige vordefinierte Farbverläufe zur Verfügung. Ebenso können Sie eigene Farbverläufe definieren und daraus Farbtabellen erstellen.

In diesem Beispiel wenden Sie verschiedene Farbtabellen auf den folgenden Grauwertverlauf (mit einem Wertebereich von 16 Bit) an.

Darstellung mit Farbtabellen 1:
Grauwertverlauf

Selbstverständlich können sie auch eigene Bilder verwenden. Achten Sie darauf, dass Sie nur 1-kanlige Bilder verwenden können bzw. vorher eine entsprechende Konvertierung mittels F_VN_ConvertColorSpace durchführen müssen.

Programm

Bevor eine Farbtabelle auf ein Bild angewandt werden kann, muss sie erst erstellt werden. Dazu muss bekannt sein, ob die Farbtabelle für 8-Bit oder 16-Bit Bilder sein soll, da sie abhängig davon verschieden viele Einträge benötigt (siehe Farbtabellen). Dementsprechend müssen Sie den Parameter eColorMapSize vom Typ ETcVnColorMapSize bei 8 Bit auf 256 und bei16 Bit auf 65536 passend zur Bittiefe des Eingangsbildes ipImageIn setzen. Sie erreichen dies durch eine Abfrage der Elementgröße des Pixelformats mittels F_VN_GetImageInfo:

hr := F_VN_GetImageInfo(ipImageIn, stImageInfo, hr);
IF stImageInfo.stPixelFormat.nElementSize = 8 THEN
    eColorMapSize := TCVN_CMS_256;
ELSIF stImageInfo.stPixelFormat.nElementSize = 16 THEN
    eColorMapSize := TCVN_CMS_65536;
END_IF

Das Generieren einer Farbtabelle erfolgt anhand eines Farbverlaufs, den Sie entweder manuell definieren oder aus einer Vorlage verwenden. Dieses Beispiel nimmt die Unterscheidung anhand des Parameters bUseCustomColors vor.

IF bUseCustomColors THEN
    // create color map from custom-defined colors
    <...>
ELSE
    // create color map from preset
    <...>
END_IF

Sie definieren einen Farbverlauf manuell, indem Sie einen Container mit mehreren Einträgen vom Typ TcVnVector3_REAL erstellen. Jeder Eintrag stellt eine Farbe dar. Die Farben werden beim Erstellen der Farbtabelle als gleichverteilt über den Definitionsbereich interpretiert; alle übrigen Werte werden für jeden der drei Kanäle linear interpoliert. Hier wird ein Farbverlauf aus dem Array aColors mit den drei Farben Rot, Grün und Blau verwendet. Sie erstellen die Farbtabelle dann mit der Funktion F_VN_GenerateCustomColorMap.

VAR
    aColors: ARRAY [0..(N_COLORS-1)] OF TcVnVector3_REAL := [
        [255, 0, 0],
        [0, 255, 0],
        [0, 0, 255]

    ];
END_VAR

hr := F_VN_CreateContainerFromArray(ADR(aColors), ipColors, ContainerType_Vector_TcVnVector3_REAL, N_COLORS, hr);
hr := F_VN_GenerateCustomColorMap(
    ipColorMap      :=  ipColorMap,
    ipInitialColors :=  ipColors,
    eColorMapSize   :=  eColorMapSize,
    hrPrev          :=  hr
);

Um einen vordefinierten Farbverlauf zu verwenden, nutzen Sie die Funktion F_VN_GenerateColorMap und setzen den Parameter eColorMap auf den gewünschten Farbverlauf aus dem Enum ETcVnColorMap. Hier ist dieser initial auf JET gesetzt.

VAR
    eColorMap: ETcVnColorMap := TCVN_CM_JET;
END_VAR

hr := F_VN_GenerateColorMap(
    ipColorMap      :=  ipColorMap,
    eColorMap       :=  eColorMap,
    eColorMapSize   :=  eColorMapSize,
    hrPrev          :=  hr
);

Die erstellte Farbtabelle ist ein Container, der für jeden möglichen Wert im Eingangsbild eine zu vergebende Farbe gespeichert hat. Daher können Sie eine Farbtabelle auch selbst erstellen, indem Sie alle 256 bzw. 65536 Einträge festlegen und daraus direkt einen Container erstellen. In den meisten Fällen ist die Verwendung der API-Funktionen jedoch einfacher.

Schließlich wenden Sie die erstellte Farbtabelle auf das Eingangsbild an und erhalten das gewünschte Ergebnis. Das Ergebnisbild immer ein 3-kanaliges 8-Bit Bild.

hr := F_VN_ApplyColorMap(
    ipSrcImage      :=  ipImage,
    ipDestImage     :=  ipImage,
    ipColorMap      :=  ipColorMap,
    hrPrev          :=  hr
);

Die Anwendung der vordefinierten JET-Farbtabelle auf das oben gezeigte Eingangsbild erzeugt folgendes Ergebnis:

Darstellung mit Farbtabellen 2:
Farbverlauf als Ergebnis nach Anwendung der JET-Farbtabelle