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.
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: