]> granicus.if.org Git - imagemagick/commitdiff
Minor updates
authoranthony <anthony@git.imagemagick.org>
Thu, 27 May 2010 02:14:36 +0000 (02:14 +0000)
committeranthony <anthony@git.imagemagick.org>
Thu, 27 May 2010 02:14:36 +0000 (02:14 +0000)
magick/morphology.c
magick/morphology.h
magick/option.c

index aec901cadc4d49ba65f9140c6f4bfff648eaa834..008dea0d98aa18bc897518edf39187d4051887ee 100644 (file)
@@ -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,
index 3cb2565194db9e5ad690629e0fdee64090303d88..310cbadbff15437a0c967fcacf7cd5aee0617166 100644 (file)
@@ -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;
 
index 8f11d18569f3e3083080173c0a1da08656d6b0f0..daab07f60122b3186cd1b2720c25e0106d4ba655 100644 (file)
@@ -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 }
   },