]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Fri, 5 Mar 2010 19:43:39 +0000 (19:43 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Fri, 5 Mar 2010 19:43:39 +0000 (19:43 +0000)
ChangeLog
PerlMagick/Magick.xs
magick/effect.c
magick/morphology.c
magick/morphology.h
magick/statistic.c
magick/statistic.h
wand/convert.c
wand/magick-image.c
wand/magick-image.h
wand/mogrify.c

index b2e32ee43cdae202656d40d23d4ebbbde3b4109e..4135205e047dcd2f9ed825bdcfba6bb9bd0fab86 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 2010-03-05  6.6.0-2 Cristy  <quetzlzacatenango@image...>
-  * add support for the -mip option (maximum intensity projection).
+  * add support for the -intensity-projection option that returns the
+    maximum (or minimum) intensity projection for a sequence of images.
 
 2010-02-27  6.6.0-1 Cristy  <quetzlzacatenango@image...>
   * Check to see if ICON image width /height exceeds that of the image canvas.
index e384d1b642994377bc34257e97123684af3a8365..4b61174c2a7955e78366b60c06c51efe5e5b3ccd 100644 (file)
@@ -6398,6 +6398,145 @@ ImageToBlob(ref,...)
 #                                                                             #
 #                                                                             #
 #                                                                             #
+#   I n t e n s i t y P r o j e c t i o n                                     #
+#                                                                             #
+#                                                                             #
+#                                                                             #
+###############################################################################
+#
+#
+void
+IntensityProjection(ref)
+  Image::Magick ref=NO_INIT
+  ALIAS:
+    IntensityProjectionImage   = 1
+    intensityprojection        = 2
+    intensityprojectionimage   = 3
+  PPCODE:
+  {
+    AV
+      *av;
+
+    char
+      *attribute,
+      *p;
+
+    ExceptionInfo
+      *exception;
+
+    HV
+      *hv;
+
+    Image
+      *image;
+
+    MagickBooleanType
+      projection;
+
+    register long
+      i;
+
+    struct PackageInfo
+      *info;
+
+    SV
+      *perl_exception,
+      *reference,
+      *rv,
+      *sv;
+
+    exception=AcquireExceptionInfo();
+    perl_exception=newSVpv("",0);
+    if (sv_isobject(ST(0)) == 0)
+      {
+        ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
+          PackageName);
+        goto PerlException;
+      }
+    reference=SvRV(ST(0));
+    hv=SvSTASH(reference);
+    image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
+    if (image == (Image *) NULL)
+      {
+        ThrowPerlException(exception,OptionError,"NoImagesDefined",
+          PackageName);
+        goto PerlException;
+      }
+    projection=MagickFalse;
+    for (i=2; i < items; i+=2)
+    {
+      attribute=(char *) SvPV(ST(i-1),na);
+      switch (*attribute)
+      {
+        case 'P':
+        case 'p':
+        {
+         if (LocaleCompare(attribute,"projection") == 0)
+           {
+             long
+               in;
+
+             in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseMagickOption(
+               MagickBooleanOptions,MagickFalse,SvPV(ST(i),na));
+             if (in < 0)
+               {
+                 ThrowPerlException(exception,OptionError,"UnrecognizedType",
+                   SvPV(ST(i),na));
+                 return;
+               }
+             projection=(MagickBooleanType) in;
+             break;
+           }
+          ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
+            attribute);
+          break;
+        }
+        default:
+        {
+          ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
+            attribute);
+          break;
+        }
+      }
+    }
+    image=IntensityProjectionImages(image,MagickFalse,exception);
+    if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
+      goto PerlException;
+    /*
+      Create blessed Perl array for the returned image.
+    */
+    av=newAV();
+    ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
+    SvREFCNT_dec(av);
+    AddImageToRegistry(image);
+    rv=newRV(sv);
+    av_push(av,sv_bless(rv,hv));
+    SvREFCNT_dec(sv);
+    info=GetPackageInfo(aTHX_ (void *) av,info,exception);
+    (void) FormatMagickString(info->image_info->filename,MaxTextExtent,
+      "mip-%.*s",(int) (MaxTextExtent-9),
+      ((p=strrchr(image->filename,'/')) ? p+1 : image->filename));
+    (void) CopyMagickString(image->filename,info->image_info->filename,
+      MaxTextExtent);
+    SetImageInfo(info->image_info,0,exception);
+    exception=DestroyExceptionInfo(exception);
+    SvREFCNT_dec(perl_exception);
+    XSRETURN(1);
+
+  PerlException:
+    InheritPerlException(exception,perl_exception);
+    exception=DestroyExceptionInfo(exception);
+    sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
+    SvPOK_on(perl_exception);
+    ST(0)=sv_2mortal(perl_exception);
+    XSRETURN(1);
+  }
+\f
+#
+###############################################################################
+#                                                                             #
+#                                                                             #
+#                                                                             #
 #   L a y e r s                                                               #
 #                                                                             #
 #                                                                             #
@@ -6752,101 +6891,6 @@ MagickToMime(ref,name)
 #                                                                             #
 #                                                                             #
 #                                                                             #
-#   M a x i m u m I n t e n s i t y P r o j e c t i o n                       #
-#                                                                             #
-#                                                                             #
-#                                                                             #
-###############################################################################
-#
-#
-void
-MaximumIntensityProjection(ref)
-  Image::Magick ref=NO_INIT
-  ALIAS:
-    MaximumIntensityProjectionImage   = 1
-    maximumintensityprojection        = 2
-    maximumintensityprojectionimage   = 3
-  PPCODE:
-  {
-    AV
-      *av;
-
-    char
-      *p;
-
-    ExceptionInfo
-      *exception;
-
-    HV
-      *hv;
-
-    Image
-      *image;
-
-    struct PackageInfo
-      *info;
-
-    SV
-      *perl_exception,
-      *reference,
-      *rv,
-      *sv;
-
-    exception=AcquireExceptionInfo();
-    perl_exception=newSVpv("",0);
-    if (sv_isobject(ST(0)) == 0)
-      {
-        ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
-          PackageName);
-        goto PerlException;
-      }
-    reference=SvRV(ST(0));
-    hv=SvSTASH(reference);
-    image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
-    if (image == (Image *) NULL)
-      {
-        ThrowPerlException(exception,OptionError,"NoImagesDefined",
-          PackageName);
-        goto PerlException;
-      }
-    image=MaximumIntensityProjectionImages(image,exception);
-    if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
-      goto PerlException;
-    /*
-      Create blessed Perl array for the returned image.
-    */
-    av=newAV();
-    ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
-    SvREFCNT_dec(av);
-    AddImageToRegistry(image);
-    rv=newRV(sv);
-    av_push(av,sv_bless(rv,hv));
-    SvREFCNT_dec(sv);
-    info=GetPackageInfo(aTHX_ (void *) av,info,exception);
-    (void) FormatMagickString(info->image_info->filename,MaxTextExtent,
-      "mip-%.*s",(int) (MaxTextExtent-9),
-      ((p=strrchr(image->filename,'/')) ? p+1 : image->filename));
-    (void) CopyMagickString(image->filename,info->image_info->filename,
-      MaxTextExtent);
-    SetImageInfo(info->image_info,0,exception);
-    exception=DestroyExceptionInfo(exception);
-    SvREFCNT_dec(perl_exception);
-    XSRETURN(1);
-
-  PerlException:
-    InheritPerlException(exception,perl_exception);
-    exception=DestroyExceptionInfo(exception);
-    sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
-    SvPOK_on(perl_exception);
-    ST(0)=sv_2mortal(perl_exception);
-    XSRETURN(1);
-  }
-\f
-#
-###############################################################################
-#                                                                             #
-#                                                                             #
-#                                                                             #
 #   M o g r i f y                                                             #
 #                                                                             #
 #                                                                             #
index 21aefe805281904f50c2aa3c729a977ce959fd59..6bd0f57be35433d083cacf1010b48bca6eb762e3 100644 (file)
@@ -64,6 +64,7 @@
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/montage.h"
+#include "magick/morphology.h"
 #include "magick/paint.h"
 #include "magick/pixel-private.h"
 #include "magick/property.h"
@@ -2165,6 +2166,9 @@ MagickExport Image *FilterImageChannel(const Image *image,
     *filter_view,
     *image_view;
 
+  KernelInfo
+    *normal_kernel;
+
   Image
     *filter_image;
 
@@ -2229,7 +2233,14 @@ MagickExport Image *FilterImageChannel(const Image *image,
       }
       message=DestroyString(message);
     }
-  status=AccelerateConvolveImage(image,kernel,filter_image,exception);
+  normal_kernel=CloneKernelInfo(kernel);
+  if (normal_kernel == (KernelInfo *) NULL)
+    {
+      filter_image=DestroyImage(filter_image);
+      ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
+    }
+  ScaleKernelInfo(normal_kernel,1.0,NormalizeValue);
+  status=AccelerateConvolveImage(image,normal_kernel,filter_image,exception);
   if (status == MagickTrue)
     return(filter_image);
   /*
@@ -2266,9 +2277,9 @@ MagickExport Image *FilterImageChannel(const Image *image,
 
     if (status == MagickFalse)
       continue;
-    p=GetCacheViewVirtualPixels(image_view,-((long) kernel->width/2L),
-      y-(long) (kernel->height/2L),image->columns+kernel->width,kernel->height,
-      exception);
+    p=GetCacheViewVirtualPixels(image_view,-((long) normal_kernel->width/2L),
+      y-(long) (normal_kernel->height/2L),image->columns+normal_kernel->width,
+      normal_kernel->height,exception);
     q=GetCacheViewAuthenticPixels(filter_view,0,y,filter_image->columns,1,
       exception);
     if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
@@ -2296,20 +2307,20 @@ MagickExport Image *FilterImageChannel(const Image *image,
         u;
 
       pixel=bias;
-      k=kernel->values;
+      k=normal_kernel->values;
       kernel_pixels=p;
       if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse))
         {
-          for (v=0; v < (long) kernel->width; v++)
+          for (v=0; v < (long) normal_kernel->width; v++)
           {
-            for (u=0; u < (long) kernel->height; u++)
+            for (u=0; u < (long) normal_kernel->height; u++)
             {
               pixel.red+=(*k)*kernel_pixels[u].red;
               pixel.green+=(*k)*kernel_pixels[u].green;
               pixel.blue+=(*k)*kernel_pixels[u].blue;
               k++;
             }
-            kernel_pixels+=image->columns+kernel->width;
+            kernel_pixels+=image->columns+normal_kernel->width;
           }
           if ((channel & RedChannel) != 0)
             SetRedPixelComponent(q,ClampRedPixelComponent(&pixel));
@@ -2319,16 +2330,16 @@ MagickExport Image *FilterImageChannel(const Image *image,
             SetBluePixelComponent(q,ClampBluePixelComponent(&pixel));
           if ((channel & OpacityChannel) != 0)
             {
-              k=kernel->values;
+              k=normal_kernel->values;
               kernel_pixels=p;
-              for (v=0; v < (long) kernel->width; v++)
+              for (v=0; v < (long) normal_kernel->width; v++)
               {
-                for (u=0; u < (long) kernel->height; u++)
+                for (u=0; u < (long) normal_kernel->height; u++)
                 {
                   pixel.opacity+=(*k)*kernel_pixels[u].opacity;
                   k++;
                 }
-                kernel_pixels+=image->columns+kernel->width;
+                kernel_pixels+=image->columns+normal_kernel->width;
               }
               SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
             }
@@ -2338,16 +2349,16 @@ MagickExport Image *FilterImageChannel(const Image *image,
               register const IndexPacket
                 *restrict kernel_indexes;
 
-              k=kernel->values;
+              k=normal_kernel->values;
               kernel_indexes=indexes;
-              for (v=0; v < (long) kernel->width; v++)
+              for (v=0; v < (long) normal_kernel->width; v++)
               {
-                for (u=0; u < (long) kernel->height; u++)
+                for (u=0; u < (long) normal_kernel->height; u++)
                 {
                   pixel.index+=(*k)*kernel_indexes[u];
                   k++;
                 }
-                kernel_indexes+=image->columns+kernel->width;
+                kernel_indexes+=image->columns+normal_kernel->width;
               }
               filter_indexes[x]=ClampToQuantum(pixel.index);
             }
@@ -2359,9 +2370,9 @@ MagickExport Image *FilterImageChannel(const Image *image,
             gamma;
 
           gamma=0.0;
-          for (v=0; v < (long) kernel->width; v++)
+          for (v=0; v < (long) normal_kernel->width; v++)
           {
-            for (u=0; u < (long) kernel->height; u++)
+            for (u=0; u < (long) normal_kernel->height; u++)
             {
               alpha=(MagickRealType) (QuantumScale*(QuantumRange-
                 kernel_pixels[u].opacity));
@@ -2371,7 +2382,7 @@ MagickExport Image *FilterImageChannel(const Image *image,
               gamma+=(*k)*alpha;
               k++;
             }
-            kernel_pixels+=image->columns+kernel->width;
+            kernel_pixels+=image->columns+normal_kernel->width;
           }
           gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
           if ((channel & RedChannel) != 0)
@@ -2382,16 +2393,16 @@ MagickExport Image *FilterImageChannel(const Image *image,
             q->blue=ClampToQuantum(gamma*GetBluePixelComponent(&pixel));
           if ((channel & OpacityChannel) != 0)
             {
-              k=kernel->values;
+              k=normal_kernel->values;
               kernel_pixels=p;
-              for (v=0; v < (long) kernel->width; v++)
+              for (v=0; v < (long) normal_kernel->width; v++)
               {
-                for (u=0; u < (long) kernel->height; u++)
+                for (u=0; u < (long) normal_kernel->height; u++)
                 {
                   pixel.opacity+=(*k)*kernel_pixels[u].opacity;
                   k++;
                 }
-                kernel_pixels+=image->columns+kernel->width;
+                kernel_pixels+=image->columns+normal_kernel->width;
               }
               SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
             }
@@ -2401,20 +2412,20 @@ MagickExport Image *FilterImageChannel(const Image *image,
               register const IndexPacket
                 *restrict kernel_indexes;
 
-              k=kernel->values;
+              k=normal_kernel->values;
               kernel_pixels=p;
               kernel_indexes=indexes;
-              for (v=0; v < (long) kernel->width; v++)
+              for (v=0; v < (long) normal_kernel->width; v++)
               {
-                for (u=0; u < (long) kernel->height; u++)
+                for (u=0; u < (long) normal_kernel->height; u++)
                 {
                   alpha=(MagickRealType) (QuantumScale*(QuantumRange-
                     kernel_pixels[u].opacity));
                   pixel.index+=(*k)*alpha*kernel_indexes[u];
                   k++;
                 }
-                kernel_pixels+=image->columns+kernel->width;
-                kernel_indexes+=image->columns+kernel->width;
+                kernel_pixels+=image->columns+normal_kernel->width;
+                kernel_indexes+=image->columns+normal_kernel->width;
               }
               filter_indexes[x]=ClampToQuantum(gamma*
                 GetIndexPixelComponent(&pixel));
@@ -2442,6 +2453,7 @@ MagickExport Image *FilterImageChannel(const Image *image,
   filter_image->type=image->type;
   filter_view=DestroyCacheView(filter_view);
   image_view=DestroyCacheView(image_view);
+  normal_kernel=DestroyKernelInfo(normal_kernel);
   if (status == MagickFalse)
     filter_image=DestroyImage(filter_image);
   return(filter_image);
index 40a512a9b83d5d721362ad8b2142daafb4d7aff9..61d10419ccbf87f077e5133330628f75d1a6ca43 100644 (file)
@@ -927,7 +927,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+     C l o n e K e r n e l I n f o                                           %
+%     C l o n e K e r n e l I n f o                                           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
@@ -946,8 +946,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
 %    o kernel: the Morphology/Convolution kernel to be cloned
 %
 */
-
-static KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
+MagickBooleanType KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
 {
   register long
     i;
@@ -1922,7 +1921,7 @@ static void RotateKernelInfo(KernelInfo *kernel, double angle)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+     S c a l e K e r n e l I n f o                                           %
+%     S c a l e K e r n e l I n f o                                           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
@@ -1993,8 +1992,8 @@ static void RotateKernelInfo(KernelInfo *kernel, double angle)
 % This function is internal to this module only at this time, but can be
 % exported to other modules if needed.
 */
-static void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
-     const GeometryFlags normalize_flags)
+MagickExport void ScaleKernelInfo(KernelInfo *kernel,
+  const double scaling_factor,const GeometryFlags normalize_flags)
 {
   register long
     i;
index dd158309071bbe3da622719c399eb38d0606abcf..09710886609958a24e34621575a19028e55892b8 100644 (file)
@@ -96,16 +96,18 @@ typedef struct
 extern MagickExport KernelInfo
   *AcquireKernelInfo(const char *),
   *AcquireKernelBuiltIn(const KernelInfoType,const GeometryInfo *),
+  *CloneKernelInfo(const KernelInfo *),
   *DestroyKernelInfo(KernelInfo *);
 
-extern MagickExport void
-  ShowKernelInfo(KernelInfo *);
-
 extern MagickExport Image
   *MorphologyImage(const Image *,const MorphologyMethod,const long,
     const KernelInfo *,ExceptionInfo *),
   *MorphologyImageChannel(const Image *,const ChannelType,
-     const MorphologyMethod,const long,const KernelInfo *,ExceptionInfo *);
+    const MorphologyMethod,const long,const KernelInfo *,ExceptionInfo *);
+
+extern MagickExport void
+  ScaleKernelInfo(KernelInfo *,const double,const GeometryFlags),
+  ShowKernelInfo(KernelInfo *);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
index 2cb686b9bb18dfebdb786f15b0183472de127310..691f3e8a0aa523153f90e2e2b6af83de4171fca3 100644 (file)
@@ -1132,37 +1132,40 @@ MagickExport ChannelStatistics *GetImageChannelStatistics(const Image *image,
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%     M a x i m u m I n t e n s i t y P r o j e c t i o n I m a g e s         %
+%     I n t e n s i t y P r o j e c t i o n I m a g e s                       %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  MaximumIntensityProjectionImages() returns the maximum intensity projection
-%  of an image sequence.
+%  IntensityProjectionImages() returns the maximum (or minimum) intensity
+%  projection of an image sequence.
 %
-%  The format of the MaximumIntensityProjectionImages method is:
+%  The format of the IntensityProjectionImages method is:
 %
-%      Image *MaximumIntensityProjectionImages(Image *images,
-%        ExceptionInfo *exception)
+%      Image *IntensityProjectionImages(Image *images,
+%        const MagickBooleanType projection,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o images: the image sequence.
 %
+%    o projection: compute the minimum intensity projection for a value
+%      other than 0, otherwise compute the maximum.
+%
 %    o exception: return any errors or warnings in this structure.
 %
 */
-MagickExport Image *MaximumIntensityProjectionImages(const Image *images,
-  ExceptionInfo *exception)
+MagickExport Image *IntensityProjectionImages(const Image *images,
+  const MagickBooleanType projection,ExceptionInfo *exception)
 {
-#define MaximumIntensityProjectionImageTag  "MaximumIntensityProjection/Image"
+#define MIPImageTag  "MIP/Image"
 
   const Image
     *next;
 
   Image
-    *mip_image;
+    *projection_image;
 
   MagickBooleanType
     status;
@@ -1190,29 +1193,30 @@ MagickExport Image *MaximumIntensityProjectionImages(const Image *images,
         return((Image *) NULL);
       }
   /*
-    Initialize mip_image next attributes.
+    Initialize projection_image next attributes.
   */
-  mip_image=CloneImage(images,0,0,MagickTrue,exception);
-  if (mip_image == (Image *) NULL)
+  projection_image=CloneImage(images,0,0,MagickTrue,exception);
+  if (projection_image == (Image *) NULL)
     return((Image *) NULL);
-  if (SetImageStorageClass(mip_image,DirectClass) == MagickFalse)
+  if (SetImageStorageClass(projection_image,DirectClass) == MagickFalse)
     {
-      InheritException(exception,&mip_image->exception);
-      mip_image=DestroyImage(mip_image);
+      InheritException(exception,&projection_image->exception);
+      projection_image=DestroyImage(projection_image);
       return((Image *) NULL);
     }
   /*
-    Compute the maximum intensity projection.
+    Compute the maximum (or minimim) intensity projection.
   */
   i=0;
   number_images=GetImageListLength(images);
   for (next=images; next != (Image *) NULL; next=GetNextImageInList(next))
   {
-    status=CompositeImage(mip_image,LightenCompositeOp,next,0,0);
+    status=CompositeImage(projection_image,projection != MagickFalse ?
+      DarkenCompositeOp : LightenCompositeOp,next,0,0);
     if (status == MagickFalse)
       {
-        InheritException(exception,&mip_image->exception);
-        mip_image=DestroyImage(mip_image);
+        InheritException(exception,&projection_image->exception);
+        projection_image=DestroyImage(projection_image);
         break;
       }
     if (images->progress_monitor != (MagickProgressMonitor) NULL)
@@ -1221,11 +1225,11 @@ MagickExport Image *MaximumIntensityProjectionImages(const Image *images,
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-        #pragma omp critical (MagickCore_MaximumIntensityProjectionImages)
+        #pragma omp critical (MagickCore_IntensityProjectionImages)
 #endif
-        proceed=SetImageProgress(images,MaximumIntensityProjectionImageTag,i++,
+        proceed=SetImageProgress(images,MIPImageTag,i++,
           number_images);
       }
   }
-  return(mip_image);
+  return(projection_image);
 }
index d834b7a4e46a6f8652bf26b0f0bae6bae75d4f07..b5610bc552e538e9b3c4ca389641b4431b7cfbc4 100644 (file)
@@ -41,7 +41,8 @@ extern MagickExport ChannelStatistics
 
 extern MagickExport Image
   *AverageImages(const Image *,ExceptionInfo *),
-  *MaximumIntensityProjectionImages(const Image *,ExceptionInfo *);
+  *IntensityProjectionImages(const Image *,const MagickBooleanType,
+    ExceptionInfo *);
 
 extern MagickExport MagickBooleanType
   GetImageChannelExtrema(const Image *,const ChannelType,unsigned long *,
index bad8dd72e5aaac8cd5cce697d608cd7c0018eef6..d00fdb3b3617f1e66ac269fd20f9b1cd657a1b81 100644 (file)
@@ -302,7 +302,8 @@ static MagickBooleanType ConvertUsage(void)
       "-flatten             flatten a sequence of images",
       "-fx expression       apply mathematical expression to an image channel(s)",
       "-hald-clut           apply a Hald color lookup table to the image",
-      "-mip                 return the maximum intensity projection for an image sequence",
+      "-intensity-projection",
+      "                     the maximum (or minimum) intensity projection",
       "-morph value         morph an image sequence",
       "-mosaic              create a mosaic from an image sequence",
       "-process arguments   process the image with a custom image filter",
@@ -1608,6 +1609,8 @@ WandExport MagickBooleanType ConvertImageCommand(ImageInfo *image_info,
               ThrowConvertInvalidArgumentException(option,argv[i]);
             break;
           }
+        if (LocaleCompare("intensity-projection",option+1) == 0)
+          break;
         if (LocaleCompare("intent",option+1) == 0)
           {
             long
@@ -1882,8 +1885,6 @@ WandExport MagickBooleanType ConvertImageCommand(ImageInfo *image_info,
               ThrowConvertException(OptionError,"MissingArgument",option);
             break;
           }
-        if (LocaleCompare("mip",option+1) == 0)
-          break;
         if (LocaleCompare("median",option+1) == 0)
           {
             if (*option == '+')
index d0cdde69abd8effbc948fe1470c2fd9ec5c85e27..8eaad2df7ce3396ecd4bc6d3c95452f1d56065d9 100644 (file)
@@ -6457,28 +6457,33 @@ WandExport MagickBooleanType MagickImportImagePixels(MagickWand *wand,
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   M a g i c k M a x i m u m I n t e n s i t y P r o j e c t i o n I m a g e %
+%   M a g i c k I n t e n s i t y P r o j e c t i o n I m a g e s             %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  MagickMaximumIntensityProjectionImages() returns the maximum intensity
+%  MagickIntensityProjectionImages() returns the maximum (or minimum) intensity
 %  projection of an image sequence.
 %
-%  The format of the MagickMaximumIntensityProjectionImages method is:
+%  The format of the MagickIntensityProjectionImages method is:
 %
-%      MagickWand *MagickMaximumIntensityProjectionImages(MagickWand *wand)
+%      MagickWand *MagickIntensityProjectionImages(MagickWand *wand,
+%        const MagickBooleanType projection)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
+%    o projection: compute the minimum intensity projection for a value
+%      other than 0, otherwise compute the maximum.
+%
 */
-WandExport MagickWand *MagickMaximumIntensityProjectionImages(MagickWand *wand)
+WandExport MagickWand *MagickIntensityProjectionImages(MagickWand *wand,
+  const MagickBooleanType projection)
 {
   Image
-    *mip_image;
+    *projection_image;
 
   assert(wand != (MagickWand *) NULL);
   assert(wand->signature == WandSignature);
@@ -6486,10 +6491,11 @@ WandExport MagickWand *MagickMaximumIntensityProjectionImages(MagickWand *wand)
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     return((MagickWand *) NULL);
-  mip_image=MaximumIntensityProjectionImages(wand->images,wand->exception);
-  if (mip_image == (Image *) NULL)
+  projection_image=IntensityProjectionImages(wand->images,projection,
+    wand->exception);
+  if (projection_image == (Image *) NULL)
     return((MagickWand *) NULL);
-  return(CloneMagickWandFromImages(wand,mip_image));
+  return(CloneMagickWandFromImages(wand,projection_image));
 }
 \f
 /*
index e2f9d505f5e0f2fa4cd42c5eeb5281f63cb0f00d..23ce233bd9df3495d7ee8e2bce791040144543b3 100644 (file)
@@ -386,7 +386,7 @@ extern WandExport MagickWand
   *MagickGetImageClipMask(MagickWand *),
   *MagickGetImageRegion(MagickWand *,const unsigned long,const unsigned long,
     const long,const long),
-  *MagickMaximumIntensityProjectionImages(MagickWand *),
+  *MagickIntensityProjectionImages(MagickWand *,const MagickBooleanType),
   *MagickMergeImageLayers(MagickWand *,const ImageLayerMethod),
   *MagickMorphImages(MagickWand *,const unsigned long),
   *MagickMontageImage(MagickWand *,const DrawingWand *,const char *,
index 65302412b3d3fa1e742eca2279ad0229058defaa..27b0fa38fd7e8d0a7b18cb70741eb9a6323c0851 100644 (file)
@@ -1232,7 +1232,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
             kernel=AcquireKernelInfo(argv[i+1]);
             if (kernel == (KernelInfo *) NULL)
               break;
-            convolve_image=ConvoleImageChannel(*image,channel,kernel,exception);
+            convolve_image=FilterImageChannel(*image,channel,kernel,exception);
             kernel=DestroyKernelInfo(kernel);
             if (convolve_image == (Image *) NULL)
               break;
@@ -3796,7 +3796,8 @@ static MagickBooleanType MogrifyUsage(void)
       "-flatten             flatten a sequence of images",
       "-fx expression       apply mathematical expression to an image channel(s)",
       "-hald-clut           apply a Hald color lookup table to the image",
-      "-mip                 return the maximum intensity projection for an image sequence",
+      "-intensity-projection",
+      "                     the maximum (or minimum) intensity projection",
       "-morph value         morph an image sequence",
       "-mosaic              create a mosaic from an image sequence",
       "-process arguments   process the image with a custom image filter",
@@ -5072,6 +5073,8 @@ WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
               ThrowMogrifyInvalidArgumentException(option,argv[i]);
             break;
           }
+        if (LocaleCompare("intensity-projection",option+1) == 0)
+          break;
         if (LocaleCompare("intent",option+1) == 0)
           {
             long
@@ -5335,8 +5338,6 @@ WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
               ThrowMogrifyException(OptionError,"MissingArgument",option);
             break;
           }
-        if (LocaleCompare("mip",option+1) == 0)
-          break;
         if (LocaleCompare("modulate",option+1) == 0)
           {
             if (*option == '+')
@@ -7902,6 +7903,23 @@ WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info,
             *images=GetFirstImageInList(q);
             break;
           }
+        if (LocaleCompare("intensity-projection",option+1) == 0)
+          {
+            Image
+              *projection_image;
+
+            (void) SyncImagesSettings(image_info,*images);
+            projection_image=IntensityProjectionImages(*images,*option == '+' ?
+              MagickTrue : MagickFalse,exception);
+            if (projection_image == (Image *) NULL)
+              {
+                status=MagickFalse;
+                break;
+              }
+            *images=DestroyImageList(*images);
+            *images=projection_image;
+            break;
+          }
         break;
       }
       case 'l':
@@ -8090,23 +8108,6 @@ WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info,
             i++;
             break;
           }
-        if (LocaleCompare("mip",option+1) == 0)
-          {
-            Image
-              *morph_image;
-
-            (void) SyncImagesSettings(image_info,*images);
-            morph_image=MorphImages(*images,StringToUnsignedLong(argv[i+1]),
-              exception);
-            if (morph_image == (Image *) NULL)
-              {
-                status=MagickFalse;
-                break;
-              }
-            *images=DestroyImageList(*images);
-            *images=morph_image;
-            break;
-          }
         if (LocaleCompare("morph",option+1) == 0)
           {
             Image