% 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
}
case RidgesKernel:
{
- kernel=ParseKernelArray("3: -,-,- 0,1,0 -,-,-");
+ kernel=ParseKernelArray("3: 0,1,0 ");
if (kernel == (KernelInfo *) NULL)
return(kernel);
kernel->type = 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:
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");
#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:
{
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,
{ "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 }
},