From: anthony Date: Tue, 5 Oct 2010 02:33:31 +0000 (+0000) Subject: Added "Lanczos2D" filter optimized for EWA resampling default X-Git-Tag: 7.0.1-0~8754 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=61b5ddd7008c09f611076719e86f6f65ef5a9a4d;p=imagemagick Added "Lanczos2D" filter optimized for EWA resampling default --- diff --git a/ChangeLog b/ChangeLog index 915e7dd4f..82c5d5345 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,19 +1,25 @@ +2010-10-05 6.6.4-10 Anthony Thyssen + * Added new filter 'Lanczos2D' a 2-lobe Lanczos with a optimization + specifically for cylindrical Jinc-Jinc usage (now EWA resampling default) + +2010-10-05 6.6.4-10 Cristy + * Add support for "pattern:vertical2" and "pattern:horizontal2". + 2010-10-03 6.6.4-9 Cristy * Fix memory assertion with --enable-embeddable (reference http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=17201). * Don't permit access to pixels when pinging an image (reference http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=17194). - * Add support for pattern:vertical2 and pattern:horizontal2. 2010-10-02 6.6.4-9 Anthony Thyssen - * Added sqrt(2) bluring default for Gaussian Filter if used as a - Cylindrical EWA filter. This resulted in the last aliasing issue - that was present in tests for Gaussian EWA resampling. - However it is still a very blury filter for default use in EWA. + * Added sqrt(2) bluring default for Gaussian Filter if used as + a Cylindrical EWA filter. This resulted removing the last aliasing + issue that was present in tests for Gaussian EWA resampling. Of course + it is still a very blury filter for default use in EWA. * Adjusted Variable Mapping Blur Composition so user arguments actual relate properly to the sigma of the blur for a maximum mapping value. - * Fix horizon anti-alising for output scaled perspective distortions. - * 'Bessel' filter is nor offically and more accuritally named 'Jinc' + * Fix horizon anti-alising for output-scaled perspective distortions. + * 'Bessel' filter is now offically and more accuritally named 'Jinc' however 'Bessel' while not visible as a filter option can still be used as an internal alias for 'Jinc'. @@ -25,10 +31,12 @@ * Temporary files not always deleted (reference http://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=15960). +2010-09-28 6.6.4-8 Anthony Thyssen + * Bug fix for -filter point distorts (occasional generating black pixels) + 2010-09-27 6.6.4-8 Nicolas Robidoux - * Simplified the ClampUpAxes code, the use of its outputs, its - comments, and credited Craig DeForest for the "clamp singular values" - idea. + * Simplified the ClampUpAxes code, the use of its outputs, its comments, + and credited Craig DeForest for the "clamp singular values" idea. * No reason to have "insane" precision Sinc in resize.c: Use the 1.2e-12 max. abs. relative error version for Q64 as well as Q32. @@ -36,7 +44,6 @@ * Replace the blurry "High Quality EWA" technique with a 'Clamped EWA' for Distort Resampling. This makes -distort a whole lot nicer and allows for the use of better cylindrical filters. - * Bug fix for -filter point distorts (occasional generating black pixels) 2010-09-26 6.6.4-7 Anthony Thyssen * Fix Point filter for ResizeImage() caused by support limiting the diff --git a/magick/option.c b/magick/option.c index d7892f938..8d30d48ef 100644 --- a/magick/option.c +++ b/magick/option.c @@ -935,7 +935,6 @@ static const OptionInfo { { "Undefined", (ssize_t) UndefinedFilter, MagickTrue }, { "Bartlett", (ssize_t) BartlettFilter, MagickFalse }, - { "Bessel", (ssize_t) JincFilter, MagickTrue }, /* backward compat name */ { "Blackman", (ssize_t) BlackmanFilter, MagickFalse }, { "Bohman", (ssize_t) BohmanFilter, MagickFalse }, { "Box", (ssize_t) BoxFilter, MagickFalse }, @@ -946,9 +945,11 @@ static const OptionInfo { "Hanning", (ssize_t) HanningFilter, MagickFalse }, { "Hermite", (ssize_t) HermiteFilter, MagickFalse }, { "Jinc", (ssize_t) JincFilter, MagickFalse }, + { "Bessel", (ssize_t) JincFilter, MagickTrue }, /* Set it after "Jinc" */ { "Kaiser", (ssize_t) KaiserFilter, MagickFalse }, { "Lagrange", (ssize_t) LagrangeFilter, MagickFalse }, { "Lanczos", (ssize_t) LanczosFilter, MagickFalse }, + { "Lanczos2D", (ssize_t) Lanczos2DFilter, MagickTrue }, { "Mitchell", (ssize_t) MitchellFilter, MagickFalse }, { "Parzen", (ssize_t) ParzenFilter, MagickFalse }, { "Point", (ssize_t) PointFilter, MagickFalse }, diff --git a/magick/resample.c b/magick/resample.c index 5070b833a..e41cdf3ee 100644 --- a/magick/resample.c +++ b/magick/resample.c @@ -1766,8 +1766,9 @@ MagickExport void SetResampleFilter(ResampleFilter *resample_filter, return; /* EWA turned off - nothing more to do */ } + /* Set a default cylindrical filter of a 'low blur' Jinc windowed Jinc */ if ( filter == UndefinedFilter ) - resample_filter->filter = MitchellFilter; /* a far less blurry filter */ + resample_filter->filter = Lanczos2DFilter; resize_filter = AcquireResizeFilter(resample_filter->image, resample_filter->filter,blur,MagickTrue,resample_filter->exception); @@ -1844,7 +1845,7 @@ MagickExport void SetResampleFilter(ResampleFilter *resample_filter, printf("#\n"); printf("# Note: values in table are using a squared radius lookup.\n"); printf("# And the whole table represents the filters support.\n"); - printf("#\n"); + printf("\n"); /* generates a 'break' in gnuplot if multiple outputs */ for(Q=0; Qfilter=filters[filter_type].function; - resize_filter->support=filters[filter_type].support; + resize_filter->support=filters[filter_type].lobes; resize_filter->window=filters[window_type].function; resize_filter->scale=filters[window_type].scale; resize_filter->signature=MagickSignature; + /* Filter blur -- scaling both filter and support window. */ resize_filter->blur=blur; artifact=GetImageArtifact(image,"filter:blur"); @@ -872,9 +887,27 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, resize_filter->blur *= MagickSQ2; resize_filter->support = (MagickRealType) MagickSQ2; /* which times blur => 2.0 */ break; + case Lanczos2DFilter: + /* Special 2 lobed cylindrical Jinc-Jinc filter, + * with a special blur adjustment to remove the blurring effect + * of the windowing of the Jinc function (in the 2 lobed case only). + * To be used as the default filter for EWA Resampling and Distorts. + */ + resize_filter->blur *= (MagickRealType) 0.9549921738; + default: + break; + } + else + switch (filter_type) + { + case Lanczos2DFilter: + /* depromote to a 2-lobe Sinc-Sinc for orthoginal use */ + resize_filter->filter=SincFast; + break; default: break; } + /* Filter support overrides. */ artifact=GetImageArtifact(image,"filter:lobes"); if (artifact != (const char *) NULL) @@ -886,13 +919,16 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, if (lobes < 1) lobes=1; resize_filter->support=(MagickRealType) lobes; - if (filter_type == JincFilter) - { - if (lobes > 16) - lobes=16; - resize_filter->support = jinc_zeros[lobes-1]; - } } + /* convert Jinc lobes to a real support value */ + if (resize_filter->filter == Jinc) + { + if (resize_filter->support > 16) + resize_filter->support=jinc_zeros[15]; /* largest entry in table */ + else + resize_filter->support = jinc_zeros[((long)resize_filter->support)-1]; + } + /* expert override of the support setting */ artifact=GetImageArtifact(image,"filter:support"); if (artifact != (const char *) NULL) resize_filter->support=fabs(StringToDouble(artifact)); @@ -959,7 +995,7 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, Expert Option Request for verbose details of the resulting filter. */ #if defined(MAGICKCORE_OPENMP_SUPPORT) - /* if( GetOpenMPThreadId() == 0 ) { */ + if( GetOpenMPThreadId() == 0 ) { #endif artifact=GetImageArtifact(image,"filter:verbose"); if (artifact != (const char *) NULL) @@ -978,12 +1014,13 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, if (resize_filter->filter == Box) filter_type=BoxFilter; if (resize_filter->filter == Sinc) filter_type=SincFilter; if (resize_filter->filter == SincFast) filter_type=SincFastFilter; + if (resize_filter->filter == Jinc) filter_type=JincFilter; if (resize_filter->filter == CubicBC) filter_type=CubicFilter; /* Report Filter Details. */ support=GetResizeFilterSupport(resize_filter); /* support range */ - (void) fprintf(stdout,"#\n# Resize Filter (for graphing)\n#\n"); + (void) fprintf(stdout,"# Resize Filter (for graphing)\n#\n"); (void) fprintf(stdout,"# filter = %s\n",MagickOptionToMnemonic( MagickFilterOptions,filter_type)); (void) fprintf(stdout,"# window = %s\n",MagickOptionToMnemonic( @@ -998,7 +1035,7 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, (double) support); (void) fprintf(stdout,"# B,C = %.*g,%.*g\n",GetMagickPrecision(), (double) B,GetMagickPrecision(),(double) C); - (void) fprintf(stdout,"#\n"); + (void) fprintf(stdout,"\n"); /* Output values of resulting filter graph -- for graphing filter result. @@ -1011,7 +1048,7 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, 0.0); } #if defined(MAGICKCORE_OPENMP_SUPPORT) - /* } */ + } #endif return(resize_filter); }