diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp
index 05fb5c6..d2cf163 100644
--- a/Magick++/lib/Image.cpp
+++ b/Magick++/lib/Image.cpp
@@ -864,12 +864,22 @@
}
// Hilight edges in image
-void Magick::Image::edge ( const double radius_ )
+void Magick::Image::edge ( const double radius_)
{
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
MagickCore::Image* newImage =
- EdgeImage( image(), radius_, &exceptionInfo );
+ EdgeImage( image(), radius_, 1.0, &exceptionInfo );
+ replaceImage( newImage );
+ throwException( exceptionInfo );
+ (void) DestroyExceptionInfo( &exceptionInfo );
+}
+void Magick::Image::edge ( const double radius_, const double sigma_ )
+{
+ ExceptionInfo exceptionInfo;
+ GetExceptionInfo( &exceptionInfo );
+ MagickCore::Image* newImage =
+ EdgeImage( image(), radius_, sigma_, &exceptionInfo );
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
diff --git a/Magick++/lib/Magick++/Image.h b/Magick++/lib/Magick++/Image.h
index 8d3986f..dd0397c 100644
--- a/Magick++/lib/Magick++/Image.h
+++ b/Magick++/lib/Magick++/Image.h
@@ -284,6 +284,8 @@
// Edge image (hilight edges in image)
void edge ( const double radius_ = 0.0 );
+ void edge ( const double radius_ = 0.0,
+ const double sigma_ = 1.0);
// Emboss image (hilight edges with 3D effect)
// The radius_ parameter specifies the radius of the Gaussian, in
diff --git a/Magick++/lib/Magick++/STL.h b/Magick++/lib/Magick++/STL.h
index 2c3074e..df6c43a 100644
--- a/Magick++/lib/Magick++/STL.h
+++ b/Magick++/lib/Magick++/STL.h
@@ -389,12 +389,13 @@
class MagickDLLDecl edgeImage : public std::unary_function<Image&,void>
{
public:
- edgeImage( const double radius_ = 0.0 );
+ edgeImage( const double radius_ = 0.0, const double sigma_ = 0.5 );
void operator()( Image &image_ ) const;
private:
double _radius;
+ double _sigma;
};
// Emboss image (hilight edges with 3D effect)
diff --git a/Magick++/lib/STL.cpp b/Magick++/lib/STL.cpp
index fdeee8a..0a79fcc 100644
--- a/Magick++/lib/STL.cpp
+++ b/Magick++/lib/STL.cpp
@@ -335,13 +335,14 @@
}
// Edge image (hilight edges in image)
-Magick::edgeImage::edgeImage( const double radius_ )
- : _radius( radius_ )
+Magick::edgeImage::edgeImage( const double radius_, const double sigma_ )
+ : _radius( radius_ ),
+ _sigma( sigma_ )
{
}
void Magick::edgeImage::operator()( Magick::Image &image_ ) const
{
- image_.edge( _radius );
+ image_.edge( _radius, _sigma );
}
// Emboss image (hilight edges with 3D effect)
diff --git a/MagickCore/display.c b/MagickCore/display.c
index 536b064..3a3365a 100644
--- a/MagickCore/display.c
+++ b/MagickCore/display.c
@@ -8316,7 +8316,8 @@
XSetCursorState(display,windows,MagickTrue);
XCheckRefreshWindows(display,windows);
flags=ParseGeometry(radius,&geometry_info);
- edge_image=EdgeImage(*image,geometry_info.rho,exception);
+ edge_image=EdgeImage(*image,geometry_info.rho,geometry_info.sigma,
+ exception);
if (edge_image != (Image *) NULL)
{
*image=DestroyImage(*image);
@@ -8351,7 +8352,8 @@
XSetCursorState(display,windows,MagickTrue);
XCheckRefreshWindows(display,windows);
flags=ParseGeometry(amount,&geometry_info);
- spread_image=EdgeImage(*image,geometry_info.rho,exception);
+ spread_image=EdgeImage(*image,geometry_info.rho,geometry_info.sigma,
+ exception);
if (spread_image != (Image *) NULL)
{
*image=DestroyImage(*image);
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 6e35d15..fa49098 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -226,7 +226,7 @@
/*
Edge detect the image brighness channel, level, blur, and level again.
*/
- edge_image=EdgeImage(image,radius,exception);
+ edge_image=EdgeImage(image,radius,sigma,exception);
if (edge_image == (Image *) NULL)
{
blur_image=DestroyImage(blur_image);
@@ -401,7 +401,7 @@
proceed;
#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickCore_AdaptiveSharpenImage)
+ #pragma omp critical (MagickCore_AdaptiveBlurImage)
#endif
proceed=SetImageProgress(image,AdaptiveBlurImageTag,progress++,
image->rows);
@@ -517,7 +517,7 @@
/*
Edge detect the image brighness channel, level, sharp, and level again.
*/
- edge_image=EdgeImage(image,radius,exception);
+ edge_image=EdgeImage(image,radius,sigma,exception);
if (edge_image == (Image *) NULL)
{
sharp_image=DestroyImage(sharp_image);
@@ -1741,7 +1741,7 @@
% The format of the EdgeImage method is:
%
% Image *EdgeImage(const Image *image,const double radius,
-% ExceptionInfo *exception)
+% const double sigma,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
@@ -1749,11 +1749,13 @@
%
% o radius: the radius of the pixel neighborhood.
%
+% o sigma: the standard deviation of the Gaussian, in pixels.
+%
% o exception: return any errors or warnings in this structure.
%
*/
MagickExport Image *EdgeImage(const Image *image,const double radius,
- ExceptionInfo *exception)
+ const double sigma,ExceptionInfo *exception)
{
Image
*edge_image;
@@ -1778,7 +1780,7 @@
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
assert(exception != (ExceptionInfo *) NULL);
assert(exception->signature == MagickSignature);
- width=GetOptimalKernelWidth1D(radius,0.5);
+ width=GetOptimalKernelWidth2D(radius,sigma);
kernel_info=AcquireKernelInfo((const char *) NULL);
if (kernel_info == (KernelInfo *) NULL)
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
@@ -2605,7 +2607,7 @@
}
case EdgeDetectPreview:
{
- preview_image=EdgeImage(thumbnail,radius,exception);
+ preview_image=EdgeImage(thumbnail,radius,sigma,exception);
(void) FormatLocaleString(label,MaxTextExtent,"edge %g",radius);
break;
}
diff --git a/MagickCore/effect.h b/MagickCore/effect.h
index 40cfd0d..6d83189 100644
--- a/MagickCore/effect.h
+++ b/MagickCore/effect.h
@@ -78,7 +78,7 @@
*BlurImage(const Image *,const double,const double,ExceptionInfo *),
*ConvolveImage(const Image *,const KernelInfo *,ExceptionInfo *),
*DespeckleImage(const Image *,ExceptionInfo *),
- *EdgeImage(const Image *,const double,ExceptionInfo *),
+ *EdgeImage(const Image *,const double,const double,ExceptionInfo *),
*EmbossImage(const Image *,const double,const double,ExceptionInfo *),
*GaussianBlurImage(const Image *,const double,const double,ExceptionInfo *),
*MotionBlurImage(const Image *,const double,const double,const double,
diff --git a/MagickCore/fx.c b/MagickCore/fx.c
index 640bbf4..34f65a3 100644
--- a/MagickCore/fx.c
+++ b/MagickCore/fx.c
@@ -641,7 +641,7 @@
if (clone_image == (Image *) NULL)
return((Image *) NULL);
(void) SetImageType(clone_image,GrayscaleType,exception);
- edge_image=EdgeImage(clone_image,radius,exception);
+ edge_image=EdgeImage(clone_image,radius,sigma,exception);
clone_image=DestroyImage(clone_image);
if (edge_image == (Image *) NULL)
return((Image *) NULL);
@@ -4366,7 +4366,7 @@
random_image=DestroyImage(random_image);
if (blur_image == (Image *) NULL)
return((Image *) NULL);
- dodge_image=EdgeImage(blur_image,radius,exception);
+ dodge_image=EdgeImage(blur_image,radius,sigma,exception);
blur_image=DestroyImage(blur_image);
if (dodge_image == (Image *) NULL)
return((Image *) NULL);
diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c
index 20abc98..9d66efd 100644
--- a/MagickWand/magick-image.c
+++ b/MagickWand/magick-image.c
@@ -2502,7 +2502,8 @@
%
% The format of the MagickEdgeImage method is:
%
-% MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius)
+% MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius,
+% const double sigma)
%
% A description of each parameter follows:
%
@@ -2510,9 +2511,11 @@
%
% o radius: the radius of the pixel neighborhood.
%
+% o sigma: the standard deviation of the Gaussian, in pixels.
+%
*/
WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand,
- const double radius)
+ const double radius,const double sigma)
{
Image
*edge_image;
@@ -2523,7 +2526,7 @@
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- edge_image=EdgeImage(wand->images,radius,wand->exception);
+ edge_image=EdgeImage(wand->images,radius,sigma,wand->exception);
if (edge_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,edge_image);
diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h
index 8e2cb98..1f3e198 100644
--- a/MagickWand/magick-image.h
+++ b/MagickWand/magick-image.h
@@ -118,7 +118,7 @@
MagickDistortImage(MagickWand *,const DistortImageMethod,const size_t,
const double *,const MagickBooleanType),
MagickDrawImage(MagickWand *,const DrawingWand *),
- MagickEdgeImage(MagickWand *,const double),
+ MagickEdgeImage(MagickWand *,const double,const double),
MagickEmbossImage(MagickWand *,const double,const double),
MagickEncipherImage(MagickWand *,const char *),
MagickEnhanceImage(MagickWand *),
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index e6a1dde..97ec4a7 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -1409,7 +1409,8 @@
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
- mogrify_image=EdgeImage(*image,geometry_info.rho,exception);
+ mogrify_image=EdgeImage(*image,geometry_info.rho,
+ geometry_info.sigma,exception);
break;
}
if (LocaleCompare("emboss",option+1) == 0)
diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs
index c5b907e..e4ebb75 100644
--- a/PerlMagick/Magick.xs
+++ b/PerlMagick/Magick.xs
@@ -7606,7 +7606,8 @@
{
if (attribute_flag[0] != 0)
geometry_info.rho=argument_list[0].real_reference;
- image=EdgeImage(image,geometry_info.rho,exception);
+ image=EdgeImage(image,geometry_info.rho,geometry_info.sigma,
+ exception);
break;
}
case 11: /* Emboss */
diff --git a/coders/msl.c b/coders/msl.c
index 042d8ed..06d6be9 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -2762,7 +2762,7 @@
}
}
edge_image=EdgeImage(msl_info->image[n],geometry_info.rho,
- &msl_info->image[n]->exception);
+ geometry_info.sigma,&msl_info->image[n]->exception);
if (edge_image == (Image *) NULL)
break;
msl_info->image[n]=DestroyImage(msl_info->image[n]);