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: