From f46d42620631d2581e0b6a56456e203e17c427c8 Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 26 Mar 2012 03:30:34 +0000 Subject: [PATCH] Bias fixes --- MagickCore/composite.c | 5 ++++- MagickCore/fx.c | 2 +- MagickCore/montage.c | 2 +- MagickCore/morphology-private.h | 2 +- MagickCore/morphology.c | 38 ++++++++++++++++++++++----------- MagickCore/option.c | 1 + MagickWand/mogrify.c | 1 + MagickWand/operation.c | 6 ++++-- 8 files changed, 38 insertions(+), 19 deletions(-) diff --git a/MagickCore/composite.c b/MagickCore/composite.c index 59a36e656..c9d5bcc5d 100644 --- a/MagickCore/composite.c +++ b/MagickCore/composite.c @@ -805,9 +805,12 @@ MagickExport MagickBooleanType CompositeImage(Image *image, } /* Blur Image by resampling. + FUTURE: this is currently broken, especially for small sigma blurs + This needs to be fixed to use a non-user filter setup that provides + far more control than currently available. */ resample_filter=AcquireResampleFilter(image,exception); - SetResampleFilter(resample_filter,CubicFilter); + SetResampleFilter(resample_filter,CubicFilter); /* was blur*2 */ destination_view=AcquireCacheView(destination_image); composite_view=AcquireCacheView(composite_image); for (y=0; y < (ssize_t) composite_image->rows; y++) diff --git a/MagickCore/fx.c b/MagickCore/fx.c index e6b47dcf5..db4167335 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -4046,7 +4046,7 @@ MagickExport Image *PolaroidImage(const Image *image,const DrawInfo *draw_info, return((Image *) NULL); picture_image=rotate_image; picture_image->background_color=image->background_color; - polaroid_image=ShadowImage(picture_image,80.0,0.0,quantum/3,quantum/3, + polaroid_image=ShadowImage(picture_image,80.0,2.0,quantum/3,quantum/3, exception); if (polaroid_image == (Image *) NULL) { diff --git a/MagickCore/montage.c b/MagickCore/montage.c index a2c2034e7..079d6d801 100644 --- a/MagickCore/montage.c +++ b/MagickCore/montage.c @@ -820,7 +820,7 @@ MagickExport Image *MontageImageList(const ImageInfo *image_info, */ (void) QueryColorCompliance("#0000",AllCompliance, &image->background_color,exception); - shadow_image=ShadowImage(image,80.0,0.0,5,5,exception); + shadow_image=ShadowImage(image,80.0,2.0,5,5,exception); if (shadow_image != (Image *) NULL) { (void) CompositeImage(shadow_image,OverCompositeOp,image,0,0, diff --git a/MagickCore/morphology-private.h b/MagickCore/morphology-private.h index 44015ff3a..072217b43 100644 --- a/MagickCore/morphology-private.h +++ b/MagickCore/morphology-private.h @@ -30,7 +30,7 @@ extern "C" { extern MagickPrivate Image *MorphologyApply(const Image *,const MorphologyMethod,const ssize_t, - const KernelInfo *,const CompositeOperator,ExceptionInfo *); + const KernelInfo *,const CompositeOperator,const double,ExceptionInfo *); extern MagickPrivate void ShowKernelInfo(const KernelInfo *), diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c index c1795f134..7173b7de7 100644 --- a/MagickCore/morphology.c +++ b/MagickCore/morphology.c @@ -2456,14 +2456,15 @@ static void CalcKernelMetaData(KernelInfo *kernel) % % More specifically kernels are not normalized/scaled/blended by the % 'convolve:scale' Image Artifact (setting), nor is the convolve bias -% (-bias setting or image->bias) loooked at, but must be supplied from the +% ('convolve:bias' artifact) looked at, but must be supplied from the % function arguments. % % The format of the MorphologyApply method is: % % Image *MorphologyApply(const Image *image,MorphologyMethod method, % const ssize_t iterations,const KernelInfo *kernel, -% const CompositeMethod compose,ExceptionInfo *exception) +% const CompositeMethod compose,const double bias, +% ExceptionInfo *exception) % % A description of each parameter follows: % @@ -2485,6 +2486,8 @@ static void CalcKernelMetaData(KernelInfo *kernel) % If 'NoCompositeOp' force image to be re-iterated by each kernel. % Otherwise merge the results using the compose method given. % +% o bias: Convolution Output Bias. +% % o exception: return any errors or warnings in this structure. % */ @@ -2495,7 +2498,7 @@ static void CalcKernelMetaData(KernelInfo *kernel) ** for result convergence determination. */ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, - const MorphologyMethod method,const KernelInfo *kernel, + const MorphologyMethod method,const KernelInfo *kernel,const double bias, ExceptionInfo *exception) { #define MorphologyTag "Morphology/Image" @@ -2642,7 +2645,7 @@ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, result.green = result.blue = result.alpha = - result.black = 0.0; + result.black = bias; /* Weighted Average of pixels using reflected kernel @@ -2844,7 +2847,7 @@ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, result.green = result.blue = result.alpha = - result.black = 0.0; + result.black = bias; break; case DilateIntensityMorphology: case ErodeIntensityMorphology: @@ -3738,7 +3741,7 @@ static ssize_t MorphologyPrimitiveDirect(Image *image, */ MagickPrivate Image *MorphologyApply(const Image *image, const MorphologyMethod method, const ssize_t iterations, - const KernelInfo *kernel, const CompositeOperator compose, + const KernelInfo *kernel, const CompositeOperator compose,const double bias, ExceptionInfo *exception) { CompositeOperator @@ -4042,7 +4045,7 @@ MagickPrivate Image *MorphologyApply(const Image *image, /* APPLY THE MORPHOLOGICAL PRIMITIVE (curr -> work) */ count++; changed = MorphologyPrimitive(curr_image, work_image, primitive, - this_kernel, exception); + this_kernel, bias, exception); if ( verbose == MagickTrue ) { if ( kernel_loop > 1 ) @@ -4203,10 +4206,10 @@ exit_cleanup: % the above internal function MorphologyApply(). % % User defined settings include... -% * Output Bias for Convolution and correlation ("-bias") -% * Kernel Scale/normalize settings ("-set 'option:convolve:scale'") +% * Output Bias for Convolution and correlation ('-define convolve:bias=??") +% * Kernel Scale/normalize settings ("-define convolve:scale=??") % This can also includes the addition of a scaled unity kernel. -% * Show Kernel being applied ("-set option:showkernel 1") +% * Show Kernel being applied ("-define showkernel=1") % % The format of the MorphologyImage method is: % @@ -4247,16 +4250,20 @@ MagickExport Image *MorphologyImage(const Image *image, Image *morphology_image; + double + bias; /* Apply Convolve/Correlate Normalization and Scaling Factors. * This is done BEFORE the ShowKernelInfo() function is called so that * users can see the results of the 'option:convolve:scale' option. */ curr_kernel = (KernelInfo *) kernel; + bias=0.0; /* curr_kernel->bias; should we get from kernel */ if ( method == ConvolveMorphology || method == CorrelateMorphology ) { const char *artifact; + artifact = GetImageArtifact(image,"convolve:scale"); if ( artifact != (const char *)NULL ) { if ( curr_kernel == kernel ) @@ -4267,6 +4274,11 @@ MagickExport Image *MorphologyImage(const Image *image, } ScaleGeometryKernelInfo(curr_kernel, artifact); } + + artifact = GetImageArtifact(image,"convolve:bias"); + compose = UndefinedCompositeOp; /* use default for method */ + if ( artifact != (const char *) NULL) + bias=StringToDouble(artifact, (char **) NULL); } /* display the (normalized) kernel via stderr */ @@ -4283,15 +4295,15 @@ MagickExport Image *MorphologyImage(const Image *image, */ { const char *artifact; - artifact = GetImageArtifact(image,"morphology:compose"); compose = UndefinedCompositeOp; /* use default for method */ + artifact = GetImageArtifact(image,"morphology:compose"); if ( artifact != (const char *) NULL) compose=(CompositeOperator) ParseCommandOption(MagickComposeOptions, MagickFalse,artifact); } /* Apply the Morphology */ - morphology_image=MorphologyApply(image,method,iterations,curr_kernel,compose, - exception); + morphology_image = MorphologyApply(image,method,iterations, + curr_kernel,compose,bias,exception); /* Cleanup and Exit */ if ( curr_kernel != kernel ) diff --git a/MagickCore/option.c b/MagickCore/option.c index 1af8751a6..6c35d2722 100644 --- a/MagickCore/option.c +++ b/MagickCore/option.c @@ -1095,6 +1095,7 @@ static const OptionInfo { "filter", FilterInterpolatePixel, UndefinedOptionFlag, MagickFalse }, { "Integer", IntegerInterpolatePixel, UndefinedOptionFlag, MagickFalse }, { "Mesh", MeshInterpolatePixel, UndefinedOptionFlag, MagickFalse }, + { "Nearest", NearestNeighborInterpolatePixel, UndefinedOptionFlag, MagickFalse }, { "NearestNeighbor", NearestNeighborInterpolatePixel, UndefinedOptionFlag, MagickFalse }, { "Spline", SplineInterpolatePixel, UndefinedOptionFlag, MagickFalse }, { (char *) NULL, UndefinedInterpolatePixel, UndefinedOptionFlag, MagickFalse } diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c index 9b98a03b5..64d527217 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -1250,6 +1250,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, kernel_info=AcquireKernelInfo(argv[i+1]); if (kernel_info == (KernelInfo *) NULL) break; + /* kernel_info->bias=(*image)->bias; -- FUTURE: check this path! */ mogrify_image=ConvolveImage(*image,kernel_info,exception); kernel_info=DestroyKernelInfo(kernel_info); break; diff --git a/MagickWand/operation.c b/MagickWand/operation.c index 3bf61ae13..b9fdd63fb 100644 --- a/MagickWand/operation.c +++ b/MagickWand/operation.c @@ -697,7 +697,7 @@ WandExport void CLISettingOptionInfo(MagickCLI *cli_wand, */ if (IfSetOption && IsGeometry(arg1) == MagickFalse) CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1); - (void) SetImageOption(_image_info,option+1,ArgOption("0")); + (void) SetImageOption(_image_info,"convolve:bias",ArgOption(NULL)); break; } if (LocaleCompare("black-point-compensation",option+1) == 0) @@ -971,6 +971,7 @@ WandExport void CLISettingOptionInfo(MagickCLI *cli_wand, if (parse < 0) CLIWandExceptArgBreak(OptionError,"UnrecognizedEndianType", option,arg1); + /* FUTURE: check alloc/free of endian string! - remove? */ _image_info->endian=(EndianType) (*arg1); (void) SetImageOption(_image_info,option+1,arg1); break; @@ -2198,6 +2199,7 @@ static void CLISimpleOperatorImage(MagickCLI *cli_wand, kernel_info=AcquireKernelInfo(arg1); if (kernel_info == (KernelInfo *) NULL) CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1); + /* kernel_info->bias=_image->bias; -- FUTURE: check this path! */ new_image=ConvolveImage(_image,kernel_info,_exception); kernel_info=DestroyKernelInfo(kernel_info); break; @@ -3167,7 +3169,7 @@ static void CLISimpleOperatorImage(MagickCLI *cli_wand, } if (LocaleCompare("resample",option+1) == 0) { - /* Roll into a resize special operation */ + /* FUTURE: Roll into a resize special operation */ if (IsGeometry(arg1) == MagickFalse) CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1); flags=ParseGeometry(arg1,&geometry_info); -- 2.40.0