MagickExport Image *EdgeImage(const Image *image,const double radius,
ExceptionInfo *exception)
{
- char
- geometry[MaxTextExtent];
+ Image
+ *edge_image;
KernelInfo
*kernel_info;
- Image
- *edge_image;
+ register ssize_t
+ i;
+
+ size_t
+ width;
assert(image != (const Image *) NULL);
assert(image->signature == MagickSignature);
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
assert(exception != (ExceptionInfo *) NULL);
assert(exception->signature == MagickSignature);
- (void) FormatLocaleString(geometry,MaxTextExtent,"square:%.20g",radius);
- kernel_info=AcquireKernelInfo(geometry);
+ width=GetOptimalKernelWidth1D(radius,0.5);
+ kernel_info=AcquireKernelInfo((const char *) NULL);
if (kernel_info == (KernelInfo *) NULL)
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
- edge_image=MorphologyApply(image,EdgeInMorphology,1,kernel_info,
+ (void) ResetMagickMemory(kernel_info,0,sizeof(*kernel_info));
+ kernel_info->width=width;
+ kernel_info->height=width;
+ kernel_info->x=(ssize_t) (kernel_info->width-1)/2;
+ kernel_info->y=(ssize_t) (kernel_info->height-1)/2;
+ kernel_info->signature=MagickSignature;
+ kernel_info->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel_info->width,kernel_info->height*
+ sizeof(*kernel_info->values)));
+ if (kernel_info->values == (MagickRealType *) NULL)
+ {
+ kernel_info=DestroyKernelInfo(kernel_info);
+ ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
+ }
+ for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++)
+ kernel_info->values[i]=(-1.0);
+ kernel_info->values[i/2]=(double) kernel_info->width*kernel_info->height-1.0;
+ edge_image=MorphologyApply(image,ConvolveMorphology,1,kernel_info,
UndefinedCompositeOp,0.0,exception);
kernel_info=DestroyKernelInfo(kernel_info);
return(edge_image);
vertical kernels (such as a 'BlurKernel')
*/
#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,4) shared(progress,status) \
+ #pragma omp parallel for schedule(static,4) shared(changed,progress,status) \
magick_threads(image,morphology_image,image->columns,1)
#endif
for (x=0; x < (ssize_t) image->columns; x++)
pixels+=GetPixelChannels(image);
}
}
+ #pragma omp critical (MagickCore_MorphologyImage)
if (fabs(pixel-p[center+i]) > MagickEpsilon)
changed++;
SetPixelChannel(morphology_image,channel,ClampToQuantum(pixel),q);
Normal handling of horizontal or rectangular kernels (row by row).
*/
#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,4) shared(progress,status) \
+ #pragma omp parallel for schedule(static,4) shared(changed,progress,status) \
magick_threads(image,morphology_image,image->rows,1)
#endif
for (y=0; y < (ssize_t) image->rows; y++)
default:
break;
}
+ #pragma omp critical (MagickCore_MorphologyImage)
if (fabs(pixel-p[center+i]) > MagickEpsilon)
changed++;
SetPixelChannel(morphology_image,channel,ClampToQuantum(pixel),q);