Kantendetektionsfilter

In diesem Beispiel werden folgende Kantendetektionsfilter verglichen:

Erläuterung

Der Sobel-Filter ist ein einfacher linearer Filter, um Gradienten in einem Bild zu markieren. Der Scharr-Filter ist dazu sehr ähnlich; lediglich die Ausprägung des Filter-Kernels ist etwas anders. Der Scharr-Filter hat eine bessere Isotropie, d. h. die Detektion von Kanten ist richtungsunabhängig.

Der Laplace-Filter detektiert Kanten basierend auf den Nullstellen der diskreten 2. Ableitung des Bildes. Dieses Verfahren ist vergleichsweise rauschanfällig.

Variablen

// Sobel
ipImageSobel         :   ITcVnImage;
ipImageSobelDisp     :   ITcVnDisplayableImage;
eSobel_DestDepth     :   ETcVnElementType := TCVN_ET_USINT;
aSobel_DerivOrder    :   ARRAY [0..1] OF UDINT := [1, 1];
nSobel_KernelSize    :   UDINT := 3;
fSobel_Scale         :   LREAL := 10;
fSobel_Delta         :   LREAL := 0;
eSobel_BorderExtra   :   ETcVnBorderInterpolationMethod := TCVN_BIM_DEFAULT;

// Scharr
ipImageScharr        :   ITcVnImage;
ipImageScharrDisp    :   ITcVnDisplayableImage;
eScharr_DestDepth    :   ETcVnElementType := TCVN_ET_USINT;
eScharr_FilterDir    :   ETcVnFilterDirection := TCVN_FD_X;
fScharr_Scale        :   LREAL := 1;
fScharr_Delta        :   LREAL := 0;
eScharr_BorderExtra  :   ETcVnBorderInterpolationMethod := TCVN_BIM_DEFAULT;

// Laplace
ipImageLaplace       :   ITcVnImage;
ipImageLaplaceDisp   :   ITcVnDisplayableImage;
eLaplace_DestDepth   :   ETcVnElementType := TCVN_ET_USINT;
nLaplace_KernelSize  :   UDINT := 3;
fLaplace_Scale       :   LREAL := 10;
fLaplace_Delta       :   LREAL := 0;
eLaplace_BorderExtra :   ETcVnBorderInterpolationMethod := TCVN_BIM_DEFAULT;

Code

// Execute the Sobel Filter 
hr := F_VN_SobelFilterExp(
         ipSrcImage   := ipImageIn
         ipDestImage  := ipImageSobel,
         eDestDepth   := eSobel_DestDepth,
         nXOrder      := aSobel_DerivOrder[0],
         nYOrder      := aSobel_DerivOrder[1],
         nKernelSize  := nSobel_KernelSize,
         fScale       := fSobel_Scale,
         fDelta       := fSobel_Delta,
         eBorderType  := eSobel_BorderExtra,
         hrPrev       := hr);

// Execute the Scharr Filter
hr := F_VN_ScharrFilterExp(
         ipSrcImage      := ipImageIn,
         ipDestImage     := ipImageScharr,
         eDestDepth      := eScharr_DestDepth,
         eFilterDirection:= eScharr_FilterDir,
         fScale          := fScharr_Scale,
         fDelta          := fScharr_Delta,
         eBorderType     := eScharr_BorderExtra,
         hrPrev          := hr);

// Execute the Laplacian Filter
hr := F_VN_LaplacianFilterExp(
         ipSrcImage   := ipImageIn,
         ipDestImage  := ipImageLaplace,
         eDestDepth   := eLaplace_DestDepth,
         nKernelSize  := nLaplace_KernelSize,
         fScale       := fLaplace_Scale,
         fDelta       := fLaplace_Delta,
         eBorderType  := eLaplace_BorderExtra,
         hrPrev       := hr);

Ergebnisse

Das Beispielprojekt enthält die Funktionsaufrufe der drei Filter. Die Parameter-Konfiguration und deren Auswirkung auf ein Beispielbild können in diesem Beispiel ausprobiert werden.

Originalbild

Sobel-Filter

Scharr-Filter

Laplace-Filter

Kantendetektionsfilter 1:

Kantendetektionsfilter 2:

Kantendetektionsfilter 3:

Kantendetektionsfilter 4: