Masken

Dieses Kapitel beschreibt die Bedeutung von Masken in TwinCAT Vision.

Was ist eine Maske?

Bezogen auf die Bildverarbeitung meint eine Maske eines Maskenbild, welches zu einem anderen Bild gehört. Das Maskenbild hat die gleiche Größe und besteht aus einem Grauwert-Kanal. Die Intensitäten des Maskenbildes definieren, welche Pixel des zugehörigen Bildes für bestimmte Arbeitsschritte berücksichtigt werden sollen.

Wofür wird eine Maske benötigt?

Bilder sind ohne Weiteres auf eine rechteckige Form begrenzt. Wenn bei Bildoperation andere Formen als Rechtecke festgelegt werden sollen, dann kann dies mittels einer Maske umgesetzt werden. Die Maske wird dabei durch ein weiteres Bild in gleicher Form und Größe dargestellt, auf dem die zu berücksichtigen Bereiche (Pixel) anders gekennzeichnet werden.

Wie wird eine Maske technisch dargestellt?

Die Intensitäten des Masken-Grauwert-Bildes beschreiben, welche Pixel berücksichtigt werden sollen. Die Interpretation der Intensitäten kann prinzipiell von Funktion zu Funktion abweichen. Häufig werden binär alle 0-wertigen Pixel als nicht zu berücksichtigen und alle anderswertigen Pixel (>=1) als zu berücksichtigen interpretiert. Es sind jedoch auch Fälle denkbar, in denen der Grad der Berücksichtigung feingranularer eingestellt werden kann.

Eine Maske, die den Betrachtungsbereich auf eine kreisförmige Fläche im Bild einschränkt, kann z. B. so aussehen:

Masken 1:

Bei Anwendung dieser Maske haben die Pixel in den Ecken eines zugehörigen Bildes keinen Einfluss mehr auf eine folgende Operation.

Beispiel

Beispielhaft wird zu dem Bild ipImageWork eine Maske erstellt, die besagt, dass nur ein Kreisbereich des Bildes zu berücksichtigen ist:

hr := F_VN_GetImageWidth(ipImageWork, nWidth, hr);
hr := F_VN_GetImageHeight(ipImageWork, nHeight, hr);

hr := F_VN_CreateImage(ipImageMask, nWidth, nHeight, TCVN_ET_USINT, 1, hr);
hr := F_VN_SetPixels(ipImageMask, aColorBlack, hr);
hr := F_VN_DrawCircle(nWidth/2, nHeight/2, MIN(nWidth, nHeight)/2, ipImageMask, aColorWhite, -1, hr);

Daraufhin wird der durchschnittliche Intensitätswert des Bildes innerhalb des Maskenbereichs berechnet:

hr := F_VN_ImageAverageExp(ipImageWork, aAverage, ipImageMask, hr);
fAverageIntensityInCircle := aAverage[0];

Ohne Maske wäre es nicht ohne weiteres möglich, den Durchschnittswert auf den Kreisbereich einzuschränken, anstatt das vollständige rechteckige Bild zu berücksichtigen.

Das vollständige Beispiel finden Sie hier: Durchschnittsintensität in beliebigen Formen.