From 7869ee9d9327c8ed3961e67df4854ca4db28994c Mon Sep 17 00:00:00 2001 From: cristy Date: Sat, 23 Mar 2013 21:24:49 +0000 Subject: [PATCH] --- Magick++/lib/Image.cpp | 12 +-- Magick++/lib/Magick++/Include.h | 1 - MagickCore/effect.c | 135 +++++--------------------------- MagickCore/effect.h | 2 +- MagickWand/magick-image.c | 12 +-- MagickWand/magick-image.h | 3 +- MagickWand/mogrify.c | 2 +- MagickWand/operation.c | 2 +- PerlMagick/quantum/quantum.xs | 9 +-- 9 files changed, 33 insertions(+), 145 deletions(-) diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index 4daa9c0b2..a3875fe4a 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -2282,8 +2282,7 @@ void Magick::Image::trim ( void ) // the threshold in pixels needed to apply the diffence amount. void Magick::Image::unsharpmask ( const double radius_, const double sigma_, - const double amount_, - const double threshold_ ) + const double gain_ ) { ExceptionInfo exceptionInfo; GetExceptionInfo( &exceptionInfo ); @@ -2291,8 +2290,7 @@ void Magick::Image::unsharpmask ( const double radius_, UnsharpMaskImage( image(), radius_, sigma_, - amount_, - threshold_, + gain_, &exceptionInfo ); replaceImage( newImage ); throwException( exceptionInfo ); @@ -2302,8 +2300,7 @@ void Magick::Image::unsharpmask ( const double radius_, void Magick::Image::unsharpmaskChannel ( const ChannelType channel_, const double radius_, const double sigma_, - const double amount_, - const double threshold_ ) + const double gain_ ) { ExceptionInfo exceptionInfo; GetExceptionInfo( &exceptionInfo ); @@ -2312,8 +2309,7 @@ void Magick::Image::unsharpmaskChannel ( const ChannelType channel_, UnsharpMaskImage( image(), radius_, sigma_, - amount_, - threshold_, + gain_, &exceptionInfo ); (void) SetPixelChannelMask( image(), channel_mask ); replaceImage( newImage ); diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h index 808a5e5c2..628d62ab9 100644 --- a/Magick++/lib/Magick++/Include.h +++ b/Magick++/lib/Magick++/Include.h @@ -953,7 +953,6 @@ namespace Magick using MagickCore::UndefinedRegistryType; using MagickCore::UnregisterMagickInfo; using MagickCore::UnsharpMaskImage; - using MagickCore::UnsharpMaskImage; using MagickCore::CacheView; using MagickCore::WaveImage; using MagickCore::WidthValue; diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 7450535a0..22dd9c6f0 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -3316,8 +3316,7 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, % The format of the UnsharpMaskImage method is: % % Image *UnsharpMaskImage(const Image *image,const double radius, -% const double sigma,const double gain,const double threshold, -% ExceptionInfo *exception) +% const double sigma,const double gain,ExceptionInfo *exception) % % A description of each parameter follows: % @@ -3331,135 +3330,37 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, % o gain: the percentage of the difference between the original and the % blur image that is added back into the original. % -% o threshold: the threshold in pixels needed to apply the diffence gain. -% % o exception: return any errors or warnings in this structure. % */ MagickExport Image *UnsharpMaskImage(const Image *image,const double radius, - const double sigma,const double gain,const double threshold, - ExceptionInfo *exception) + const double sigma,const double gain,ExceptionInfo *exception) { -#define SharpenImageTag "Sharpen/Image" + char + geometry[MaxTextExtent]; - CacheView - *image_view, - *unsharp_view; + KernelInfo + *kernel_info; Image *unsharp_image; - MagickBooleanType - status; - - MagickOffsetType - progress; - - double - quantum_threshold; - - ssize_t - y; - assert(image != (const Image *) NULL); assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); - unsharp_image=BlurImage(image,radius,sigma,exception); - if (unsharp_image == (Image *) NULL) - return((Image *) NULL); - quantum_threshold=(double) QuantumRange*threshold; - /* - Unsharp-mask image. - */ - status=MagickTrue; - progress=0; - image_view=AcquireVirtualCacheView(image,exception); - unsharp_view=AcquireAuthenticCacheView(unsharp_image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(progress,status) \ - magick_threads(image,unsharp_image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - register const Quantum - *restrict p; - - register Quantum - *restrict q; - - register ssize_t - x; - - if (status == MagickFalse) - continue; - p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); - q=QueueCacheViewAuthenticPixels(unsharp_view,0,y,unsharp_image->columns,1, - exception); - if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - register ssize_t - i; - - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) - { - double - pixel; - - PixelChannel - channel; - - PixelTrait - traits, - unsharp_traits; - - channel=GetPixelChannelChannel(image,i); - traits=GetPixelChannelTraits(image,channel); - unsharp_traits=GetPixelChannelTraits(unsharp_image,channel); - if ((traits == UndefinedPixelTrait) || - (unsharp_traits == UndefinedPixelTrait)) - continue; - if (((unsharp_traits & CopyPixelTrait) != 0) || - (GetPixelMask(image,p) == 0)) - { - SetPixelChannel(unsharp_image,channel,p[i],q); - continue; - } - pixel=p[i]-(double) GetPixelChannel(unsharp_image,channel,q); - if (fabs(2.0*pixel) < quantum_threshold) - pixel=(double) p[i]; - else - pixel=(double) p[i]+gain*pixel; - SetPixelChannel(unsharp_image,channel,ClampToQuantum(pixel),q); - } - p+=GetPixelChannels(image); - q+=GetPixelChannels(unsharp_image); - } - if (SyncCacheViewAuthenticPixels(unsharp_view,exception) == MagickFalse) - status=MagickFalse; - if (image->progress_monitor != (MagickProgressMonitor) NULL) - { - MagickBooleanType - proceed; - -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp critical (MagickCore_UnsharpMaskImage) -#endif - proceed=SetImageProgress(image,SharpenImageTag,progress++,image->rows); - if (proceed == MagickFalse) - status=MagickFalse; - } - } - unsharp_image->type=image->type; - unsharp_view=DestroyCacheView(unsharp_view); - image_view=DestroyCacheView(image_view); - if (status == MagickFalse) - unsharp_image=DestroyImage(unsharp_image); + assert(exception->signature == MagickSignature); + (void) FormatLocaleString(geometry,MaxTextExtent,"Blur:%.20gx%.20g>", + radius,sigma); + kernel_info=AcquireKernelInfo(geometry); + if (kernel_info == (KernelInfo *) NULL) + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + (void) FormatLocaleString(geometry,MaxTextExtent,"%.20g,%.20g%%", + -100.0+gain*100.0,200.0-gain*100.0); + ScaleGeometryKernelInfo(kernel_info,geometry); + unsharp_image=MorphologyImage(image,ConvolveMorphology,1,kernel_info, + exception); + kernel_info=DestroyKernelInfo(kernel_info); return(unsharp_image); } diff --git a/MagickCore/effect.h b/MagickCore/effect.h index ed68cfe87..0a42df507 100644 --- a/MagickCore/effect.h +++ b/MagickCore/effect.h @@ -80,7 +80,7 @@ extern MagickExport Image *SpreadImage(const Image *,const double,const PixelInterpolateMethod, ExceptionInfo *), *UnsharpMaskImage(const Image *,const double,const double,const double, - const double,ExceptionInfo *); + ExceptionInfo *); #if defined(__cplusplus) || defined(c_plusplus) } diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c index a5c9abeff..2a29afc51 100644 --- a/MagickWand/magick-image.c +++ b/MagickWand/magick-image.c @@ -11928,8 +11928,7 @@ WandExport MagickBooleanType MagickUniqueImageColors(MagickWand *wand) % The format of the MagickUnsharpMaskImage method is: % % MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand, -% const double radius,const double sigma,const double amount, -% const double threshold) +% const double radius,const double sigma,const double gain) % % A description of each parameter follows: % @@ -11940,15 +11939,12 @@ WandExport MagickBooleanType MagickUniqueImageColors(MagickWand *wand) % % o sigma: the standard deviation of the Gaussian, in pixels. % -% o amount: the percentage of the difference between the original and the +% o gain: the percentage of the difference between the original and the % blur image that is added back into the original. % -% o threshold: the threshold in pixels needed to apply the diffence amount. -% */ WandExport MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand, - const double radius,const double sigma,const double amount, - const double threshold) + const double radius,const double sigma,const double gain) { Image *unsharp_image; @@ -11959,7 +11955,7 @@ WandExport MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand, (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); if (wand->images == (Image *) NULL) ThrowWandException(WandError,"ContainsNoImages",wand->name); - unsharp_image=UnsharpMaskImage(wand->images,radius,sigma,amount,threshold, + unsharp_image=UnsharpMaskImage(wand->images,radius,sigma,amount, wand->exception); if (unsharp_image == (Image *) NULL) return(MagickFalse); diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h index 596cb94be..2677cdc1d 100644 --- a/MagickWand/magick-image.h +++ b/MagickWand/magick-image.h @@ -304,8 +304,7 @@ extern WandExport MagickBooleanType MagickThumbnailImage(MagickWand *,const size_t,const size_t), MagickTrimImage(MagickWand *,const double), MagickUniqueImageColors(MagickWand *), - MagickUnsharpMaskImage(MagickWand *,const double,const double,const double, - const double), + MagickUnsharpMaskImage(MagickWand *,const double,const double,const double), MagickVignetteImage(MagickWand *,const double,const double,const ssize_t, const ssize_t), MagickWaveImage(MagickWand *,const double,const double, diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c index cec3a47d2..e104d0e10 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -3049,7 +3049,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, if ((flags & PsiValue) == 0) geometry_info.psi=0.05; mogrify_image=UnsharpMaskImage(*image,geometry_info.rho, - geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception); + geometry_info.sigma,geometry_info.xi,exception); break; } break; diff --git a/MagickWand/operation.c b/MagickWand/operation.c index f3eccc268..d5553bcd0 100644 --- a/MagickWand/operation.c +++ b/MagickWand/operation.c @@ -3339,7 +3339,7 @@ static MagickBooleanType CLISimpleOperatorImage(MagickCLI *cli_wand, if ((flags & PsiValue) == 0) geometry_info.psi=0.05; new_image=UnsharpMaskImage(_image,geometry_info.rho, - geometry_info.sigma,geometry_info.xi,geometry_info.psi,_exception); + geometry_info.sigma,geometry_info.xi,_exception); break; } CLIWandExceptionBreak(OptionError,"UnrecognizedOption",option); diff --git a/PerlMagick/quantum/quantum.xs b/PerlMagick/quantum/quantum.xs index ca9c6f553..54494bbb8 100644 --- a/PerlMagick/quantum/quantum.xs +++ b/PerlMagick/quantum/quantum.xs @@ -390,8 +390,7 @@ static struct { "black-point-compensation", MagickBooleanOptions} } }, { "UnsharpMask", { {"geometry", StringReference}, {"radius", RealReference}, {"sigma", RealReference}, - {"amount", RealReference}, {"threshold", RealReference}, - {"channel", MagickChannelOptions} } }, + {"gain", RealReference}, {"channel", MagickChannelOptions} } }, { "MotionBlur", { {"geometry", StringReference}, {"radius", RealReference}, {"sigma", RealReference}, {"angle", RealReference}, {"channel", MagickChannelOptions} } }, @@ -9489,12 +9488,10 @@ Mogrify(ref,...) if (attribute_flag[3] != 0) geometry_info.xi=argument_list[3].real_reference; if (attribute_flag[4] != 0) - geometry_info.psi=argument_list[4].real_reference; - if (attribute_flag[5] != 0) - channel=(ChannelType) argument_list[5].integer_reference; + channel=(ChannelType) argument_list[4].integer_reference; channel_mask=SetImageChannelMask(image,channel); image=UnsharpMaskImage(image,geometry_info.rho,geometry_info.sigma, - geometry_info.xi,geometry_info.psi,exception); + geometry_info.xi,exception); if (image != (Image *) NULL) (void) SetImageChannelMask(image,channel_mask); break; -- 2.50.1