Weichzeichnungsfilter

In diesem Beispiel werden folgende Weichzeichnungsfilter verglichen:

Erläuterung

In manchen Fällen soll ein Bild geglättet bzw. von Rauschen befreit werden. Bei Aufgaben wie Code Reading ist es gleichzeitig nötig, einen guten Kontrast und gute Kanten auf dem Bild zu erhalten, damit die nachfolgenden Algorithmen erfolgreich darauf arbeiten können.

Für die Kombination von Bildglättung bei gleichzeitigem Erhalt von Kanten eignet sich der Bilateral-Filter besonders gut. Er berechnet für jede Pixelintensität einen gewichteten Durchschnittswert der umliegenden Pixel, wobei die Gewichtung nicht nur von der Entfernung eines Pixels, sondern ebenfalls von dem Intensitätsunterschied abhängt. Dadurch bleiben scharfe Kanten erhalten.

Der Gauß-Filter glättet Bilder mit Hilfe einer zweidimensionalen diskreten Annäherung an die Gauß’sche Glockenfunktion. Dadurch kann das Bildrauschen vermindert werden, wobei kleinere Strukturen verloren gehen, gröbere Strukturen bleiben dagegen erhalten. Kanten verwischen daher weniger als bei den beiden nachfolgenden Filtern, größere Störungen werden jedoch nicht so gut entfernt.

Der Median-Filter sortiert alle Pixelwerte der vorgegebenen Maske aufsteigend und wählt dann den Median (den mittleren) Wert aus, auf den das entsprechende Pixel dann gesetzt wird. Dieser Filter ist gut geeignet, um Strukturen (Störungen) zu unterdrücken, die kleiner als die angewendete Filtermaske sind und verhält sich sehr robust gegenüber Ausreißern. Dadurch werden z. B. die kleinen Salz- und Pfeffer-Störungen am besten entfernt, was aber den Nachteil hat, dass dadurch auch die anderen Detailinformationen verloren gehen.

Zur Realisierung einer Mittelwertbildung (Mean) wurde die Custom-Filter Funktion verwendet. Dabei wird der Wert jedes Pixels durch den Mittelwert der Kernel-Pixel ersetzt, wodurch ein Weichzeichnen bewirkt wird. Dadurch werden Störungen (Rauschen) unterdrückt, Details und Kanten verschmieren aber allmählich mit steigender Kernelanzahl. Da die Custom Filter-Funktion viele verschiedene Möglichkeiten bietet eigene Filter anzuwenden, wird zur Standardisierung des Filter-Kernels noch die F_VN_InitMatrixStruct Funktion benötigt.

Variablen

// Bilateral Filter
ipImageBilateral         :   ITcVnImage;
ipImageBilateralDisp     :   ITcVnDisplayableImage;
nBilateral_Diameter      :   DINT  := 7;
fBilateral_SigmaColor    :   LREAL := 100;
fBilateral_SigmaSpace    :   LREAL := 100;

// Gaussian Filter
ipImageGaussian          :   ITcVnImage;
ipImageGaussianDisp      :   ITcVnDisplayableImage;
nFilterWidth             :   UDINT := 7;
nFilterHeight            :   UDINT := 7;

// Median Filter
ipImageMedian            :   ITcVnImage;
ipImageMedianDisp        :   ITcVnDisplayableImage;
nMedian_FilterSize       :   UDINT := 7;

// Custom Filter e.g. Mean
ipImageCustom            :   ITcVnImage;
ipImageCustomDisp        :   ITcVnDisplayableImage;
stKernelMatrix           :   TcVnMatrix;
// 7x7 Mean Filter Kernel with weights of 1/49 ~ 0.0204081632653
aMatrixArray7x7          :   ARRAY [0..6,0..6] OF REAL := [49(0.0204081632653)];

Code

hr := F_VN_BilateralFilter(
        ipSrcImage      := ipImageIn,
        ipDestImage     := ipImageBilateral,
        nDiameter       := nBilateral_Diameter,
        fSigmaColor     := fBilateral_SigmaColor,
        fSigmaSpace     := fBilateral_SigmaSpace,
        hrPrev          := hr);

hr := F_VN_GaussianFilter(
        ipSrcImage      := ipImageIn,
        ipDestImage     := ipImageGaussian,
        nFilterWidth    := nFilterWidth,
        nFilterHeight   := nFilterHeight,
        hrPrev          := hr);

hr := F_VN_MedianFilter(
        ipSrcImage      := ipImageIn,
        ipDestImage     := ipImageMedian,
        nFilterSize     := nMedian_FilterSize,
        hrPrev          := hr);

// Mean-Filter with Custom Filter Function
hr := F_VN_InitMatrixStruct(
        pSrcBuffer      := ADR(aMatrixArray7x7),
        stDestMatrix    := stKernelMatrix,
        nRows           := 7,
        nCols           := 7,
        eElementType    := TCVN_ET_REAL,
        hrPrev          := hr);

hr := F_VN_CustomFilter(
        ipSrcImage      := ipImageIn,
        ipDestImage     := ipImageCustom,
        eDestDepth      := TCVN_ET_USINT,
        stKernel        := stKernelMatrix,
        hrPrev          := hr);

Ergebnis

Das unbearbeitete Originalbild (1. Zeile) weist im Detail bereits feine Strukturen auf den Oberflächen der Zahnräder auf. Um die Filterwirkungen zu verdeutlichen, wurden zusätzliche Störungen durch ein Gauss- (2. Zeile) und ein Salz- und Pfeffer-Rauschen (3. Zeile) zu dem Originalbild hinzugefügt.

Damit die Wirkung der verschiedenen Filter möglichst vergleichbar ist, wird bei allen eine Kernelgröße von 7 x 7 verwendet. Durch andere Parameterwerte oder Kernelgrößen, sowie weitere Einstellmöglichkeiten bei den EXP-Varianten der Funktionen lassen sich im Einzelnen auch noch andere Wirkungen erzielen. Da die Filterwirkung stark vom Inhalt des Eingangsbildes abhängt, empfiehlt es sich, mehrere Filter mit verschiedenen Parametereinstellungen zu testen, um dann direkt zu vergleichen und den besten Filter für den Anwendungsfall zu finden. In der folgenden Tabelle erhalten Sie eine Übersicht über die Ergebnisbilder:

Originalbilder

Bilateraler Filter

Gauss-Filter

Median-Filter

Mean-Filter

Weichzeichnungsfilter 1:

Weichzeichnungsfilter 2:

Weichzeichnungsfilter 3:

Weichzeichnungsfilter 4:

Weichzeichnungsfilter 5:

Weichzeichnungsfilter 6:

Weichzeichnungsfilter 7:

Weichzeichnungsfilter 8:

Weichzeichnungsfilter 9:

Weichzeichnungsfilter 10:

Weichzeichnungsfilter 11:

Weichzeichnungsfilter 12:

Weichzeichnungsfilter 13:

Weichzeichnungsfilter 14:

Weichzeichnungsfilter 15:

Hinweis

Hohe oder schwankende Ausführungszeiten

Die Dauer der Ausführung eines Filters hängt im Wesentlichen vom Typ des Filters, sowie der Bild- und Kernelgröße ab. Beachten Sie daher, dass eine Filteroperation wesentlich mehr Zeit in Anspruch nehmen kann als andere Funktionen, passen Sie daher die Zykluszeit der Task entsprechend an.

Wenn die Filterparameter während der Laufzeit verändert werden, insbesondere die Kernelgröße, ist es empfehlenswert Watchdogs zu verwenden. Beim Median Filter kann die Laufzeit prinzipbedingt immer etwas schwanken.

Weiterhin können Job-Tasks zu einer Reduzierung der Gesamtrechenzeit führen, was in Abhängigkeit des Systems zu testen ist.