const double sigma,const double lower_percent,const double upper_percent,
ExceptionInfo *exception)
{
+#define CannyEdgeImageTag "CannyEdge/Image"
+
CacheView
*edge_view;
MagickBooleanType
status;
+ MagickOffsetType
+ progress;
+
MatrixInfo
*canny_cache;
Non-maxima suppression, remove pixels that are not considered to be part
of an edge.
*/
+ progress=0;
(void) GetMatrixElement(canny_cache,0,0,&pixel);
max=pixel.intensity;
min=pixel.intensity;
status=TraceEdges(edge_image,edge_view,canny_cache,x,y,lower_threshold,
exception);
}
+ if (image->progress_monitor != (MagickProgressMonitor) NULL)
+ {
+ MagickBooleanType
+ proceed;
+
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp critical (MagickCore_CannyEdgeImage)
+#endif
+ proceed=SetImageProgress(image,CannyEdgeImageTag,progress++,
+ image->rows);
+ if (proceed == MagickFalse)
+ status=MagickFalse;
+ }
}
edge_view=DestroyCacheView(edge_view);
/*
MagickExport Image *HoughLineImage(const Image *image,const size_t width,
const size_t height,const size_t threshold,ExceptionInfo *exception)
{
+#define HoughLineImageTag "HoughLine/Image"
+
CacheView
*image_view;
MagickBooleanType
status;
+ MagickOffsetType
+ progress;
+
MatrixInfo
*accumulator;
Populate the accumulator.
*/
status=MagickTrue;
+ progress=0;
center.x=(double) image->columns/2.0;
center.y=(double) image->rows/2.0;
image_view=AcquireVirtualCacheView(image,exception);
}
p+=GetPixelChannels(image);
}
+ if (image->progress_monitor != (MagickProgressMonitor) NULL)
+ {
+ MagickBooleanType
+ proceed;
+
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp critical (MagickCore_CannyEdgeImage)
+#endif
+ proceed=SetImageProgress(image,CannyEdgeImageTag,progress++,
+ image->rows);
+ if (proceed == MagickFalse)
+ status=MagickFalse;
+ }
}
image_view=DestroyCacheView(image_view);
if (status == MagickFalse)