From a648a30f450f8140fd3d71ece1f335191fb3d33a Mon Sep 17 00:00:00 2001 From: anthony Date: Thu, 27 May 2010 02:14:36 +0000 Subject: [PATCH] Minor updates --- magick/morphology.c | 73 +++++++++++++++++++++++++++++++++++++++++---- magick/morphology.h | 2 ++ magick/option.c | 4 ++- 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/magick/morphology.c b/magick/morphology.c index aec901cad..008dea0d9 100644 --- a/magick/morphology.c +++ b/magick/morphology.c @@ -792,6 +792,8 @@ MagickExport KernelInfo *AcquireKernelInfo(const char *kernel_string) % Find single pixel ridges or thin lines % Ridges2 % Find 2 pixel thick ridges or lines +% Ridges3 +% Find 2 pixel thick diagonal ridges (experimental) % LineEnds % Find end points of lines (for pruning a skeletion) % LineJunctions @@ -1557,7 +1559,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type, } case RidgesKernel: { - kernel=ParseKernelArray("3: -,-,- 0,1,0 -,-,-"); + kernel=ParseKernelArray("3: 0,1,0 "); if (kernel == (KernelInfo *) NULL) return(kernel); kernel->type = type; @@ -1573,14 +1575,58 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type, return(kernel); kernel->type = type; ExpandKernelInfo(kernel, 90.0); /* 4 rotated kernels */ - /* append second set of 4 kernels */ +#if 0 + /* 2 pixel diagonaly thick - 4 rotates - not needed? */ new_kernel=ParseKernelArray("4x4^:0,-,-,- -,1,-,- -,-,1,- -,-,-,0'"); if (new_kernel == (KernelInfo *) NULL) return(DestroyKernelInfo(kernel)); new_kernel->type = type; ExpandKernelInfo(new_kernel, 90.0); /* 4 rotated kernels */ LastKernelInfo(kernel)->next = new_kernel; - break; +#endif + /* kernels to find a stepped 'thick' line - 4 rotates * mirror */ + /* Unfortunatally we can not yet rotate a non-square kernel */ + /* But then we can't flip a non-symetrical kernel either */ + new_kernel=ParseKernelArray("4x3+1+1:0,1,1,- -,1,1,- -,1,1,0"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("4x3+2+1^:0,1,1,- -,1,1,- -,1,1,0"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("4x3+1+1^:-,1,1,0 -,1,1,- 0,1,1,-"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("4x3+2+1^:-,1,1,0 -,1,1,- 0,1,1,-"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("3x4+1+1^:0,-,- 1,1,1 1,1,1 -,-,0"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("3x4+1+2^:0,-,- 1,1,1 1,1,1 -,-,0"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("3x4+1+1^:-,-,0 1,1,1 1,1,1 0,-,-"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; + new_kernel=ParseKernelArray("3x4+1+2^:-,-,0 1,1,1 1,1,1 0,-,-"); + if (new_kernel == (KernelInfo *) NULL) + return(DestroyKernelInfo(kernel)); + new_kernel->type = type; + LastKernelInfo(kernel)->next = new_kernel; break; } case LineEndsKernel: @@ -1640,7 +1686,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type, break; } case SkeletonKernel: - { /* what is the best form for medial axis skeletonization? */ + { /* what is the best form for skeletonization by thinning? */ #if 0 # if 0 kernel=AcquireKernelInfo("Corners;Edges"); @@ -1657,6 +1703,23 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type, #endif break; } + case MatKernel: /* experimental - MAT from a Distance Gradient */ + { + KernelInfo + *new_kernel; + /* Ridge Kernel but without the diagonal */ + kernel=ParseKernelArray("3x1: 0,1,0"); + if (kernel == (KernelInfo *) NULL) + return(kernel); + kernel->type = RidgesKernel; + ExpandKernelInfo(kernel, 90.0); /* 2 rotated kernels (symmetrical) */ + /* Plus the 2 pixel ridges kernel - no diagonal */ + new_kernel=AcquireKernelBuiltIn(Ridges2Kernel,args); + if (new_kernel == (KernelInfo *) NULL) + return(kernel); + LastKernelInfo(kernel)->next = new_kernel; + break; + } /* Distance Measuring Kernels */ case ChebyshevKernel: { @@ -3541,7 +3604,7 @@ MagickExport void ShowKernelInfo(KernelInfo *kernel) MagickOptionToMnemonic(MagickKernelOptions, k->type) ); if ( fabs(k->angle) > MagickEpsilon ) fprintf(stderr, "@%lg", k->angle); - fprintf(stderr, "\" of size %lux%lu%+ld%+ld ", + fprintf(stderr, "\" of size %lux%lu%+ld%+ld", k->width, k->height, k->x, k->y ); fprintf(stderr, diff --git a/magick/morphology.h b/magick/morphology.h index 3cb256519..310cbadbf 100644 --- a/magick/morphology.h +++ b/magick/morphology.h @@ -57,9 +57,11 @@ typedef enum LineJunctionsKernel, ConvexHullKernel, SkeletonKernel, + MatKernel, ChebyshevKernel, /* Distance Measuring Kernels */ ManhattenKernel, EuclideanKernel, + TestKernel, /* Kernel being tested as posible addition */ UserDefinedKernel /* User Specified Kernel Array */ } KernelInfoType; diff --git a/magick/option.c b/magick/option.c index 8f11d1856..daab07f60 100644 --- a/magick/option.c +++ b/magick/option.c @@ -1078,14 +1078,16 @@ static const OptionInfo { "Edges", (long) EdgesKernel, MagickFalse }, { "Corners", (long) CornersKernel, MagickFalse }, { "Ridges", (long) RidgesKernel, MagickFalse }, - { "Ridges2", (long) RidgesKernel, MagickFalse }, + { "Ridges2", (long) Ridges2Kernel, MagickFalse }, { "LineEnds", (long) LineEndsKernel, MagickFalse }, { "LineJunctions", (long) LineJunctionsKernel, MagickFalse }, { "ConvexHull", (long) ConvexHullKernel, MagickFalse }, { "Skeleton", (long) SkeletonKernel, MagickFalse }, + { "Mat", (long) MatKernel, MagickTrue }, /* experimental */ { "Chebyshev", (long) ChebyshevKernel, MagickFalse }, { "Manhatten", (long) ManhattenKernel, MagickFalse }, { "Euclidean", (long) EuclideanKernel, MagickFalse }, + { "Test", (long) TestKernel, MagickTrue }, /* for experimental kernels */ { "User Defined", (long) UserDefinedKernel, MagickTrue }, /* internel */ { (char *) NULL, (long) UndefinedKernel, MagickFalse } }, -- 2.50.1