]> granicus.if.org Git - imagemagick/commitdiff
Added new class to support multiple ChannelMoments.
authordirk <dirk@git.imagemagick.org>
Tue, 29 Apr 2014 04:58:45 +0000 (04:58 +0000)
committerdirk <dirk@git.imagemagick.org>
Tue, 29 Apr 2014 04:58:45 +0000 (04:58 +0000)
Magick++/lib/ChannelMoments.cpp
Magick++/lib/Image.cpp
Magick++/lib/Magick++/ChannelMoments.h
Magick++/lib/Magick++/Image.h

index 652a5ce16363a54a5aeed7b1ef3372ec160b89de..9e637248aa4ce05a7a1b29a5b24676d7461f11fd 100644 (file)
@@ -15,7 +15,8 @@
 using namespace std;
 
 Magick::ChannelMoments::ChannelMoments(void)
-  : _huInvariants(),
+  : _huInvariants(8),
+    _channel(UndefinedChannel),
     _centroidX(0.0),
     _centroidY(0.0),
     _ellipseAxisX(0.0),
@@ -28,6 +29,7 @@ Magick::ChannelMoments::ChannelMoments(void)
 
 Magick::ChannelMoments::ChannelMoments(const ChannelMoments &channelMoments_)
   : _huInvariants(channelMoments_._huInvariants),
+    _channel(channelMoments_._channel),
     _centroidX(channelMoments_._centroidX),
     _centroidY(channelMoments_._centroidY),
     _ellipseAxisX(channelMoments_._ellipseAxisX),
@@ -36,16 +38,16 @@ Magick::ChannelMoments::ChannelMoments(const ChannelMoments &channelMoments_)
     _ellipseEccentricity(channelMoments_._ellipseEccentricity),
     _ellipseIntensity(channelMoments_._ellipseIntensity)
 {
-//channelMoments_
 }
 
 Magick::ChannelMoments::~ChannelMoments(void)
 {
 }
 
-Magick::ChannelMoments::ChannelMoments(
+Magick::ChannelMoments::ChannelMoments(const ChannelType channel_,
   const MagickCore::ChannelMoments *channelMoments_)
   : _huInvariants(),
+    _channel(channel_),
     _centroidX(channelMoments_->centroid.x),
     _centroidY(channelMoments_->centroid.y),
     _ellipseAxisX(channelMoments_->ellipse_axis.x),
@@ -71,6 +73,11 @@ double Magick::ChannelMoments::centroidY(void) const
   return(_centroidY);
 }
 
+Magick::ChannelType Magick::ChannelMoments::channel(void) const
+{
+  return(_channel);
+}
+
 double Magick::ChannelMoments::ellipseAxisX(void) const
 {
   return(_ellipseAxisX);
@@ -102,4 +109,78 @@ double Magick::ChannelMoments::huInvariants(const size_t index_) const
     throw ErrorOption("Valid range for index is 0-7");
 
   return(_huInvariants.at(index_));
+}
+
+Magick::ImageMoments::ImageMoments(void)
+  : _channels()
+{
+}
+
+Magick::ImageMoments::ImageMoments(const ImageMoments &imageMoments_)
+  : _channels(imageMoments_._channels)
+{
+}
+
+Magick::ImageMoments::~ImageMoments(void)
+{
+}
+
+Magick::ChannelMoments Magick::ImageMoments::channel(
+  const ChannelType channel_) const
+{
+  for (std::vector<ChannelMoments>::const_iterator it = _channels.begin();
+       it != _channels.end(); ++it)
+  {
+    if (it->channel() == channel_)
+      return(*it);
+  }
+  return(ChannelMoments());
+}
+
+Magick::ImageMoments::ImageMoments(const MagickCore::Image *image)
+  : _channels()
+{
+  MagickCore::ChannelMoments*
+    channel_moments;
+
+  GetPPException;
+  channel_moments=GetImageMoments(image,&exceptionInfo);
+  if (channel_moments != (MagickCore::ChannelMoments *) NULL)
+    {
+      switch(image->colorspace)
+      {
+        case RGBColorspace:
+        default:
+          _channels.push_back(Magick::ChannelMoments(RedChannel,
+            &channel_moments[RedChannel]));
+          _channels.push_back(Magick::ChannelMoments(GreenChannel,
+            &channel_moments[GreenChannel]));
+          _channels.push_back(Magick::ChannelMoments(BlueChannel,
+            &channel_moments[BlueChannel]));
+          break;
+        case CMYKColorspace:
+          _channels.push_back(Magick::ChannelMoments(CyanChannel,
+            &channel_moments[CyanChannel]));
+          _channels.push_back(Magick::ChannelMoments(MagentaChannel,
+            &channel_moments[MagentaChannel]));
+          _channels.push_back(Magick::ChannelMoments(YellowChannel,
+            &channel_moments[YellowChannel]));
+          _channels.push_back(Magick::ChannelMoments(BlackChannel,
+            &channel_moments[BlackChannel]));
+          break;
+        case GRAYColorspace:
+          _channels.push_back(Magick::ChannelMoments(GrayChannel,
+            &channel_moments[GrayChannel]));
+          break;
+      }
+      if (image->alpha_trait == BlendPixelTrait)
+        _channels.push_back(Magick::ChannelMoments(AlphaChannel,
+          &channel_moments[AlphaChannel]));
+      if (image->colorspace != GRAYColorspace)
+        _channels.push_back(Magick::ChannelMoments(CompositeChannels,
+          &channel_moments[CompositeChannels]));
+      channel_moments=(MagickCore::ChannelMoments *) RelinquishMagickMemory(
+        channel_moments);
+    }
+  ThrowPPException;
 }
\ No newline at end of file
index c3b828cef866a52d01fc1ec9bb74f560f3e010f4..1a261b4043ebc9eb3b8ce766b00b01d8682aa893 100644 (file)
@@ -3396,24 +3396,9 @@ void Magick::Image::modulate(const double brightness_,const double saturation_,
   ThrowPPException;
 }
 
-Magick::ChannelMoments Magick::Image::moments(void)
+Magick::ImageMoments Magick::Image::moments(void)
 {
-  ChannelMoments
-    channelMoments;
-
-  MagickCore::ChannelMoments*
-    channel_moments;
-
-  GetPPException;
-  channel_moments=GetImageMoments(constImage(),&exceptionInfo);
-  if (channel_moments != (MagickCore::ChannelMoments *) NULL)
-    {
-      channelMoments=ChannelMoments(channel_moments);
-      channel_moments=(MagickCore::ChannelMoments *) RelinquishMagickMemory(
-        channel_moments);
-    }
-  ThrowPPException;
-  return(channelMoments);
+  return(ImageMoments(constImage()));
 }
 
 void Magick::Image::morphology(const MorphologyMethod method_,
index fd7773da211b865b8333ba4caba1311ad4121022..d4d491d2a02a40a4b91b724bca26f5faee247c2d 100644 (file)
@@ -29,7 +29,9 @@ namespace Magick
     //
     // Implemementation methods
     //
-    ChannelMoments(const MagickCore::ChannelMoments *channelMoments_);
+
+    ChannelMoments(const ChannelType channel_,
+      const MagickCore::ChannelMoments *channelMoments_);
 
     // X position of centroid
     double centroidX(void) const;
@@ -37,6 +39,9 @@ namespace Magick
     // Y position of centroid
     double centroidY(void) const;
 
+    // The channel
+    ChannelType channel(void) const;
+
     // X position of ellipse axis
     double ellipseAxisX(void) const;
 
@@ -57,6 +62,7 @@ namespace Magick
 
   private:
     std::vector<double> _huInvariants;
+    ChannelType _channel;
     double _centroidX;
     double _centroidY;
     double _ellipseAxisX;
@@ -66,6 +72,30 @@ namespace Magick
     double _ellipseIntensity;
   };
 
+  class MagickPPExport ImageMoments
+  {
+  public:
+
+    // Default constructor
+    ImageMoments(void);
+
+    // Copy constructor
+    ImageMoments(const ImageMoments &imageMoments_);
+
+    // Destroy image moments
+    ~ImageMoments(void);
+
+    // Returns the moments for the specified channel
+    ChannelMoments channel(const ChannelType channel_=CompositeChannels) const;
+
+    //
+    // Implemementation methods
+    //
+    ImageMoments(const MagickCore::Image *image_);
+
+  private:
+    std::vector<ChannelMoments> _channels;
+  };
 }
 
 #endif // Magick_ChannelMoments_header
\ No newline at end of file
index 8909d9680caac9dfd3d74bfb9ba182b4dbc8c251..c10344b00dc073925d260ace93305ef30e1ed367 100644 (file)
@@ -1032,7 +1032,7 @@ namespace Magick
       const double hue_);
 
     // Returns the normalized moments of one or more image channels.
-    ChannelMoments moments(void);
+    ImageMoments moments(void);
 
     // Applies a kernel to the image according to the given mophology method.
     void morphology(const MorphologyMethod method_,const std::string kernel_,