From: dirk Date: Sun, 16 Feb 2014 10:51:16 +0000 (+0000) Subject: Added morphology to Magick++. X-Git-Tag: 7.0.1-0~2673 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3648685f9a848931845044f9da77dccc4cc4f480;p=imagemagick Added morphology to Magick++. --- diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index d825b20d7..d42c63f89 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -3361,6 +3361,93 @@ void Magick::Image::modulate(const double brightness_,const double saturation_, ThrowPPException; } +void Magick::Image::morphology(const MorphologyMethod method_, + const std::string kernel_,const ssize_t iterations_) +{ + KernelInfo + *kernel; + + MagickCore::Image + *newImage; + + kernel=AcquireKernelInfo(kernel_.c_str()); + if (kernel == (KernelInfo *)NULL) + throwExceptionExplicit(OptionError,"Unable to parse kernel."); + + GetPPException; + newImage=MorphologyImage(constImage(),method_,iterations_,kernel, + &exceptionInfo); + replaceImage(newImage); + kernel=DestroyKernelInfo(kernel); + ThrowPPException; +} + +void Magick::Image::morphology(const MorphologyMethod method_, + const KernelInfoType kernel_,const std::string arguments_, + const ssize_t iterations_) +{ + const char + *option; + + std::string + kernel; + + option=CommandOptionToMnemonic(MagickKernelOptions,kernel_); + if (option == (const char *)NULL) + throwExceptionExplicit(OptionError,"Unable to determine kernel type."); + + kernel=std::string(option); + if (!arguments_.empty()) + kernel+=":"+arguments_; + + morphology(method_,kernel,iterations_); +} + +void Magick::Image::morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const std::string kernel_, + const ssize_t iterations_) +{ + KernelInfo + *kernel; + + MagickCore::Image + *newImage; + + kernel=AcquireKernelInfo(kernel_.c_str()); + if (kernel == (KernelInfo *)NULL) + throwExceptionExplicit(OptionError,"Unable to parse kernel."); + + GetPPException; + SetPPChannelMask(channel_); + newImage=MorphologyImage(constImage(),method_,iterations_,kernel, + &exceptionInfo); + RestorePPChannelMask; + replaceImage(newImage); + kernel=DestroyKernelInfo(kernel); + ThrowPPException; +} + +void Magick::Image::morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const KernelInfoType kernel_, + const std::string arguments_,const ssize_t iterations_) +{ + const char + *option; + + std::string + kernel; + + option=CommandOptionToMnemonic(MagickKernelOptions,kernel_); + if (option == (const char *)NULL) + throwExceptionExplicit(OptionError,"Unable to determine kernel type."); + + kernel=std::string(option); + if (!arguments_.empty()) + kernel+=":"+arguments_; + + morphologyChannel(channel_,method_,kernel,iterations_); +} + void Magick::Image::motionBlur(const double radius_,const double sigma_, const double angle_) { diff --git a/Magick++/lib/Magick++/Image.h b/Magick++/lib/Magick++/Image.h index 85e31fdd3..05a3757c5 100644 --- a/Magick++/lib/Magick++/Image.h +++ b/Magick++/lib/Magick++/Image.h @@ -1010,6 +1010,19 @@ namespace Magick void modulate(const double brightness_,const double saturation_, const double hue_); + // Applies a kernel to the image according to the given mophology method. + void morphology(const MorphologyMethod method_,const std::string kernel_, + const ssize_t iterations_=1); + void morphology(const MorphologyMethod method_, + const KernelInfoType kernel_,const std::string arguments_, + const ssize_t iterations_=1); + void morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const std::string kernel_, + const ssize_t iterations_=1); + void morphologyChannel(const ChannelType channel_, + const MorphologyMethod method_,const KernelInfoType kernel_, + const std::string arguments_,const ssize_t iterations_=1); + // Motion blur image with specified blur factor // The radius_ parameter specifies the radius of the Gaussian, in // pixels, not counting the center pixel. The sigma_ parameter diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h index 8dbdb4a31..d44445005 100644 --- a/Magick++/lib/Magick++/Include.h +++ b/Magick++/lib/Magick++/Include.h @@ -350,7 +350,12 @@ namespace Magick using MagickCore::YPbPrColorspace; using MagickCore::YUVColorspace; + // Command options + using MagickCore::CommandOption; + using MagickCore::MagickKernelOptions; + // Compliance types + using MagickCore::ComplianceType; using MagickCore::AllCompliance; // Composition operations @@ -624,20 +629,46 @@ namespace Magick using MagickCore::JPEGInterlace; using MagickCore::PNGInterlace; - // Pixel interpolation methods - using MagickCore::PixelInterpolateMethod; - using MagickCore::UndefinedInterpolatePixel; - using MagickCore::AverageInterpolatePixel; - using MagickCore::Average9InterpolatePixel; - using MagickCore::Average16InterpolatePixel; - using MagickCore::BackgroundInterpolatePixel; - using MagickCore::BilinearInterpolatePixel; - using MagickCore::BlendInterpolatePixel; - using MagickCore::CatromInterpolatePixel; - using MagickCore::IntegerInterpolatePixel; - using MagickCore::MeshInterpolatePixel; - using MagickCore::NearestInterpolatePixel; - using MagickCore::SplineInterpolatePixel; + // Built-in kernels + using MagickCore::KernelInfoType; + using MagickCore::UndefinedKernel; + using MagickCore::UnityKernel; + using MagickCore::GaussianKernel; + using MagickCore::DoGKernel; + using MagickCore::LoGKernel; + using MagickCore::BlurKernel; + using MagickCore::CometKernel; + using MagickCore::BinomialKernel; + using MagickCore::LaplacianKernel; + using MagickCore::SobelKernel; + using MagickCore::FreiChenKernel; + using MagickCore::RobertsKernel; + using MagickCore::PrewittKernel; + using MagickCore::CompassKernel; + using MagickCore::KirschKernel; + using MagickCore::DiamondKernel; + using MagickCore::SquareKernel; + using MagickCore::RectangleKernel; + using MagickCore::OctagonKernel; + using MagickCore::DiskKernel; + using MagickCore::PlusKernel; + using MagickCore::CrossKernel; + using MagickCore::RingKernel; + using MagickCore::PeaksKernel; + using MagickCore::EdgesKernel; + using MagickCore::CornersKernel; + using MagickCore::DiagonalsKernel; + using MagickCore::LineEndsKernel; + using MagickCore::LineJunctionsKernel; + using MagickCore::RidgesKernel; + using MagickCore::ConvexHullKernel; + using MagickCore::ThinSEKernel; + using MagickCore::SkeletonKernel; + using MagickCore::ChebyshevKernel; + using MagickCore::ManhattanKernel; + using MagickCore::OctagonalKernel; + using MagickCore::EuclideanKernel; + using MagickCore::UserDefinedKernel; // Layer method using MagickCore::LayerMethod; @@ -714,6 +745,32 @@ namespace Magick using MagickCore::PerceptualHashErrorMetric; using MagickCore::RootMeanSquaredErrorMetric; + // Morphology methods + using MagickCore::MorphologyMethod; + using MagickCore::UndefinedMorphology; + using MagickCore::ConvolveMorphology; + using MagickCore::CorrelateMorphology; + using MagickCore::ErodeMorphology; + using MagickCore::DilateMorphology; + using MagickCore::ErodeIntensityMorphology; + using MagickCore::DilateIntensityMorphology; + using MagickCore::IterativeDistanceMorphology; + using MagickCore::OpenMorphology; + using MagickCore::CloseMorphology; + using MagickCore::OpenIntensityMorphology; + using MagickCore::CloseIntensityMorphology; + using MagickCore::SmoothMorphology; + using MagickCore::EdgeInMorphology; + using MagickCore::EdgeOutMorphology; + using MagickCore::EdgeMorphology; + using MagickCore::TopHatMorphology; + using MagickCore::BottomHatMorphology; + using MagickCore::HitAndMissMorphology; + using MagickCore::ThinningMorphology; + using MagickCore::ThickenMorphology; + using MagickCore::DistanceMorphology; + using MagickCore::VoronoiMorphology; + // Noise types using MagickCore::NoiseType; using MagickCore::UndefinedNoise; @@ -786,6 +843,7 @@ namespace Magick using MagickCore::SplineInterpolatePixel; // Pixel traits + using MagickCore::PixelTrait; using MagickCore::UndefinedPixelTrait; using MagickCore::BlendPixelTrait; @@ -991,6 +1049,7 @@ namespace Magick using MagickCore::ColorDecisionListImage; using MagickCore::ColorizeImage; using MagickCore::ColorMatrixImage; + using MagickCore::CommandOptionToMnemonic; using MagickCore::CompareImages; using MagickCore::CompositeImage; using MagickCore::ConfigureError; @@ -1234,6 +1293,7 @@ namespace Magick using MagickCore::MonitorFatalError; using MagickCore::MonitorWarning; using MagickCore::MontageInfo; + using MagickCore::MorphologyImage; using MagickCore::MotionBlurImage; using MagickCore::NegateImage; using MagickCore::NewMagickWandFromImage;