Lines Matching full:kernel
45 % generation of many different types of kernel arrays from user supplied
46 % arguments. Prehaps even the generation of a kernel from a small image.
95 /* Integer Factorial Function - for a Binomial kernel */
118 /* Quick function to find last kernel in a kernel list */
119 static inline KernelInfo *LastKernelInfo(KernelInfo *kernel) in LastKernelInfo() argument
121 while (kernel->next != (KernelInfo *) NULL) in LastKernelInfo()
122 kernel=kernel->next; in LastKernelInfo()
123 return(kernel); in LastKernelInfo()
138 % user) and converts it into a Morphology/Convolution Kernel. This allows
139 % users to specify a kernel from a number of pre-defined kernels, or to fully
140 % specify their own kernel for a specific Convolution or Morphology
143 % The kernel so generated can be any rectangular array of floating point
148 % center as origin, this is no longer the case, and any rectangular kernel
152 % The floating point values in the kernel can also include a special value
154 % of the kernel array. This allows you to shaped the kernel within its
155 % rectangular area. That is 'nan' values provide a 'mask' for the kernel
157 % working of a kernel.
159 % The returned kernel should be freed using the DestroyKernelInfo() when you
162 % Input kernel defintion strings can consist of any of three types.
169 % a kernel of size W by H, with W*H floating point numbers following.
177 % square kernel. At least 9 values should be provided for a 3x3
178 % square kernel, 25 for a 5x5 square kernel, 49 for 7x7, etc.
184 % " kernel ; kernel ; kernel ; "
186 % Any extra ';' characters, at start, end or between kernel defintions are
189 % The special flags will expand a single kernel, into a list of rotated
190 % kernels. A '@' flag will expand a 3x3 kernel into a list of 45-degree
193 % reflected kernel before the +/- 90-degree rotations, which can be important
197 % new kernel specification has a ':' character in its specification string.
199 % numbers generating a odd-sized square kernel has been given.
207 % o kernel_string: the Morphology/Convolution kernel wanted.
217 *kernel; in ParseKernelArray() local
238 kernel=(KernelInfo *) AcquireMagickMemory(sizeof(*kernel)); in ParseKernelArray()
239 if (kernel == (KernelInfo *) NULL) in ParseKernelArray()
240 return(kernel); in ParseKernelArray()
241 (void) memset(kernel,0,sizeof(*kernel)); in ParseKernelArray()
242 kernel->minimum = kernel->maximum = kernel->angle = 0.0; in ParseKernelArray()
243 kernel->negative_range = kernel->positive_range = 0.0; in ParseKernelArray()
244 kernel->type = UserDefinedKernel; in ParseKernelArray()
245 kernel->next = (KernelInfo *) NULL; in ParseKernelArray()
246 kernel->signature=MagickCoreSignature; in ParseKernelArray()
248 return(kernel); in ParseKernelArray()
250 /* find end of this specific kernel definition string */ in ParseKernelArray()
255 /* clear flags - for Expanding kernel lists thorugh rotations */ in ParseKernelArray()
258 /* Has a ':' in argument - New user kernel specification in ParseKernelArray()
277 kernel->width = (size_t)args.rho; in ParseKernelArray()
278 kernel->height = (size_t)args.sigma; in ParseKernelArray()
282 return(DestroyKernelInfo(kernel)); in ParseKernelArray()
283 kernel->x = ((flags & XValue)!=0) ? (ssize_t)args.xi in ParseKernelArray()
284 : (ssize_t) (kernel->width-1)/2; in ParseKernelArray()
285 kernel->y = ((flags & YValue)!=0) ? (ssize_t)args.psi in ParseKernelArray()
286 : (ssize_t) (kernel->height-1)/2; in ParseKernelArray()
287 if ( kernel->x >= (ssize_t) kernel->width || in ParseKernelArray()
288 kernel->y >= (ssize_t) kernel->height ) in ParseKernelArray()
289 return(DestroyKernelInfo(kernel)); in ParseKernelArray()
294 { /* ELSE - Old old specification, forming odd-square kernel */ in ParseKernelArray()
305 /* set the size of the kernel - old sized square */ in ParseKernelArray()
306 kernel->width = kernel->height= (size_t) sqrt((double) i+1.0); in ParseKernelArray()
307 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in ParseKernelArray()
313 /* Read in the kernel values from rest of input string argument */ in ParseKernelArray()
314 kernel->values=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory( in ParseKernelArray()
315 kernel->width,kernel->height*sizeof(*kernel->values))); in ParseKernelArray()
316 if (kernel->values == (MagickRealType *) NULL) in ParseKernelArray()
317 return(DestroyKernelInfo(kernel)); in ParseKernelArray()
318 kernel->minimum=MagickMaximumValue; in ParseKernelArray()
319 kernel->maximum=(-MagickMaximumValue); in ParseKernelArray()
320 kernel->negative_range = kernel->positive_range = 0.0; in ParseKernelArray()
321 for (i=0; (i < (ssize_t) (kernel->width*kernel->height)) && (p < end); i++) in ParseKernelArray()
328 kernel->values[i] = nan; /* this value is not part of neighbourhood */ in ParseKernelArray()
331 kernel->values[i] = StringToDouble(token,(char **) NULL); in ParseKernelArray()
332 ( kernel->values[i] < 0) in ParseKernelArray()
333 ? ( kernel->negative_range += kernel->values[i] ) in ParseKernelArray()
334 : ( kernel->positive_range += kernel->values[i] ); in ParseKernelArray()
335 Minimize(kernel->minimum, kernel->values[i]); in ParseKernelArray()
336 Maximize(kernel->maximum, kernel->values[i]); in ParseKernelArray()
340 /* sanity check -- no more values in kernel definition */ in ParseKernelArray()
343 return(DestroyKernelInfo(kernel)); in ParseKernelArray()
346 /* this was the old method of handling a incomplete kernel */ in ParseKernelArray()
347 if ( i < (ssize_t) (kernel->width*kernel->height) ) { in ParseKernelArray()
348 Minimize(kernel->minimum, kernel->values[i]); in ParseKernelArray()
349 Maximize(kernel->maximum, kernel->values[i]); in ParseKernelArray()
350 for ( ; i < (ssize_t) (kernel->width*kernel->height); i++) in ParseKernelArray()
351 kernel->values[i]=0.0; in ParseKernelArray()
354 /* Number of values for kernel was not enough - Report Error */ in ParseKernelArray()
355 if ( i < (ssize_t) (kernel->width*kernel->height) ) in ParseKernelArray()
356 return(DestroyKernelInfo(kernel)); in ParseKernelArray()
360 if (kernel->minimum == MagickMaximumValue) in ParseKernelArray()
361 return(DestroyKernelInfo(kernel)); in ParseKernelArray()
363 if ( (flags & AreaValue) != 0 ) /* '@' symbol in kernel size */ in ParseKernelArray()
364 ExpandRotateKernelInfo(kernel, 45.0); /* cyclic rotate 3x3 kernels */ in ParseKernelArray()
365 else if ( (flags & GreaterValue) != 0 ) /* '>' symbol in kernel args */ in ParseKernelArray()
366 ExpandRotateKernelInfo(kernel, 90.0); /* 90 degree rotate of kernel */ in ParseKernelArray()
367 else if ( (flags & LessValue) != 0 ) /* '<' symbol in kernel args */ in ParseKernelArray()
368 ExpandMirrorKernelInfo(kernel); /* 90 degree mirror rotate */ in ParseKernelArray()
370 return(kernel); in ParseKernelArray()
387 *kernel; in ParseKernelName() local
395 /* Parse special 'named' kernel */ in ParseKernelName()
399 return((KernelInfo *) NULL); /* not a valid named kernel */ in ParseKernelName()
405 end = strchr(p, ';'); /* end of this kernel defintion */ in ParseKernelName()
423 /* Shape Kernel Defaults */ in ParseKernelName()
453 /* Distance Kernel Defaults */ in ParseKernelName()
469 kernel = AcquireKernelBuiltIn((KernelInfoType)type, &args, exception); in ParseKernelName()
470 if ( kernel == (KernelInfo *) NULL ) in ParseKernelName()
471 return(kernel); in ParseKernelName()
473 /* global expand to rotated kernel list - only for single kernels */ in ParseKernelName()
474 if ( kernel->next == (KernelInfo *) NULL ) { in ParseKernelName()
475 if ( (flags & AreaValue) != 0 ) /* '@' symbol in kernel args */ in ParseKernelName()
476 ExpandRotateKernelInfo(kernel, 45.0); in ParseKernelName()
477 else if ( (flags & GreaterValue) != 0 ) /* '>' symbol in kernel args */ in ParseKernelName()
478 ExpandRotateKernelInfo(kernel, 90.0); in ParseKernelName()
479 else if ( (flags & LessValue) != 0 ) /* '<' symbol in kernel args */ in ParseKernelName()
480 ExpandMirrorKernelInfo(kernel); in ParseKernelName()
483 return(kernel); in ParseKernelName()
490 *kernel, in AcquireKernelInfo() local
511 kernel=NULL; in AcquireKernelInfo()
514 /* ignore extra or multiple ';' kernel separators */ in AcquireKernelInfo()
517 /* tokens starting with alpha is a Named kernel */ in AcquireKernelInfo()
520 else /* otherwise a user defined kernel array */ in AcquireKernelInfo()
526 if (kernel != (KernelInfo *) NULL) in AcquireKernelInfo()
527 kernel=DestroyKernelInfo(kernel); in AcquireKernelInfo()
531 /* initialise or append the kernel list */ in AcquireKernelInfo()
532 if (kernel == (KernelInfo *) NULL) in AcquireKernelInfo()
533 kernel=new_kernel; in AcquireKernelInfo()
535 LastKernelInfo(kernel)->next=new_kernel; in AcquireKernelInfo()
538 /* look for the next kernel in list */ in AcquireKernelInfo()
546 return(kernel); in AcquireKernelInfo()
575 % o type: the pre-defined type of kernel wanted
577 % o args: arguments defining or modifying the kernel
582 % The a No-Op or Scaling single element kernel.
585 % Generate a two-dimensional gaussian kernel, as used by -gaussian.
586 % The sigma for the curve is required. The resulting kernel is
592 % the final size of the resulting kernel to a square 2*radius+1 in size.
599 % "Laplacian of a Gaussian" or "Mexician Hat" Kernel.
600 % The supposed ideal edge detection, zero-summing kernel.
602 % An alturnative to this kernel is to use a "DoG" with a sigma ratio of
606 % "Difference of Gaussians" Kernel.
609 % The result is a zero-summing kernel.
614 % kernel is clipped to a width of 2*radius+1. Kernel can be rotated
620 % each other, is equivalent to a far larger "Gaussian" kernel with the
626 % a comet like trail. The Kernel is actually half a gaussian curve,
627 % Adding two such blurs in opposite directions produces a Blur Kernel.
630 % Note that the first argument is the width of the kernel and not the
631 % radius of the kernel.
634 % Generate a discrete kernel using a 2 dimentional Pascel's Triangle
641 % # Set kernel values using a resize filter, and given scale (sigma)
667 % Sobel 'Edge' convolution kernel (3x3)
673 % Roberts convolution kernel (3x3)
679 % Prewitt Edge convolution kernel (3x3)
685 % Prewitt's "Compass" convolution kernel (3x3)
691 % Kirsch's "Compass" convolution kernel (3x3)
697 % Frei-Chen Edge Detector is based on a kernel that is similar to
698 % the Sobel Kernel, but is designed to be isotropic. That is it takes
699 % into account the distance of the diagonal in the kernel.
711 % Type 1: Orthogonal Kernel (same as type 11 below)
716 % Type 2: Diagonal form of Kernel...
721 % However this kernel is als at the heart of the FreiChen Edge Detection
722 % Process which uses a set of 9 specially weighted kernel. These 9
772 % as a multi-kernel list, so that you can use them directly (without
777 % the default FreiChen (type 0) kernel. As such FreiChen:45 will look
792 % Generate a diamond shaped kernel with given radius to the points.
793 % Kernel size will again be radius*2+1 square and defaults to radius 1,
794 % generating a 3x3 kernel that is slightly larger than a square.
797 % Generate a square shaped kernel of size radius*2+1, and defaulting
801 % Generate octagonal shaped kernel of given radius and constant scale.
802 % Default radius is 3 producing a 7x7 kernel. A radius of 1 will result
803 % in "Diamond" kernel.
807 % may be a float-point value. Final Kernel size is floor(radius)*2+1
822 % All other Disk shapes are unique to this kernel, but because a "Disk"
835 % These kernel is not a good general morphological kernel, but is used
844 % Generate a kernel in the shape of a 'plus' or a 'cross' with
847 % NOTE: "plus:1" is equivalent to a "Diamond" kernel.
851 % Defaults to a ring of approximataly 3 radius in a 7x7 kernel.
852 % This is the 'edge' pixels of the default "Disk" kernel,
865 % A special kernel to thin the 'outside' of diagonals
870 % Type 1: single kernel for 4-conneected line ends
871 % Type 2: single kernel for simple line ends
875 % Type 1: Y Junction kernel
876 % Type 2: Diagonal T Junction kernel
877 % Type 3: Orthogonal T Junction kernel
878 % Type 4: Diagonal X Junction kernel
879 % Type 5: Orthogonal + Junction kernel
885 % Octagonal Thickening Kernel, to generate convex hulls of 45 degrees
888 % Type 1: Tradional Skeleton kernel (4 connected skeleton)
889 % Type 2: HIPR2 Skeleton kernel (8 connected skeleton)
894 % many other kernel sets use these kernels as source definitions.
926 % the "Octagon" shaped kernel of the same radius. The minimum radius
927 % and default is 2, producing a 5x5 kernel.
931 % However by default the kernel size only has a radius of 1, which
933 % diagonal measurements being correct. As such for the default kernel
939 % Of course a larger kernel is slower to use, and not always needed.
946 % The "Euclidean" Distance Kernel however does generate a non-integer
955 *kernel; in AcquireKernelBuiltIn() local
967 /* Generate a new empty kernel if needed */ in AcquireKernelBuiltIn()
968 kernel=(KernelInfo *) NULL; in AcquireKernelBuiltIn()
990 break; /* A pre-generated kernel is not needed */ in AcquireKernelBuiltIn()
1016 /* Generate the base Kernel Structure */ in AcquireKernelBuiltIn()
1017 kernel=(KernelInfo *) AcquireMagickMemory(sizeof(*kernel)); in AcquireKernelBuiltIn()
1018 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1019 return(kernel); in AcquireKernelBuiltIn()
1020 (void) memset(kernel,0,sizeof(*kernel)); in AcquireKernelBuiltIn()
1021 kernel->minimum = kernel->maximum = kernel->angle = 0.0; in AcquireKernelBuiltIn()
1022 kernel->negative_range = kernel->positive_range = 0.0; in AcquireKernelBuiltIn()
1023 kernel->type = type; in AcquireKernelBuiltIn()
1024 kernel->next = (KernelInfo *) NULL; in AcquireKernelBuiltIn()
1025 kernel->signature=MagickCoreSignature; in AcquireKernelBuiltIn()
1035 kernel->height = kernel->width = (size_t) 1; in AcquireKernelBuiltIn()
1036 kernel->x = kernel->y = (ssize_t) 0; in AcquireKernelBuiltIn()
1037 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1038 AcquireAlignedMemory(1,sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1039 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1040 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1041 kernel->maximum = kernel->values[0] = args->rho; in AcquireKernelBuiltIn()
1054 kernel->width = (size_t)args->rho*2+1; in AcquireKernelBuiltIn()
1056 kernel->width = GetOptimalKernelWidth2D(args->rho,sigma); in AcquireKernelBuiltIn()
1058 kernel->width = GetOptimalKernelWidth2D(args->rho,sigma2); in AcquireKernelBuiltIn()
1059 kernel->height = kernel->width; in AcquireKernelBuiltIn()
1060 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1061 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1062 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1063 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1064 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1065 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1067 /* WARNING: The following generates a 'sampled gaussian' kernel. in AcquireKernelBuiltIn()
1068 * What we really want is a 'discrete gaussian' kernel. in AcquireKernelBuiltIn()
1079 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1080 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1081 kernel->values[i] = exp(-((double)(u*u+v*v))*A)*B; in AcquireKernelBuiltIn()
1083 else /* limiting case - a unity (normalized Dirac) kernel */ in AcquireKernelBuiltIn()
1084 { (void) memset(kernel->values,0, (size_t) in AcquireKernelBuiltIn()
1085 kernel->width*kernel->height*sizeof(*kernel->values)); in AcquireKernelBuiltIn()
1086 kernel->values[kernel->x+kernel->y*kernel->width] = 1.0; in AcquireKernelBuiltIn()
1096 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1097 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1098 kernel->values[i] -= exp(-((double)(u*u+v*v))*A)*B; in AcquireKernelBuiltIn()
1100 else /* limiting case - a unity (normalized Dirac) kernel */ in AcquireKernelBuiltIn()
1101 kernel->values[kernel->x+kernel->y*kernel->width] -= 1.0; in AcquireKernelBuiltIn()
1109 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1110 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1112 kernel->values[i] = (1-R)*exp(-R)*B; in AcquireKernelBuiltIn()
1115 else /* special case - generate a unity kernel */ in AcquireKernelBuiltIn()
1116 { (void) memset(kernel->values,0, (size_t) in AcquireKernelBuiltIn()
1117 kernel->width*kernel->height*sizeof(*kernel->values)); in AcquireKernelBuiltIn()
1118 kernel->values[kernel->x+kernel->y*kernel->width] = 1.0; in AcquireKernelBuiltIn()
1123 ** radius, producing a smaller (darker) kernel. Also for very small in AcquireKernelBuiltIn()
1125 ** producing a very bright kernel. in AcquireKernelBuiltIn()
1130 /* Normalize the 2D Gaussian Kernel in AcquireKernelBuiltIn()
1135 CalcKernelMetaData(kernel); /* the other kernel meta-data */ in AcquireKernelBuiltIn()
1136 ScaleKernelInfo(kernel, 1.0, CorrelateNormalizeValue); in AcquireKernelBuiltIn()
1146 kernel->width = (size_t)args->rho*2+1; in AcquireKernelBuiltIn()
1148 kernel->width = GetOptimalKernelWidth1D(args->rho,sigma); in AcquireKernelBuiltIn()
1149 kernel->height = 1; in AcquireKernelBuiltIn()
1150 kernel->x = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1151 kernel->y = 0; in AcquireKernelBuiltIn()
1152 kernel->negative_range = kernel->positive_range = 0.0; in AcquireKernelBuiltIn()
1153 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1154 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1155 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1156 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1157 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1164 ** resulting kernel, especially for very low sigma values. in AcquireKernelBuiltIn()
1175 v = (ssize_t) (kernel->width*KernelRank-1)/2; /* start/end points to fit range */ in AcquireKernelBuiltIn()
1176 (void) memset(kernel->values,0, (size_t) in AcquireKernelBuiltIn()
1177 kernel->width*kernel->height*sizeof(*kernel->values)); in AcquireKernelBuiltIn()
1184 kernel->values[(u+v)/KernelRank] += in AcquireKernelBuiltIn()
1188 else /* special case - generate a unity kernel */ in AcquireKernelBuiltIn()
1189 kernel->values[kernel->x+kernel->y*kernel->width] = 1.0; in AcquireKernelBuiltIn()
1198 for ( i=0, u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1199 kernel->values[i] = exp(-((double)(u*u))*alpha)*beta; in AcquireKernelBuiltIn()
1201 else /* special case - generate a unity kernel */ in AcquireKernelBuiltIn()
1202 { (void) memset(kernel->values,0, (size_t) in AcquireKernelBuiltIn()
1203 kernel->width*kernel->height*sizeof(*kernel->values)); in AcquireKernelBuiltIn()
1204 kernel->values[kernel->x+kernel->y*kernel->width] = 1.0; in AcquireKernelBuiltIn()
1207 /* Note the above kernel may have been 'clipped' by a user defined in AcquireKernelBuiltIn()
1208 ** radius, producing a smaller (darker) kernel. Also for very small in AcquireKernelBuiltIn()
1210 ** result of not generating a actual 'discrete' kernel, and thus in AcquireKernelBuiltIn()
1216 /* Normalize the 1D Gaussian Kernel in AcquireKernelBuiltIn()
1221 CalcKernelMetaData(kernel); /* the other kernel meta-data */ in AcquireKernelBuiltIn()
1222 ScaleKernelInfo(kernel, 1.0, CorrelateNormalizeValue); in AcquireKernelBuiltIn()
1224 /* rotate the 1D kernel by given angle */ in AcquireKernelBuiltIn()
1225 RotateKernelInfo(kernel, args->xi ); in AcquireKernelBuiltIn()
1234 kernel->width = (GetOptimalKernelWidth1D(args->rho,sigma)-1)/2+1; in AcquireKernelBuiltIn()
1236 kernel->width = (size_t)args->rho; in AcquireKernelBuiltIn()
1237 kernel->x = kernel->y = 0; in AcquireKernelBuiltIn()
1238 kernel->height = 1; in AcquireKernelBuiltIn()
1239 kernel->negative_range = kernel->positive_range = 0.0; in AcquireKernelBuiltIn()
1240 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1241 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1242 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1243 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1244 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1260 v = (ssize_t) kernel->width*KernelRank; /* start/end points */ in AcquireKernelBuiltIn()
1261 (void) memset(kernel->values,0, (size_t) in AcquireKernelBuiltIn()
1262 kernel->width*sizeof(*kernel->values)); in AcquireKernelBuiltIn()
1267 kernel->values[u/KernelRank] += in AcquireKernelBuiltIn()
1271 for (i=0; i < (ssize_t) kernel->width; i++) in AcquireKernelBuiltIn()
1272 kernel->positive_range += kernel->values[i]; in AcquireKernelBuiltIn()
1276 for ( i=0; i < (ssize_t) kernel->width; i++) in AcquireKernelBuiltIn()
1277 kernel->positive_range += in AcquireKernelBuiltIn()
1278 kernel->values[i] = exp(-((double)(i*i))*A); in AcquireKernelBuiltIn()
1282 else /* special case - generate a unity kernel */ in AcquireKernelBuiltIn()
1283 { (void) memset(kernel->values,0, (size_t) in AcquireKernelBuiltIn()
1284 kernel->width*kernel->height*sizeof(*kernel->values)); in AcquireKernelBuiltIn()
1285 kernel->values[kernel->x+kernel->y*kernel->width] = 1.0; in AcquireKernelBuiltIn()
1286 kernel->positive_range = 1.0; in AcquireKernelBuiltIn()
1289 kernel->minimum = 0.0; in AcquireKernelBuiltIn()
1290 kernel->maximum = kernel->values[0]; in AcquireKernelBuiltIn()
1291 kernel->negative_range = 0.0; in AcquireKernelBuiltIn()
1293 ScaleKernelInfo(kernel, 1.0, NormalizeValue); /* Normalize */ in AcquireKernelBuiltIn()
1294 RotateKernelInfo(kernel, args->xi); /* Rotate by angle */ in AcquireKernelBuiltIn()
1303 kernel->width = kernel->height = 3; /* default radius = 1 */ in AcquireKernelBuiltIn()
1305 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
1306 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1308 order_f = fact(kernel->width-1); in AcquireKernelBuiltIn()
1310 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1311 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1312 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1313 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1314 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1316 /* set all kernel values within diamond area to scale given */ in AcquireKernelBuiltIn()
1317 for ( i=0, v=0; v < (ssize_t)kernel->height; v++) in AcquireKernelBuiltIn()
1319 alpha = order_f / ( fact((size_t) v) * fact(kernel->height-v-1) ); in AcquireKernelBuiltIn()
1320 for ( u=0; u < (ssize_t)kernel->width; u++, i++) in AcquireKernelBuiltIn()
1321 kernel->positive_range += kernel->values[i] = (double) in AcquireKernelBuiltIn()
1322 (alpha * order_f / ( fact((size_t) u) * fact(kernel->height-u-1) )); in AcquireKernelBuiltIn()
1324 kernel->minimum = 1.0; in AcquireKernelBuiltIn()
1325 kernel->maximum = kernel->values[kernel->x+kernel->y*kernel->width]; in AcquireKernelBuiltIn()
1326 kernel->negative_range = 0.0; in AcquireKernelBuiltIn()
1337 kernel=ParseKernelArray("3: -1,-1,-1 -1,8,-1 -1,-1,-1"); in AcquireKernelBuiltIn()
1340 kernel=ParseKernelArray("3: 0,-1,0 -1,4,-1 0,-1,0"); in AcquireKernelBuiltIn()
1343 kernel=ParseKernelArray("3: -2,1,-2 1,4,1 -2,1,-2"); in AcquireKernelBuiltIn()
1346 kernel=ParseKernelArray("3: 1,-2,1 -2,4,-2 1,-2,1"); in AcquireKernelBuiltIn()
1349 kernel=ParseKernelArray( in AcquireKernelBuiltIn()
1353 kernel=ParseKernelArray( in AcquireKernelBuiltIn()
1357 kernel=ParseKernelArray( in AcquireKernelBuiltIn()
1362 kernel=ParseKernelArray( in AcquireKernelBuiltIn()
1366 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1367 return(kernel); in AcquireKernelBuiltIn()
1368 kernel->type = type; in AcquireKernelBuiltIn()
1372 { /* Simple Sobel Kernel */ in AcquireKernelBuiltIn()
1373 kernel=ParseKernelArray("3: 1,0,-1 2,0,-2 1,0,-1"); in AcquireKernelBuiltIn()
1374 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1375 return(kernel); in AcquireKernelBuiltIn()
1376 kernel->type = type; in AcquireKernelBuiltIn()
1377 RotateKernelInfo(kernel, args->rho); in AcquireKernelBuiltIn()
1382 kernel=ParseKernelArray("3: 0,0,0 1,-1,0 0,0,0"); in AcquireKernelBuiltIn()
1383 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1384 return(kernel); in AcquireKernelBuiltIn()
1385 kernel->type = type; in AcquireKernelBuiltIn()
1386 RotateKernelInfo(kernel, args->rho); in AcquireKernelBuiltIn()
1391 kernel=ParseKernelArray("3: 1,0,-1 1,0,-1 1,0,-1"); in AcquireKernelBuiltIn()
1392 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1393 return(kernel); in AcquireKernelBuiltIn()
1394 kernel->type = type; in AcquireKernelBuiltIn()
1395 RotateKernelInfo(kernel, args->rho); in AcquireKernelBuiltIn()
1400 kernel=ParseKernelArray("3: 1,1,-1 1,-2,-1 1,1,-1"); in AcquireKernelBuiltIn()
1401 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1402 return(kernel); in AcquireKernelBuiltIn()
1403 kernel->type = type; in AcquireKernelBuiltIn()
1404 RotateKernelInfo(kernel, args->rho); in AcquireKernelBuiltIn()
1409 kernel=ParseKernelArray("3: 5,-3,-3 5,0,-3 5,-3,-3"); in AcquireKernelBuiltIn()
1410 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1411 return(kernel); in AcquireKernelBuiltIn()
1412 kernel->type = type; in AcquireKernelBuiltIn()
1413 RotateKernelInfo(kernel, args->rho); in AcquireKernelBuiltIn()
1423 kernel=ParseKernelArray("3: 1,0,-1 2,0,-2 1,0,-1"); in AcquireKernelBuiltIn()
1424 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1425 return(kernel); in AcquireKernelBuiltIn()
1426 kernel->type = type; in AcquireKernelBuiltIn()
1427 kernel->values[3] = +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1428 kernel->values[5] = -(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1429 CalcKernelMetaData(kernel); /* recalculate meta-data */ in AcquireKernelBuiltIn()
1432 kernel=ParseKernelArray("3: 1,2,0 2,0,-2 0,-2,-1"); in AcquireKernelBuiltIn()
1433 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1434 return(kernel); in AcquireKernelBuiltIn()
1435 kernel->type = type; in AcquireKernelBuiltIn()
1436 kernel->values[1] = kernel->values[3]= +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1437 kernel->values[5] = kernel->values[7]= -(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1438 CalcKernelMetaData(kernel); /* recalculate meta-data */ in AcquireKernelBuiltIn()
1439 ScaleKernelInfo(kernel, (double) (1.0/2.0*MagickSQ2), NoValue); in AcquireKernelBuiltIn()
1443 …kernel=AcquireKernelInfo("FreiChen:11;FreiChen:12;FreiChen:13;FreiChen:14;FreiChen:15;FreiChen:16;… in AcquireKernelBuiltIn()
1444 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1445 return(kernel); in AcquireKernelBuiltIn()
1450 kernel=ParseKernelArray("3: 1,0,-1 2,0,-2 1,0,-1"); in AcquireKernelBuiltIn()
1451 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1452 return(kernel); in AcquireKernelBuiltIn()
1453 kernel->type = type; in AcquireKernelBuiltIn()
1454 kernel->values[3] = +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1455 kernel->values[5] = -(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1456 CalcKernelMetaData(kernel); /* recalculate meta-data */ in AcquireKernelBuiltIn()
1457 ScaleKernelInfo(kernel, (double) (1.0/2.0*MagickSQ2), NoValue); in AcquireKernelBuiltIn()
1460 kernel=ParseKernelArray("3: 1,2,1 0,0,0 1,2,1"); in AcquireKernelBuiltIn()
1461 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1462 return(kernel); in AcquireKernelBuiltIn()
1463 kernel->type = type; in AcquireKernelBuiltIn()
1464 kernel->values[1] = +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1465 kernel->values[7] = +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1466 CalcKernelMetaData(kernel); in AcquireKernelBuiltIn()
1467 ScaleKernelInfo(kernel, (double) (1.0/2.0*MagickSQ2), NoValue); in AcquireKernelBuiltIn()
1470 kernel=ParseKernelArray("3: 2,-1,0 -1,0,1 0,1,-2"); in AcquireKernelBuiltIn()
1471 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1472 return(kernel); in AcquireKernelBuiltIn()
1473 kernel->type = type; in AcquireKernelBuiltIn()
1474 kernel->values[0] = +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1475 kernel->values[8] = -(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1476 CalcKernelMetaData(kernel); in AcquireKernelBuiltIn()
1477 ScaleKernelInfo(kernel, (double) (1.0/2.0*MagickSQ2), NoValue); in AcquireKernelBuiltIn()
1480 kernel=ParseKernelArray("3: 0,1,-2 -1,0,1 2,-1,0"); in AcquireKernelBuiltIn()
1481 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1482 return(kernel); in AcquireKernelBuiltIn()
1483 kernel->type = type; in AcquireKernelBuiltIn()
1484 kernel->values[2] = -(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1485 kernel->values[6] = +(MagickRealType) MagickSQ2; in AcquireKernelBuiltIn()
1486 CalcKernelMetaData(kernel); in AcquireKernelBuiltIn()
1487 ScaleKernelInfo(kernel, (double) (1.0/2.0*MagickSQ2), NoValue); in AcquireKernelBuiltIn()
1490 kernel=ParseKernelArray("3: 0,-1,0 1,0,1 0,-1,0"); in AcquireKernelBuiltIn()
1491 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1492 return(kernel); in AcquireKernelBuiltIn()
1493 kernel->type = type; in AcquireKernelBuiltIn()
1494 ScaleKernelInfo(kernel, 1.0/2.0, NoValue); in AcquireKernelBuiltIn()
1497 kernel=ParseKernelArray("3: 1,0,-1 0,0,0 -1,0,1"); in AcquireKernelBuiltIn()
1498 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1499 return(kernel); in AcquireKernelBuiltIn()
1500 kernel->type = type; in AcquireKernelBuiltIn()
1501 ScaleKernelInfo(kernel, 1.0/2.0, NoValue); in AcquireKernelBuiltIn()
1504 kernel=ParseKernelArray("3: 1,-2,1 -2,4,-2 -1,-2,1"); in AcquireKernelBuiltIn()
1505 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1506 return(kernel); in AcquireKernelBuiltIn()
1507 kernel->type = type; in AcquireKernelBuiltIn()
1508 ScaleKernelInfo(kernel, 1.0/6.0, NoValue); in AcquireKernelBuiltIn()
1511 kernel=ParseKernelArray("3: -2,1,-2 1,4,1 -2,1,-2"); in AcquireKernelBuiltIn()
1512 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1513 return(kernel); in AcquireKernelBuiltIn()
1514 kernel->type = type; in AcquireKernelBuiltIn()
1515 ScaleKernelInfo(kernel, 1.0/6.0, NoValue); in AcquireKernelBuiltIn()
1518 kernel=ParseKernelArray("3: 1,1,1 1,1,1 1,1,1"); in AcquireKernelBuiltIn()
1519 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1520 return(kernel); in AcquireKernelBuiltIn()
1521 kernel->type = type; in AcquireKernelBuiltIn()
1522 ScaleKernelInfo(kernel, 1.0/3.0, NoValue); in AcquireKernelBuiltIn()
1527 RotateKernelInfo(kernel, args->sigma); in AcquireKernelBuiltIn()
1530 RotateKernelInfo(kernel, args->rho); in AcquireKernelBuiltIn()
1540 kernel->width = kernel->height = 3; /* default radius = 1 */ in AcquireKernelBuiltIn()
1542 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
1543 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1545 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1546 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1547 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1548 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1549 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1551 /* set all kernel values within diamond area to scale given */ in AcquireKernelBuiltIn()
1552 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1553 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1554 if ( (labs((long) u)+labs((long) v)) <= (long) kernel->x) in AcquireKernelBuiltIn()
1555 kernel->positive_range += kernel->values[i] = args->sigma; in AcquireKernelBuiltIn()
1557 kernel->values[i] = nan; in AcquireKernelBuiltIn()
1558 kernel->minimum = kernel->maximum = args->sigma; /* a flat shape */ in AcquireKernelBuiltIn()
1568 kernel->width = kernel->height = 3; /* default radius = 1 */ in AcquireKernelBuiltIn()
1570 kernel->width = kernel->height = (size_t) (2*args->rho+1); in AcquireKernelBuiltIn()
1571 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1577 return(DestroyKernelInfo(kernel)); /* invalid args given */ in AcquireKernelBuiltIn()
1578 kernel->width = (size_t)args->rho; in AcquireKernelBuiltIn()
1579 kernel->height = (size_t)args->sigma; in AcquireKernelBuiltIn()
1580 if ( args->xi < 0.0 || args->xi > (double)kernel->width || in AcquireKernelBuiltIn()
1581 args->psi < 0.0 || args->psi > (double)kernel->height ) in AcquireKernelBuiltIn()
1582 return(DestroyKernelInfo(kernel)); /* invalid args given */ in AcquireKernelBuiltIn()
1583 kernel->x = (ssize_t) args->xi; in AcquireKernelBuiltIn()
1584 kernel->y = (ssize_t) args->psi; in AcquireKernelBuiltIn()
1587 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1588 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1589 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1590 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1591 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1593 /* set all kernel values to scale given */ in AcquireKernelBuiltIn()
1594 u=(ssize_t) (kernel->width*kernel->height); in AcquireKernelBuiltIn()
1596 kernel->values[i] = scale; in AcquireKernelBuiltIn()
1597 kernel->minimum = kernel->maximum = scale; /* a flat shape */ in AcquireKernelBuiltIn()
1598 kernel->positive_range = scale*u; in AcquireKernelBuiltIn()
1604 kernel->width = kernel->height = 5; /* default radius = 2 */ in AcquireKernelBuiltIn()
1606 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
1607 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1609 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1610 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1611 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1612 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1613 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1615 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1616 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1618 ((long)kernel->x + (long)(kernel->x/2)) ) in AcquireKernelBuiltIn()
1619 kernel->positive_range += kernel->values[i] = args->sigma; in AcquireKernelBuiltIn()
1621 kernel->values[i] = nan; in AcquireKernelBuiltIn()
1622 kernel->minimum = kernel->maximum = args->sigma; /* a flat shape */ in AcquireKernelBuiltIn()
1631 kernel->width = kernel->height = 9L, limit = 18L; in AcquireKernelBuiltIn()
1633 kernel->width = kernel->height = (size_t)fabs(args->rho)*2+1; in AcquireKernelBuiltIn()
1634 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1636 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1637 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1638 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1639 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1640 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1642 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1643 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1645 kernel->positive_range += kernel->values[i] = args->sigma; in AcquireKernelBuiltIn()
1647 kernel->values[i] = nan; in AcquireKernelBuiltIn()
1648 kernel->minimum = kernel->maximum = args->sigma; /* a flat shape */ in AcquireKernelBuiltIn()
1654 kernel->width = kernel->height = 5; /* default radius 2 */ in AcquireKernelBuiltIn()
1656 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
1657 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1659 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1660 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1661 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1662 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1663 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1665 /* set all kernel values along axises to given scale */ in AcquireKernelBuiltIn()
1666 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1667 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1668 kernel->values[i] = (u == 0 || v == 0) ? args->sigma : nan; in AcquireKernelBuiltIn()
1669 kernel->minimum = kernel->maximum = args->sigma; /* a flat shape */ in AcquireKernelBuiltIn()
1670 kernel->positive_range = args->sigma*(kernel->width*2.0 - 1.0); in AcquireKernelBuiltIn()
1676 kernel->width = kernel->height = 5; /* default radius 2 */ in AcquireKernelBuiltIn()
1678 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
1679 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1681 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1682 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1683 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1684 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1685 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1687 /* set all kernel values along axises to given scale */ in AcquireKernelBuiltIn()
1688 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1689 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1690 kernel->values[i] = (u == v || u == -v) ? args->sigma : nan; in AcquireKernelBuiltIn()
1691 kernel->minimum = kernel->maximum = args->sigma; /* a flat shape */ in AcquireKernelBuiltIn()
1692 kernel->positive_range = args->sigma*(kernel->width*2.0 - 1.0); in AcquireKernelBuiltIn()
1708 kernel->width = ((size_t)args->sigma)*2+1; in AcquireKernelBuiltIn()
1714 kernel->width = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
1719 kernel->width = 7L, limit1 = 7L, limit2 = 11L; in AcquireKernelBuiltIn()
1721 kernel->height = kernel->width; in AcquireKernelBuiltIn()
1722 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
1723 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
1724 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
1725 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
1726 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
1727 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1731 for ( i=0, v= -kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
1732 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
1735 kernel->positive_range += kernel->values[i] = (double) scale; in AcquireKernelBuiltIn()
1737 kernel->values[i] = nan; in AcquireKernelBuiltIn()
1739 kernel->minimum = kernel->maximum = (double) scale; in AcquireKernelBuiltIn()
1742 kernel->values[kernel->x+kernel->y*kernel->width] = 1.0; in AcquireKernelBuiltIn()
1743 kernel->positive_range = 1.0; in AcquireKernelBuiltIn()
1744 kernel->maximum = 1.0; in AcquireKernelBuiltIn()
1750 kernel=AcquireKernelInfo("ThinSE:482",exception); in AcquireKernelBuiltIn()
1751 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1752 return(kernel); in AcquireKernelBuiltIn()
1753 kernel->type = type; in AcquireKernelBuiltIn()
1754 ExpandMirrorKernelInfo(kernel); /* mirror expansion of kernels */ in AcquireKernelBuiltIn()
1759 kernel=AcquireKernelInfo("ThinSE:87",exception); in AcquireKernelBuiltIn()
1760 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1761 return(kernel); in AcquireKernelBuiltIn()
1762 kernel->type = type; in AcquireKernelBuiltIn()
1763 ExpandRotateKernelInfo(kernel, 90.0); /* Expand 90 degree rotations */ in AcquireKernelBuiltIn()
1773 kernel=ParseKernelArray("3: 0,0,0 0,-,1 1,1,-"); in AcquireKernelBuiltIn()
1774 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1775 return(kernel); in AcquireKernelBuiltIn()
1776 kernel->type = type; in AcquireKernelBuiltIn()
1779 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1781 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1782 ExpandMirrorKernelInfo(kernel); in AcquireKernelBuiltIn()
1783 return(kernel); in AcquireKernelBuiltIn()
1786 kernel=ParseKernelArray("3: 0,0,0 0,-,1 1,1,-"); in AcquireKernelBuiltIn()
1789 kernel=ParseKernelArray("3: 0,0,1 0,-,1 0,1,-"); in AcquireKernelBuiltIn()
1792 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1793 return(kernel); in AcquireKernelBuiltIn()
1794 kernel->type = type; in AcquireKernelBuiltIn()
1795 RotateKernelInfo(kernel, args->sigma); in AcquireKernelBuiltIn()
1806 /* kernel for 4-connected line ends - no rotation */ in AcquireKernelBuiltIn()
1807 kernel=ParseKernelArray("3: 0,0,- 0,1,1 0,0,-"); in AcquireKernelBuiltIn()
1810 /* kernel to add for 8-connected lines - no rotation */ in AcquireKernelBuiltIn()
1811 kernel=ParseKernelArray("3: 0,0,0 0,1,0 0,0,1"); in AcquireKernelBuiltIn()
1814 /* kernel to add for orthogonal line ends - does not find corners */ in AcquireKernelBuiltIn()
1815 kernel=ParseKernelArray("3: 0,0,0 0,1,1 0,0,0"); in AcquireKernelBuiltIn()
1819 kernel=ParseKernelArray("3: 0,0,0 0,1,- 0,0,-"); in AcquireKernelBuiltIn()
1822 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1823 return(kernel); in AcquireKernelBuiltIn()
1824 kernel->type = type; in AcquireKernelBuiltIn()
1825 RotateKernelInfo(kernel, args->sigma); in AcquireKernelBuiltIn()
1837 kernel=ParseKernelArray("3: 1,-,1 -,1,- -,1,-"); in AcquireKernelBuiltIn()
1841 kernel=ParseKernelArray("3: 1,-,- -,1,- 1,-,1"); in AcquireKernelBuiltIn()
1845 kernel=ParseKernelArray("3: -,-,- 1,1,1 -,1,-"); in AcquireKernelBuiltIn()
1849 kernel=ParseKernelArray("3: 1,-,1 -,1,- 1,-,1"); in AcquireKernelBuiltIn()
1852 /* Orthogonal X Junctions - minimal diamond kernel */ in AcquireKernelBuiltIn()
1853 kernel=ParseKernelArray("3: -,1,- 1,1,1 -,1,-"); in AcquireKernelBuiltIn()
1856 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1857 return(kernel); in AcquireKernelBuiltIn()
1858 kernel->type = type; in AcquireKernelBuiltIn()
1859 RotateKernelInfo(kernel, args->sigma); in AcquireKernelBuiltIn()
1869 kernel=ParseKernelArray("3x1:0,1,0"); in AcquireKernelBuiltIn()
1870 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1871 return(kernel); in AcquireKernelBuiltIn()
1872 kernel->type = type; in AcquireKernelBuiltIn()
1873 ExpandRotateKernelInfo(kernel, 90.0); /* 2 rotated kernels (symmetrical) */ in AcquireKernelBuiltIn()
1876 kernel=ParseKernelArray("4x1:0,1,1,0"); in AcquireKernelBuiltIn()
1877 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1878 return(kernel); in AcquireKernelBuiltIn()
1879 kernel->type = type; in AcquireKernelBuiltIn()
1880 ExpandRotateKernelInfo(kernel, 90.0); /* 4 rotated kernels */ in AcquireKernelBuiltIn()
1883 /* Unfortunatally we can not yet rotate a non-square kernel */ in AcquireKernelBuiltIn()
1884 /* But then we can't flip a non-symetrical kernel either */ in AcquireKernelBuiltIn()
1887 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1889 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1892 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1894 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1897 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1899 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1902 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1904 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1907 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1909 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1912 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1914 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1917 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1919 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1922 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1924 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1934 kernel=ParseKernelArray("3: 1,1,- 1,0,- 1,-,0"); in AcquireKernelBuiltIn()
1935 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1936 return(kernel); in AcquireKernelBuiltIn()
1937 kernel->type = type; in AcquireKernelBuiltIn()
1938 ExpandRotateKernelInfo(kernel, 90.0); in AcquireKernelBuiltIn()
1942 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1945 LastKernelInfo(kernel)->next = new_kernel; in AcquireKernelBuiltIn()
1954 ** A cyclically rotated single kernel in AcquireKernelBuiltIn()
1956 kernel=AcquireKernelInfo("ThinSE:482",exception); in AcquireKernelBuiltIn()
1957 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1958 return(kernel); in AcquireKernelBuiltIn()
1959 kernel->type = type; in AcquireKernelBuiltIn()
1960 ExpandRotateKernelInfo(kernel, 45.0); /* 8 rotations */ in AcquireKernelBuiltIn()
1967 kernel=AcquireKernelInfo("ThinSE:482; ThinSE:87x90;",exception); in AcquireKernelBuiltIn()
1968 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1969 return(kernel); in AcquireKernelBuiltIn()
1970 if (kernel->next == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1971 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
1972 kernel->type = type; in AcquireKernelBuiltIn()
1973 kernel->next->type = type; in AcquireKernelBuiltIn()
1974 ExpandRotateKernelInfo(kernel, 90.0); /* 4 rotations of the 2 kernels */ in AcquireKernelBuiltIn()
1982 kernel=AcquireKernelInfo("ThinSE:41; ThinSE:42; ThinSE:43", in AcquireKernelBuiltIn()
1984 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
1985 return(kernel); in AcquireKernelBuiltIn()
1986 kernel->type = type; in AcquireKernelBuiltIn()
1987 kernel->next->type = type; in AcquireKernelBuiltIn()
1988 kernel->next->next->type = type; in AcquireKernelBuiltIn()
1989 ExpandMirrorKernelInfo(kernel); /* 12 kernels total */ in AcquireKernelBuiltIn()
2008 kernel=ParseKernelArray("3: -,-,1 0,-,1 -,-,1"); in AcquireKernelBuiltIn()
2011 kernel=ParseKernelArray("3: -,-,1 0,-,1 -,0,-"); in AcquireKernelBuiltIn()
2014 kernel=ParseKernelArray("3: -,0,- 0,-,1 -,-,1"); in AcquireKernelBuiltIn()
2017 kernel=ParseKernelArray("3: -,0,- 0,-,1 -,0,-"); in AcquireKernelBuiltIn()
2020 kernel=ParseKernelArray("3: -,0,1 0,-,1 -,0,-"); in AcquireKernelBuiltIn()
2023 kernel=ParseKernelArray("3: -,0,- 0,-,1 -,0,1"); in AcquireKernelBuiltIn()
2026 kernel=ParseKernelArray("3: -,1,1 0,-,1 -,0,-"); in AcquireKernelBuiltIn()
2029 kernel=ParseKernelArray("3: -,-,1 0,-,1 0,-,1"); in AcquireKernelBuiltIn()
2032 kernel=ParseKernelArray("3: 0,-,1 0,-,1 -,-,1"); in AcquireKernelBuiltIn()
2036 kernel=ParseKernelArray("3: -,1,- 0,-,1 -,1,-"); in AcquireKernelBuiltIn()
2039 kernel=ParseKernelArray("3: -,1,- 0,-,1 0,-,-"); in AcquireKernelBuiltIn()
2042 kernel=ParseKernelArray("3: 0,-,- 0,-,1 -,1,-"); in AcquireKernelBuiltIn()
2045 kernel=ParseKernelArray("3: 0,-,- 0,-,1 0,-,-"); in AcquireKernelBuiltIn()
2048 kernel=ParseKernelArray("3: 0,-,1 0,-,1 0,-,-"); in AcquireKernelBuiltIn()
2051 kernel=ParseKernelArray("3: 0,-,- 0,-,1 0,-,1"); in AcquireKernelBuiltIn()
2054 kernel=ParseKernelArray("3: -,1,- 0,-,1 0,0,-"); in AcquireKernelBuiltIn()
2057 kernel=ParseKernelArray("3: -,1,- 0,-,1 0,1,-"); in AcquireKernelBuiltIn()
2060 kernel=ParseKernelArray("3: 0,1,- 0,-,1 -,1,-"); in AcquireKernelBuiltIn()
2063 case 423: /* SE_4_2 , SE_4_3 Combined Kernel */ in AcquireKernelBuiltIn()
2064 kernel=ParseKernelArray("3: -,-,1 0,-,- -,0,-"); in AcquireKernelBuiltIn()
2066 case 823: /* SE_8_2 , SE_8_3 Combined Kernel */ in AcquireKernelBuiltIn()
2067 kernel=ParseKernelArray("3: -,1,- -,-,1 0,-,-"); in AcquireKernelBuiltIn()
2069 case 481: /* SE_48_1 - General Connected Corner Kernel */ in AcquireKernelBuiltIn()
2070 kernel=ParseKernelArray("3: -,1,1 0,-,1 0,0,-"); in AcquireKernelBuiltIn()
2073 case 482: /* SE_48_2 - General Edge Kernel */ in AcquireKernelBuiltIn()
2074 kernel=ParseKernelArray("3: 0,-,1 0,-,1 0,-,1"); in AcquireKernelBuiltIn()
2077 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
2078 return(kernel); in AcquireKernelBuiltIn()
2079 kernel->type = type; in AcquireKernelBuiltIn()
2080 RotateKernelInfo(kernel, args->sigma); in AcquireKernelBuiltIn()
2089 kernel->width = kernel->height = 3; /* default radius = 1 */ in AcquireKernelBuiltIn()
2091 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
2092 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
2094 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
2095 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
2096 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
2097 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
2098 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
2100 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
2101 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
2102 kernel->positive_range += ( kernel->values[i] = in AcquireKernelBuiltIn()
2104 kernel->maximum = kernel->values[0]; in AcquireKernelBuiltIn()
2110 kernel->width = kernel->height = 3; /* default radius = 1 */ in AcquireKernelBuiltIn()
2112 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
2113 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
2115 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
2116 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
2117 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
2118 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
2119 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
2121 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
2122 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
2123 kernel->positive_range += ( kernel->values[i] = in AcquireKernelBuiltIn()
2125 kernel->maximum = kernel->values[0]; in AcquireKernelBuiltIn()
2131 kernel->width = kernel->height = 5; /* default/minimum radius = 2 */ in AcquireKernelBuiltIn()
2133 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
2134 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
2136 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
2137 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
2138 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
2139 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
2140 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
2142 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
2143 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
2148 kernel->positive_range += kernel->values[i] = in AcquireKernelBuiltIn()
2151 kernel->maximum = kernel->values[0]; in AcquireKernelBuiltIn()
2157 kernel->width = kernel->height = 3; /* default radius = 1 */ in AcquireKernelBuiltIn()
2159 kernel->width = kernel->height = ((size_t)args->rho)*2+1; in AcquireKernelBuiltIn()
2160 kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2; in AcquireKernelBuiltIn()
2162 kernel->values=(MagickRealType *) MagickAssumeAligned( in AcquireKernelBuiltIn()
2163 AcquireAlignedMemory(kernel->width,kernel->height* in AcquireKernelBuiltIn()
2164 sizeof(*kernel->values))); in AcquireKernelBuiltIn()
2165 if (kernel->values == (MagickRealType *) NULL) in AcquireKernelBuiltIn()
2166 return(DestroyKernelInfo(kernel)); in AcquireKernelBuiltIn()
2168 for ( i=0, v=-kernel->y; v <= (ssize_t)kernel->y; v++) in AcquireKernelBuiltIn()
2169 for ( u=-kernel->x; u <= (ssize_t)kernel->x; u++, i++) in AcquireKernelBuiltIn()
2170 kernel->positive_range += ( kernel->values[i] = in AcquireKernelBuiltIn()
2172 kernel->maximum = kernel->values[0]; in AcquireKernelBuiltIn()
2177 /* No-Op Kernel - Basically just a single pixel on its own */ in AcquireKernelBuiltIn()
2178 kernel=ParseKernelArray("1:1"); in AcquireKernelBuiltIn()
2179 if (kernel == (KernelInfo *) NULL) in AcquireKernelBuiltIn()
2180 return(kernel); in AcquireKernelBuiltIn()
2181 kernel->type = UndefinedKernel; in AcquireKernelBuiltIn()
2186 return(kernel); in AcquireKernelBuiltIn()
2200 % CloneKernelInfo() creates a new clone of the given Kernel List so that its
2201 % can be modified without effecting the original. The cloned kernel should
2206 % KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
2210 % o kernel: the Morphology/Convolution kernel to be cloned
2213 MagickExport KernelInfo *CloneKernelInfo(const KernelInfo *kernel) in CloneKernelInfo() argument
2221 assert(kernel != (KernelInfo *) NULL); in CloneKernelInfo()
2222 new_kernel=(KernelInfo *) AcquireMagickMemory(sizeof(*kernel)); in CloneKernelInfo()
2225 *new_kernel=(*kernel); /* copy values in structure */ in CloneKernelInfo()
2229 AcquireAlignedMemory(kernel->width,kernel->height*sizeof(*kernel->values))); in CloneKernelInfo()
2232 for (i=0; i < (ssize_t) (kernel->width*kernel->height); i++) in CloneKernelInfo()
2233 new_kernel->values[i]=kernel->values[i]; in CloneKernelInfo()
2235 /* Also clone the next kernel in the kernel list */ in CloneKernelInfo()
2236 if ( kernel->next != (KernelInfo *) NULL ) { in CloneKernelInfo()
2237 new_kernel->next = CloneKernelInfo(kernel->next); in CloneKernelInfo()
2257 % kernel.
2261 % KernelInfo *DestroyKernelInfo(KernelInfo *kernel)
2265 % o kernel: the Morphology/Convolution kernel to be destroyed
2268 MagickExport KernelInfo *DestroyKernelInfo(KernelInfo *kernel) in DestroyKernelInfo() argument
2270 assert(kernel != (KernelInfo *) NULL); in DestroyKernelInfo()
2271 if (kernel->next != (KernelInfo *) NULL) in DestroyKernelInfo()
2272 kernel->next=DestroyKernelInfo(kernel->next); in DestroyKernelInfo()
2273 kernel->values=(MagickRealType *) RelinquishAlignedMemory(kernel->values); in DestroyKernelInfo()
2274 kernel=(KernelInfo *) RelinquishMagickMemory(kernel); in DestroyKernelInfo()
2275 return(kernel); in DestroyKernelInfo()
2289 % ExpandMirrorKernelInfo() takes a single kernel, and expands it into a
2298 % void ExpandMirrorKernelInfo(KernelInfo *kernel)
2302 % o kernel: the Morphology/Convolution kernel
2310 static void FlopKernelInfo(KernelInfo *kernel)
2319 for ( y=0, k=kernel->values; y < kernel->height; y++, k+=kernel->width)
2320 for ( x=0, r=kernel->width-1; x<kernel->width/2; x++, r--)
2323 kernel->x = kernel->width - kernel->x - 1;
2328 static void ExpandMirrorKernelInfo(KernelInfo *kernel) in ExpandMirrorKernelInfo() argument
2334 last = kernel; in ExpandMirrorKernelInfo()
2370 % ExpandRotateKernelInfo() takes a kernel list, and expands it by rotating
2371 % incrementally by the angle given, until the kernel repeats.
2378 % void ExpandRotateKernelInfo(KernelInfo *kernel, double angle)
2382 % o kernel: the Morphology/Convolution kernel
2405 /* check actual kernel values */ in SameKernelInfo()
2420 static void ExpandRotateKernelInfo(KernelInfo *kernel,const double angle) in ExpandRotateKernelInfo() argument
2427 last=kernel; in ExpandRotateKernelInfo()
2435 if (SameKernelInfo(kernel,clone_info) != MagickFalse) in ExpandRotateKernelInfo()
2441 clone_info=DestroyKernelInfo(clone_info); /* kernel repeated - junk */ in ExpandRotateKernelInfo()
2456 % CalcKernelMetaData() recalculate the KernelInfo meta-data of this kernel only,
2457 % using the kernel values. This should only ne used if it is not possible to
2461 % used to perform kernel normalization.
2465 % void CalcKernelMetaData(KernelInfo *kernel, const double scale )
2469 % o kernel: the Morphology/Convolution kernel to modify
2472 % zero is not part of the kernel (as in Gaussian Derived kernels). This
2475 % WARNING: Only the specific kernel pointed to is modified, not a list of
2481 static void CalcKernelMetaData(KernelInfo *kernel) in CalcKernelMetaData() argument
2486 kernel->minimum = kernel->maximum = 0.0; in CalcKernelMetaData()
2487 kernel->negative_range = kernel->positive_range = 0.0; in CalcKernelMetaData()
2488 for (i=0; i < (kernel->width*kernel->height); i++) in CalcKernelMetaData()
2490 if ( fabs(kernel->values[i]) < MagickEpsilon ) in CalcKernelMetaData()
2491 kernel->values[i] = 0.0; in CalcKernelMetaData()
2492 ( kernel->values[i] < 0) in CalcKernelMetaData()
2493 ? ( kernel->negative_range += kernel->values[i] ) in CalcKernelMetaData()
2494 : ( kernel->positive_range += kernel->values[i] ); in CalcKernelMetaData()
2495 Minimize(kernel->minimum, kernel->values[i]); in CalcKernelMetaData()
2496 Maximize(kernel->maximum, kernel->values[i]); in CalcKernelMetaData()
2533 % const ssize_t iterations,const KernelInfo *kernel,
2550 % o kernel: An array of double representing the morphology kernel.
2552 % o compose: How to handle or merge multi-kernel results.
2554 % If 'NoCompositeOp' force image to be re-iterated by each kernel.
2563 const MorphologyMethod method,const KernelInfo *kernel,const double bias, in MorphologyPrimitive() argument
2594 assert(kernel != (KernelInfo *) NULL); in MorphologyPrimitive()
2595 assert(kernel->signature == MagickCoreSignature); in MorphologyPrimitive()
2602 width=image->columns+kernel->width-1; in MorphologyPrimitive()
2613 Kernel needs to used with reflection about origin. in MorphologyPrimitive()
2615 offset.x=(ssize_t) kernel->width-kernel->x-1; in MorphologyPrimitive()
2616 offset.y=(ssize_t) kernel->height-kernel->y-1; in MorphologyPrimitive()
2625 offset.x=kernel->x; in MorphologyPrimitive()
2626 offset.y=kernel->y; in MorphologyPrimitive()
2643 if ((method == ConvolveMorphology) && (kernel->width == 1)) in MorphologyPrimitive()
2678 kernel->height-1,exception); in MorphologyPrimitive()
2729 k=(&kernel->values[kernel->height-1]); in MorphologyPrimitive()
2736 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
2749 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
2766 gamma*=(double) kernel->height/count; in MorphologyPrimitive()
2824 kernel->height,exception); in MorphologyPrimitive()
2919 Weighted Average of pixels using reflected kernel in MorphologyPrimitive()
2922 the kernel needs to be applied in its reflected form. That is in MorphologyPrimitive()
2926 the kernel, and thus 'lower-level' that Convolution. However as in MorphologyPrimitive()
2929 kernel, so it is Convolution that is implemented. in MorphologyPrimitive()
2931 Correlation will have its kernel reflected before calling this in MorphologyPrimitive()
2937 k=(&kernel->values[kernel->width*kernel->height-1]); in MorphologyPrimitive()
2944 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
2946 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
2964 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
2966 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
2985 Minimum value within kernel neighbourhood. in MorphologyPrimitive()
2987 The kernel is not reflected for this operation. In normal in MorphologyPrimitive()
2988 Greyscale Morphology, the kernel value should be added in MorphologyPrimitive()
2992 k=kernel->values; in MorphologyPrimitive()
2993 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
2995 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
3012 Maximum value within kernel neighbourhood. in MorphologyPrimitive()
3015 the kernel needs to be applied in its reflected form. That is in MorphologyPrimitive()
3018 In normal Greyscale Morphology, the kernel value should be in MorphologyPrimitive()
3022 k=(&kernel->values[kernel->width*kernel->height-1]); in MorphologyPrimitive()
3023 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
3025 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
3046 The kernel is not reflected for this operation, and consists in MorphologyPrimitive()
3055 k=kernel->values; in MorphologyPrimitive()
3056 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
3058 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
3093 Select pixel with minimum intensity within kernel neighbourhood. in MorphologyPrimitive()
3095 The kernel is not reflected for this operation. in MorphologyPrimitive()
3097 k=kernel->values; in MorphologyPrimitive()
3098 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
3100 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
3123 Select pixel with maximum intensity within kernel neighbourhood. in MorphologyPrimitive()
3125 The kernel is not reflected for this operation. in MorphologyPrimitive()
3127 k=(&kernel->values[kernel->width*kernel->height-1]); in MorphologyPrimitive()
3128 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
3130 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
3157 It works by adding kernel values to the neighbourhood, and in MorphologyPrimitive()
3158 select the minimum value found. The kernel is rotated before in MorphologyPrimitive()
3159 use, so kernel distances match resulting distances, when a user in MorphologyPrimitive()
3160 provided asymmetric kernel is applied. in MorphologyPrimitive()
3165 GreyDilate Kernel values added, maximum value found Kernel is in MorphologyPrimitive()
3168 GrayErode: Kernel values subtracted and minimum value found No in MorphologyPrimitive()
3169 kernel rotation used. in MorphologyPrimitive()
3172 GrayErode, but with negative kernel values, and kernel rotation in MorphologyPrimitive()
3175 k=(&kernel->values[kernel->width*kernel->height-1]); in MorphologyPrimitive()
3176 for (v=0; v < (ssize_t) kernel->height; v++) in MorphologyPrimitive()
3178 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitive()
3206 gamma*=(double) kernel->height*kernel->width/count; in MorphologyPrimitive()
3250 const MorphologyMethod method,const KernelInfo *kernel, in MorphologyPrimitiveDirect() argument
3275 assert(kernel != (KernelInfo *) NULL); in MorphologyPrimitiveDirect()
3276 assert(kernel->signature == MagickCoreSignature); in MorphologyPrimitiveDirect()
3288 Kernel reflected about origin. in MorphologyPrimitiveDirect()
3290 offset.x=(ssize_t) kernel->width-kernel->x-1; in MorphologyPrimitiveDirect()
3291 offset.y=(ssize_t) kernel->height-kernel->y-1; in MorphologyPrimitiveDirect()
3296 offset.x=kernel->x; in MorphologyPrimitiveDirect()
3297 offset.y=kernel->y; in MorphologyPrimitiveDirect()
3306 width=image->columns+kernel->width-1; in MorphologyPrimitiveDirect()
3323 Only top half of kernel is processed as we do a single pass downward in MorphologyPrimitiveDirect()
3377 k=(&kernel->values[kernel->width*kernel->height-1]); in MorphologyPrimitiveDirect()
3380 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitiveDirect()
3392 k=(&kernel->values[kernel->width*(kernel->y+1)-1]); in MorphologyPrimitiveDirect()
3408 k=(&kernel->values[kernel->width*kernel->height-1]); in MorphologyPrimitiveDirect()
3411 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitiveDirect()
3423 k=(&kernel->values[kernel->width*(kernel->y+1)-1]); in MorphologyPrimitiveDirect()
3486 Only the bottom half of the kernel is processed as we up the image. in MorphologyPrimitiveDirect()
3491 kernel->y+1,exception); in MorphologyPrimitiveDirect()
3541 k=(&kernel->values[kernel->width*(kernel->y+1)-1]); in MorphologyPrimitiveDirect()
3542 for (v=offset.y; v < (ssize_t) kernel->height; v++) in MorphologyPrimitiveDirect()
3544 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitiveDirect()
3556 k=(&kernel->values[kernel->width*kernel->y+kernel->x-1]); in MorphologyPrimitiveDirect()
3558 for (u=offset.x+1; u < (ssize_t) kernel->width; u++) in MorphologyPrimitiveDirect()
3572 k=(&kernel->values[kernel->width*(kernel->y+1)-1]); in MorphologyPrimitiveDirect()
3573 for (v=offset.y; v < (ssize_t) kernel->height; v++) in MorphologyPrimitiveDirect()
3575 for (u=0; u < (ssize_t) kernel->width; u++) in MorphologyPrimitiveDirect()
3587 k=(&kernel->values[kernel->width*(kernel->y+1)-1]); in MorphologyPrimitiveDirect()
3589 for (u=offset.x+1; u < (ssize_t) kernel->width; u++) in MorphologyPrimitiveDirect()
3643 const KernelInfo *kernel, const CompositeOperator compose,const double bias, in MorphologyApply() argument
3653 *rslt_image; /* resultant image - after multi-kernel handling */ in MorphologyApply()
3656 *reflected_kernel, /* A reflected copy of the kernel (if needed) */ in MorphologyApply()
3657 *norm_kernel, /* the current normal un-reflected kernel */ in MorphologyApply()
3658 *rflt_kernel, /* the current reflected kernel (if needed) */ in MorphologyApply()
3659 *this_kernel; /* the kernel being applied */ in MorphologyApply()
3665 rslt_compose; /* multi-kernel compose method for results to use */ in MorphologyApply()
3674 kernel_number, /* Loop 2: the kernel number being applied */ in MorphologyApply()
3677 kernel_loop, /* Loop 4: iterate the kernel over image */ in MorphologyApply()
3678 kernel_limit, /* number of times to iterate kernel */ in MorphologyApply()
3680 kernel_changed, /* total count of changed using iterated kernel */ in MorphologyApply()
3691 assert(kernel != (KernelInfo *) NULL); in MorphologyApply()
3692 assert(kernel->signature == MagickCoreSignature); in MorphologyApply()
3716 * + multi-kernel compose method to use (by default) in MorphologyApply()
3736 rslt_compose = LightenCompositeOp; /* Union of multi-kernel results */ in MorphologyApply()
3741 kernel_limit = 1; /* do not do kernel iteration */ in MorphologyApply()
3762 changed=MorphologyPrimitiveDirect(rslt_image,method,kernel,exception); in MorphologyApply()
3785 /* Handle user (caller) specified multi-kernel composition method */ in MorphologyApply()
3791 /* Some methods require a reflected kernel to use with primitives. in MorphologyApply()
3792 * Create the reflected kernel for those methods. */ in MorphologyApply()
3799 reflected_kernel = CloneKernelInfo(kernel); in MorphologyApply()
3818 /* Loop 2: iterate over each kernel in a multi-kernel list */ in MorphologyApply()
3819 norm_kernel = (KernelInfo *) kernel; in MorphologyApply()
3820 this_kernel = (KernelInfo *) kernel; in MorphologyApply()
3832 this_kernel = norm_kernel; /* default use unreflected kernel */ in MorphologyApply()
3856 this_kernel = rflt_kernel; /* use the reflected kernel */ in MorphologyApply()
3862 this_kernel = rflt_kernel; /* use the reflected kernel */ in MorphologyApply()
3875 case 3: /* Reflect kernel a close */ in MorphologyApply()
3876 this_kernel = rflt_kernel; /* use the reflected kernel */ in MorphologyApply()
3880 this_kernel = rflt_kernel; /* use the reflected kernel */ in MorphologyApply()
3894 /* A Correlation is a Convolution with a reflected kernel. in MorphologyApply()
3896 ** kernel. It may seem stange to convert a Correlation into a in MorphologyApply()
3900 ** kernel when it is not required (which is typically the in MorphologyApply()
3903 this_kernel = rflt_kernel; /* use the reflected kernel */ in MorphologyApply()
3925 /* Loop 4: Iterate the kernel with primitive */ in MorphologyApply()
3930 kernel_loop++; /* the iteration of this kernel */ in MorphologyApply()
3969 } /* End Loop 4: Iterate the kernel with primitive */ in MorphologyApply()
4018 /* multi-kernel handling: re-iterate, or compose results */ in MorphologyApply()
4019 if ( kernel->next == (KernelInfo *) NULL ) in MorphologyApply()
4055 /* loop to the next kernel in a multi-kernel list */ in MorphologyApply()
4060 } /* End Loop 2: Loop over each kernel */ in MorphologyApply()
4098 % MorphologyImage() applies a user supplied kernel to the image according to
4106 % * Kernel Scale/normalize settings ("-define convolve:scale=??")
4107 % This can also includes the addition of a scaled unity kernel.
4108 % * Show Kernel being applied ("-define morphology:showKernel=1")
4117 % const ssize_t iterations,KernelInfo *kernel,ExceptionInfo *exception)
4130 % o kernel: An array of double representing the morphology kernel.
4131 % Warning: kernel may be normalized for the Convolve method.
4138 const KernelInfo *kernel,ExceptionInfo *exception) in MorphologyImage() argument
4155 curr_kernel = (KernelInfo *) kernel; in MorphologyImage()
4175 /* Scale kernel according to user wishes */ in MorphologyImage()
4183 if ( curr_kernel == kernel ) in MorphologyImage()
4184 curr_kernel = CloneKernelInfo(kernel); in MorphologyImage()
4192 /* display the (normalized) kernel via stderr */ in MorphologyImage()
4197 /* Override the default handling of multi-kernel morphology results in MorphologyImage()
4224 if ( curr_kernel != kernel ) in MorphologyImage()
4240 % RotateKernelInfo() rotates the kernel by the angle given.
4248 % void RotateKernelInfo(KernelInfo *kernel, double angle)
4252 % o kernel: the Morphology/Convolution kernel
4259 static void RotateKernelInfo(KernelInfo *kernel, double angle) in RotateKernelInfo() argument
4262 if ( kernel->next != (KernelInfo *) NULL) in RotateKernelInfo()
4263 RotateKernelInfo(kernel->next, angle); in RotateKernelInfo()
4265 /* WARNING: Currently assumes the kernel (rightly) is horizontally symetrical in RotateKernelInfo()
4279 switch (kernel->type) { in RotateKernelInfo()
4315 if ( kernel->width == 3 && kernel->height == 3 ) in RotateKernelInfo()
4317 double t = kernel->values[0]; in RotateKernelInfo()
4318 kernel->values[0] = kernel->values[3]; in RotateKernelInfo()
4319 kernel->values[3] = kernel->values[6]; in RotateKernelInfo()
4320 kernel->values[6] = kernel->values[7]; in RotateKernelInfo()
4321 kernel->values[7] = kernel->values[8]; in RotateKernelInfo()
4322 kernel->values[8] = kernel->values[5]; in RotateKernelInfo()
4323 kernel->values[5] = kernel->values[2]; in RotateKernelInfo()
4324 kernel->values[2] = kernel->values[1]; in RotateKernelInfo()
4325 kernel->values[1] = t; in RotateKernelInfo()
4327 if ( kernel->x != 1 || kernel->y != 1 ) { in RotateKernelInfo()
4329 x = (ssize_t) kernel->x-1; in RotateKernelInfo()
4330 y = (ssize_t) kernel->y-1; in RotateKernelInfo()
4335 kernel->x = (ssize_t) x+1; in RotateKernelInfo()
4336 kernel->y = (ssize_t) y+1; in RotateKernelInfo()
4339 kernel->angle = fmod(kernel->angle+45.0, 360.0); in RotateKernelInfo()
4342 perror("Unable to rotate non-3x3 kernel by 45 degrees"); in RotateKernelInfo()
4346 if ( kernel->width == 1 || kernel->height == 1 ) in RotateKernelInfo()
4347 { /* Do a transpose of a 1 dimensional kernel, in RotateKernelInfo()
4352 t = (ssize_t) kernel->width; in RotateKernelInfo()
4353 kernel->width = kernel->height; in RotateKernelInfo()
4354 kernel->height = (size_t) t; in RotateKernelInfo()
4355 t = kernel->x; in RotateKernelInfo()
4356 kernel->x = kernel->y; in RotateKernelInfo()
4357 kernel->y = t; in RotateKernelInfo()
4358 if ( kernel->width == 1 ) { in RotateKernelInfo()
4360 kernel->angle = fmod(kernel->angle+90.0, 360.0); in RotateKernelInfo()
4363 kernel->angle = fmod(kernel->angle+270.0, 360.0); in RotateKernelInfo()
4366 else if ( kernel->width == kernel->height ) in RotateKernelInfo()
4374 k=kernel->values; in RotateKernelInfo()
4375 for( i=0, x=(ssize_t) kernel->width-1; i<=x; i++, x--) in RotateKernelInfo()
4376 for( j=0, y=(ssize_t) kernel->height-1; j<y; j++, y--) in RotateKernelInfo()
4377 { t = k[i+j*kernel->width]; in RotateKernelInfo()
4378 k[i+j*kernel->width] = k[j+x*kernel->width]; in RotateKernelInfo()
4379 k[j+x*kernel->width] = k[x+y*kernel->width]; in RotateKernelInfo()
4380 k[x+y*kernel->width] = k[y+i*kernel->width]; in RotateKernelInfo()
4381 k[y+i*kernel->width] = t; in RotateKernelInfo()
4386 x = (ssize_t) (kernel->x*2-kernel->width+1); in RotateKernelInfo()
4387 y = (ssize_t) (kernel->y*2-kernel->height+1); in RotateKernelInfo()
4388 kernel->x = (ssize_t) ( -y +(ssize_t) kernel->width-1)/2; in RotateKernelInfo()
4389 kernel->y = (ssize_t) ( +x +(ssize_t) kernel->height-1)/2; in RotateKernelInfo()
4392 kernel->angle = fmod(kernel->angle+90.0, 360.0); in RotateKernelInfo()
4395 perror("Unable to rotate a non-square, non-linear kernel 90 degrees"); in RotateKernelInfo()
4401 * Basically all that is needed is a reversal of the kernel data! in RotateKernelInfo()
4414 k=kernel->values; in RotateKernelInfo()
4415 j=(ssize_t) (kernel->width*kernel->height-1); in RotateKernelInfo()
4419 kernel->x = (ssize_t) kernel->width - kernel->x - 1; in RotateKernelInfo()
4420 kernel->y = (ssize_t) kernel->height - kernel->y - 1; in RotateKernelInfo()
4422 kernel->angle = fmod(kernel->angle+180.0, 360.0); in RotateKernelInfo()
4426 * performed here, posibily with a linear kernel restriction. in RotateKernelInfo()
4445 % and modifies the kernel according to the parsed arguments of that setting.
4448 % ScaleKernelInfo() to scale/normalize the kernel. The second argument
4449 % is then passed to UnityAddKernelInfo() to add a scled unity kernel
4450 % into the scaled/normalized kernel.
4454 % void ScaleGeometryKernelInfo(KernelInfo *kernel,
4459 % o kernel: the Morphology/Convolution kernel to modify
4466 MagickExport void ScaleGeometryKernelInfo (KernelInfo *kernel, in ScaleGeometryKernelInfo() argument
4492 /* Scale/Normalize the input kernel */ in ScaleGeometryKernelInfo()
4493 ScaleKernelInfo(kernel, args.rho, (GeometryFlags) flags); in ScaleGeometryKernelInfo()
4495 /* Add Unity Kernel, for blending with original */ in ScaleGeometryKernelInfo()
4497 UnityAddKernelInfo(kernel, args.sigma); in ScaleGeometryKernelInfo()
4512 % ScaleKernelInfo() scales the given kernel list by the given amount, with or
4513 % without normalization of the sum of the kernel values (as per given flags).
4515 % By default (no flags given) the values within the kernel is scaled
4518 % If either of the two 'normalize_flags' are given the kernel will first be
4521 % Kernel normalization ('normalize_flags' given) is designed to ensure that
4522 % any use of the kernel scaling factor with 'Convolve' or 'Correlate'
4528 % 'Gaussian' kernel) will be scaled so that those values sum to +1.0,
4532 % the kernel will be scaled by the absolute of the sum of kernel values, so
4535 % For kernels whose values sum to zero, (such as 'Laplician' kernels) kernel
4542 % values separately to those of the negative values, so the kernel will be
4543 % forced to become a zero-sum kernel better suited to such searches.
4545 % WARNING: Correct normalization of the kernel assumes that the '*_range'
4546 % attributes within the kernel structure have been correctly set during the
4555 % void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
4560 % o kernel: the Morphology/Convolution kernel
4564 % zero. If the kernel is normalized regardless of any flags.
4572 MagickExport void ScaleKernelInfo(KernelInfo *kernel, in ScaleKernelInfo() argument
4582 /* do the other kernels in a multi-kernel list first */ in ScaleKernelInfo()
4583 if ( kernel->next != (KernelInfo *) NULL) in ScaleKernelInfo()
4584 ScaleKernelInfo(kernel->next, scaling_factor, normalize_flags); in ScaleKernelInfo()
4586 /* Normalization of Kernel */ in ScaleKernelInfo()
4589 if ( fabs(kernel->positive_range + kernel->negative_range) >= MagickEpsilon ) in ScaleKernelInfo()
4590 /* non-zero-summing kernel (generally positive) */ in ScaleKernelInfo()
4591 pos_scale = fabs(kernel->positive_range + kernel->negative_range); in ScaleKernelInfo()
4593 /* zero-summing kernel */ in ScaleKernelInfo()
4594 pos_scale = kernel->positive_range; in ScaleKernelInfo()
4596 /* Force kernel into a normalized zero-summing kernel */ in ScaleKernelInfo()
4598 pos_scale = ( fabs(kernel->positive_range) >= MagickEpsilon ) in ScaleKernelInfo()
4599 ? kernel->positive_range : 1.0; in ScaleKernelInfo()
4600 neg_scale = ( fabs(kernel->negative_range) >= MagickEpsilon ) in ScaleKernelInfo()
4601 ? -kernel->negative_range : 1.0; in ScaleKernelInfo()
4610 for (i=0; i < (ssize_t) (kernel->width*kernel->height); i++) in ScaleKernelInfo()
4611 if (!IsNaN(kernel->values[i])) in ScaleKernelInfo()
4612 kernel->values[i] *= (kernel->values[i] >= 0) ? pos_scale : neg_scale; in ScaleKernelInfo()
4615 kernel->positive_range *= pos_scale; in ScaleKernelInfo()
4616 kernel->negative_range *= neg_scale; in ScaleKernelInfo()
4617 /* maximum and minimum values in kernel */ in ScaleKernelInfo()
4618 kernel->maximum *= (kernel->maximum >= 0.0) ? pos_scale : neg_scale; in ScaleKernelInfo()
4619 kernel->minimum *= (kernel->minimum >= 0.0) ? pos_scale : neg_scale; in ScaleKernelInfo()
4621 /* swap kernel settings if user's scaling factor is negative */ in ScaleKernelInfo()
4624 t = kernel->positive_range; in ScaleKernelInfo()
4625 kernel->positive_range = kernel->negative_range; in ScaleKernelInfo()
4626 kernel->negative_range = t; in ScaleKernelInfo()
4627 t = kernel->maximum; in ScaleKernelInfo()
4628 kernel->maximum = kernel->minimum; in ScaleKernelInfo()
4629 kernel->minimum = 1; in ScaleKernelInfo()
4646 % ShowKernelInfo() outputs the details of the given kernel defination to
4652 % void ShowKernelInfo(const KernelInfo *kernel)
4656 % o kernel: the Morphology/Convolution kernel
4659 MagickPrivate void ShowKernelInfo(const KernelInfo *kernel) in ShowKernelInfo() argument
4667 for (c=0, k=kernel; k != (KernelInfo *) NULL; c++, k=k->next ) { in ShowKernelInfo()
4669 (void) FormatLocaleFile(stderr, "Kernel"); in ShowKernelInfo()
4670 if ( kernel->next != (KernelInfo *) NULL ) in ShowKernelInfo()
4716 % UnityAddKernelInfo() Adds a given amount of the 'Unity' Convolution Kernel
4717 % to the given pre-scaled and normalized Kernel. This in effect adds that
4718 % amount of the original image into the resulting convolution kernel. This
4727 % void UnityAdditionKernelInfo(KernelInfo *kernel, const double scale )
4731 % o kernel: the Morphology/Convolution kernel
4734 % scaling factor for the unity kernel to be added to
4735 % the given kernel.
4738 MagickExport void UnityAddKernelInfo(KernelInfo *kernel, in UnityAddKernelInfo() argument
4741 /* do the other kernels in a multi-kernel list first */ in UnityAddKernelInfo()
4742 if ( kernel->next != (KernelInfo *) NULL) in UnityAddKernelInfo()
4743 UnityAddKernelInfo(kernel->next, scale); in UnityAddKernelInfo()
4745 /* Add the scaled unity kernel to the existing kernel */ in UnityAddKernelInfo()
4746 kernel->values[kernel->x+kernel->y*kernel->width] += scale; in UnityAddKernelInfo()
4747 CalcKernelMetaData(kernel); /* recalculate the meta-data */ in UnityAddKernelInfo()
4764 % the kernel with a zero value. This is typically done when the kernel will
4770 % void ZeroKernelNans (KernelInfo *kernel)
4774 % o kernel: the Morphology/Convolution kernel
4777 MagickPrivate void ZeroKernelNans(KernelInfo *kernel) in ZeroKernelNans() argument
4782 /* do the other kernels in a multi-kernel list first */ in ZeroKernelNans()
4783 if (kernel->next != (KernelInfo *) NULL) in ZeroKernelNans()
4784 ZeroKernelNans(kernel->next); in ZeroKernelNans()
4786 for (i=0; i < (kernel->width*kernel->height); i++) in ZeroKernelNans()
4787 if (IsNaN(kernel->values[i])) in ZeroKernelNans()
4788 kernel->values[i]=0.0; in ZeroKernelNans()