1 module dmagick.c.statistic; 2 3 import dmagick.c.draw; 4 import dmagick.c.exception; 5 import dmagick.c.image; 6 import dmagick.c.magickType; 7 import dmagick.c.magickVersion; 8 9 extern(C) 10 { 11 struct ChannelStatistics 12 { 13 size_t 14 depth; 15 16 static if ( MagickLibVersion >= 0x664 ) 17 { 18 double 19 minima, 20 maxima, 21 sum, 22 sum_squared, 23 sum_cubed, 24 sum_fourth_power, 25 mean, 26 variance, 27 standard_deviation, 28 kurtosis, 29 skewness; 30 } 31 else 32 { 33 double 34 minima, 35 maxima, 36 mean, 37 standard_deviation, 38 kurtosis, 39 skewness; 40 } 41 42 static if ( MagickLibVersion >= 0x690 ) 43 { 44 double entropy; 45 } 46 } 47 48 static if ( MagickLibVersion >= 0x689 ) 49 { 50 struct ChannelMoments 51 { 52 double[32] 53 I; 54 55 PointInfo 56 centroid, 57 ellipse_axis; 58 59 double 60 ellipse_angle, 61 ellipse_eccentricity, 62 ellipse_intensity; 63 } 64 65 struct ChannelPerceptualHash 66 { 67 double[32] 68 P, 69 Q; 70 } 71 } 72 73 /** 74 * Alter channel pixels by evaluating an arithmetic, relational, 75 * or logical expression. 76 */ 77 enum MagickEvaluateOperator 78 { 79 UndefinedEvaluateOperator, /// 80 AddEvaluateOperator, /// Add value to pixels. 81 AndEvaluateOperator, /// Binary AND of pixels with value. 82 DivideEvaluateOperator, /// Divide pixels by value. 83 LeftShiftEvaluateOperator, /// Shift the pixel values left by value bits. 84 MaxEvaluateOperator, /// Clip pixels at lower bound value. 85 MinEvaluateOperator, /// Clip pixels at upper bound value. 86 MultiplyEvaluateOperator, /// Multiply pixels by value. 87 OrEvaluateOperator, /// Binary OR of pixels with value. 88 RightShiftEvaluateOperator, /// Shift the pixel values right by value bits. 89 SetEvaluateOperator, /// Set pixel equal to value. 90 SubtractEvaluateOperator, /// Subtract value from pixels. 91 XorEvaluateOperator, /// Binary XOR of pixels with value. 92 PowEvaluateOperator, /// Raise normalized pixels to the power value. 93 LogEvaluateOperator, /// Apply scaled logarithm to normalized pixels. 94 ThresholdEvaluateOperator, /// Threshold pixels larger than value. 95 ThresholdBlackEvaluateOperator, /// Threshold pixels to zero values equal to or below value. 96 ThresholdWhiteEvaluateOperator, /// Threshold pixels to maximum values above value. 97 GaussianNoiseEvaluateOperator, /// 98 ImpulseNoiseEvaluateOperator, /// ditto 99 LaplacianNoiseEvaluateOperator, /// ditto 100 MultiplicativeNoiseEvaluateOperator, /// ditto 101 PoissonNoiseEvaluateOperator, /// ditto 102 UniformNoiseEvaluateOperator, /// ditto 103 CosineEvaluateOperator, /// Apply cosine to pixels with frequency value with 50% bias added. 104 SineEvaluateOperator, /// Apply sine to pixels with frequency value with 50% bias added. 105 AddModulusEvaluateOperator, /// Add value to pixels modulo QuantumRange. 106 MeanEvaluateOperator, /// Add the value and divide by 2. 107 AbsEvaluateOperator, /// Add value to pixels and return absolute value. 108 ExponentialEvaluateOperator, /// base-e exponential function. 109 MedianEvaluateOperator, /// Choose the median value from an image sequence. 110 SumEvaluateOperator, /// Add value to pixels. 111 RootMeanSquareEvaluateOperator /// 112 } 113 114 /** 115 * Apply a function to channel values. 116 * 117 * See_Also: $(XREF Image, functionImage). 118 */ 119 enum MagickFunction 120 { 121 UndefinedFunction, /// 122 PolynomialFunction, /// ditto 123 SinusoidFunction, /// ditto 124 ArcsinFunction, /// ditto 125 ArctanFunction /// ditto 126 } 127 128 version(D_Ddoc) 129 { 130 /** 131 * The statistic method to apply. 132 */ 133 enum StatisticType 134 { 135 UndefinedStatistic, /// 136 GradientStatistic, /// Maximum difference in area. 137 MaximumStatistic, /// Maximum value per channel in neighborhood. 138 MeanStatistic, /// Average value per channel in neighborhood. 139 MedianStatistic, /// Median value per channel in neighborhood. 140 MinimumStatistic, /// Minimum value per channel in neighborhood. 141 ModeStatistic, /// Mode (most frequent) value per channel in neighborhood. 142 NonpeakStatistic, /// Value just before or after the median value per channel in neighborhood. 143 StandardDeviationStatistic, /// 144 RootMeanSquareStatistic /// 145 } 146 } 147 else 148 { 149 mixin( 150 { 151 string types = "enum StatisticType 152 { 153 UndefinedStatistic,"; 154 155 static if ( MagickLibVersion >= 0x670 ) 156 { 157 types ~= "GradientStatistic,"; 158 } 159 160 types ~= " 161 MaximumStatistic, 162 MeanStatistic, 163 MedianStatistic, 164 MinimumStatistic, 165 ModeStatistic, 166 NonpeakStatistic,"; 167 168 static if ( MagickLibVersion >= 0x670 ) 169 { 170 types ~= "StandardDeviationStatistic,"; 171 } 172 173 static if ( MagickLibVersion >= 0x690 ) 174 { 175 types ~= "RootMeanSquareStatistic,"; 176 } 177 178 types ~= " 179 }"; 180 181 return types; 182 }()); 183 } 184 185 ChannelStatistics* GetImageChannelStatistics(const(Image)*, ExceptionInfo*); 186 187 static if ( MagickLibVersion >= 0x689 ) 188 { 189 ChannelMoments* GetImageChannelMoments(const(Image)*, ExceptionInfo*); 190 191 ChannelPerceptualHash* GetImageChannelPerceptualHash(const(Image)*, ExceptionInfo*); 192 } 193 194 static if ( MagickLibVersion < 0x661 ) 195 { 196 Image* AverageImages(const(Image)*, ExceptionInfo*); 197 } 198 199 static if ( MagickLibVersion >= 0x661 ) 200 { 201 Image* EvaluateImages(const(Image)*, const MagickEvaluateOperator, ExceptionInfo*); 202 } 203 204 static if ( MagickLibVersion >= 0x681 ) 205 { 206 Image* PolynomialImage(const(Image)*, const size_t, const(double)*, ExceptionInfo*); 207 Image* PolynomialImageChannel(const(Image)*, const ChannelType, const size_t, const(double)*, ExceptionInfo*); 208 } 209 210 static if ( MagickLibVersion >= 0x669 ) 211 { 212 Image* StatisticImage(const(Image)*, const StatisticType, const size_t, const size_t, ExceptionInfo*); 213 Image* StatisticImageChannel(const(Image)*, const ChannelType, const StatisticType, const size_t, const size_t, ExceptionInfo*); 214 } 215 216 MagickBooleanType EvaluateImage(Image*, const MagickEvaluateOperator, const double, ExceptionInfo*); 217 MagickBooleanType EvaluateImageChannel(Image*, const ChannelType, const MagickEvaluateOperator, const double, ExceptionInfo*); 218 MagickBooleanType FunctionImage(Image*, const MagickFunction, const size_t, const(double)*, ExceptionInfo*); 219 MagickBooleanType FunctionImageChannel(Image*, const ChannelType, const MagickFunction, const size_t, const(double)*, ExceptionInfo*); 220 221 static if ( MagickLibVersion >= 0x690 ) 222 { 223 MagickBooleanType GetImageChannelEntropy(const(Image)*, const ChannelType, double*, ExceptionInfo*); 224 } 225 226 MagickBooleanType GetImageChannelExtrema(const(Image)*, const ChannelType, size_t*, size_t*, ExceptionInfo*); 227 MagickBooleanType GetImageChannelMean(const(Image)*, const ChannelType, double*, double*, ExceptionInfo*); 228 MagickBooleanType GetImageChannelKurtosis(const(Image)*, const ChannelType, double*, double*, ExceptionInfo*); 229 MagickBooleanType GetImageChannelRange(const(Image)*, const ChannelType, double*, double*, ExceptionInfo*); 230 231 static if ( MagickLibVersion >= 0x690 ) 232 { 233 MagickBooleanType GetImageEntropy(const(Image)*, double*, ExceptionInfo*); 234 } 235 236 MagickBooleanType GetImageExtrema(const(Image)*, size_t*, size_t*, ExceptionInfo*); 237 MagickBooleanType GetImageMean(const(Image)*, double*, double*, ExceptionInfo*); 238 MagickBooleanType GetImageKurtosis(const(Image)*, double*, double*, ExceptionInfo*); 239 MagickBooleanType GetImageRange(const(Image)*, double*, double*, ExceptionInfo*); 240 }