root/ImageMagick/trunk/filters/analyze.c

Revision 1, 9.3 KB (checked in by cristy, 3 months ago)


Line 
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                AAA   N   N   AAA   L      Y   Y  ZZZZZ  EEEEE               %
6%               A   A  NN  N  A   A  L       Y Y      ZZ  E                   %
7%               AAAAA  N N N  AAAAA  L        Y     ZZZ   EEE                 %
8%               A   A  N  NN  A   A  L        Y    ZZ     E                   %
9%               A   A  N   N  A   A  LLLLL    Y    ZZZZZ  EEEEE               %
10%                                                                             %
11%                             Analyze An Image                                %
12%                                                                             %
13%                             Software Design                                 %
14%                               Bill Corbis                                   %
15%                              December 1998                                  %
16%                                                                             %
17%                                                                             %
18%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
19%  dedicated to making software imaging solutions freely available.           %
20%                                                                             %
21%  You may not use this file except in compliance with the License.  You may  %
22%  obtain a copy of the License at                                            %
23%                                                                             %
24%    http://www.imagemagick.org/script/license.php                            %
25%                                                                             %
26%  Unless required by applicable law or agreed to in writing, software        %
27%  distributed under the License is distributed on an "AS IS" BASIS,          %
28%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
29%  See the License for the specific language governing permissions and        %
30%  limitations under the License.                                             %
31%                                                                             %
32%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33%
34*/
35
36/*
37  Include declarations.
38*/
39#include <stdio.h>
40#include <stdlib.h>
41#include <string.h>
42#include <time.h>
43#include <assert.h>
44#include <math.h>
45#include "magick/MagickCore.h"
46
47/*
48%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49%                                                                             %
50%                                                                             %
51%                                                                             %
52%   a n a l y z e I m a g e                                                   %
53%                                                                             %
54%                                                                             %
55%                                                                             %
56%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57%
58%  analyzeImage() computes the brightness and saturation mean,  standard
59%  deviation, kurtosis and skewness and stores these values as attributes
60%  of the image.
61%
62%  The format of the analyzeImage method is:
63%
64%      unsigned long analyzeImage(Image *images,const int argc,
65%        char **argv,ExceptionInfo *exception)
66%
67%  A description of each parameter follows:
68%
69%    o image: the address of a structure of type Image.
70%
71%    o argc: Specifies a pointer to an integer describing the number of
72%      elements in the argument vector.
73%
74%    o argv: Specifies a pointer to a text array containing the command line
75%      arguments.
76%
77%    o exception: return any errors or warnings in this structure.
78%
79*/
80ModuleExport unsigned long analyzeImage(Image **images,const int argc,
81  const char **argv,ExceptionInfo *exception)
82{
83  char
84    text[MaxTextExtent];
85
86  double
87    area,
88    brightness_mean,
89    brightness_standard_deviation,
90    brightness_kurtosis,
91    brightness_skewness,
92    brightness_sum_x,
93    brightness_sum_x2,
94    brightness_sum_x3,
95    brightness_sum_x4,
96    saturation_mean,
97    saturation_standard_deviation,
98    saturation_kurtosis,
99    saturation_skewness,
100    saturation_sum_x,
101    saturation_sum_x2,
102    saturation_sum_x3,
103    saturation_sum_x4;
104
105  double
106    brightness,
107    hue,
108    saturation;
109
110  Image
111    *image;
112
113  long
114    y;
115
116  register const PixelPacket
117    *p;
118
119  register long
120    x;
121
122  assert(images != (Image **) NULL);
123  assert(*images != (Image *) NULL);
124  assert((*images)->signature == MagickSignature);
125  (void) argc;
126  (void) argv;
127  image=(*images);
128  for ( ; image != (Image *) NULL; image=GetNextImageInList(image))
129  {
130    brightness_sum_x=0.0;
131    brightness_sum_x2=0.0;
132    brightness_sum_x3=0.0;
133    brightness_sum_x4=0.0;
134    brightness_mean=0.0;
135    brightness_standard_deviation=0.0;
136    brightness_kurtosis=0.0;
137    brightness_skewness=0.0;
138    saturation_sum_x=0.0;
139    saturation_sum_x2=0.0;
140    saturation_sum_x3=0.0;
141    saturation_sum_x4=0.0;
142    saturation_mean=0.0;
143    saturation_standard_deviation=0.0;
144    saturation_kurtosis=0.0;
145    saturation_skewness=0.0;
146    area=0.0;
147    for (y=0; y < (long) image->rows; y++)
148    {
149      p=GetVirtualPixels(image,0,y,image->columns,1,exception);
150      if (p == (const PixelPacket *) NULL)
151        break;
152      for (x=0; x < (long) image->columns; x++)
153      {
154        ConvertRGBToHSB(p->red,p->green,p->blue,&hue,&saturation,&brightness);
155        brightness*=QuantumRange;
156        brightness_sum_x+=brightness;
157        brightness_sum_x2+=brightness*brightness;
158        brightness_sum_x3+=brightness*brightness*brightness;
159        brightness_sum_x4+=brightness*brightness*brightness*brightness;
160        saturation*=QuantumRange;
161        saturation_sum_x+=saturation;
162        saturation_sum_x2+=saturation*saturation;
163        saturation_sum_x3+=saturation*saturation*saturation;
164        saturation_sum_x4+=saturation*saturation*saturation*saturation;
165        area++;
166        p++;
167      }
168    }
169    if (area <= 0.0)
170      break;
171    brightness_mean=brightness_sum_x/area;
172    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_mean);
173    (void) SetImageProperty(image,"filter:brightness:mean",text);
174    brightness_standard_deviation=sqrt(brightness_sum_x2/area-(brightness_sum_x/
175      area*brightness_sum_x/area));
176    (void) FormatMagickString(text,MaxTextExtent,"%g",
177      brightness_standard_deviation);
178    (void) SetImageProperty(image,"filter:brightness:standard-deviation",text);
179    if (brightness_standard_deviation != 0)
180      brightness_kurtosis=(brightness_sum_x4/area-4.0*brightness_mean*
181        brightness_sum_x3/area+6.0*brightness_mean*brightness_mean*
182        brightness_sum_x2/area-3.0*brightness_mean*brightness_mean*
183        brightness_mean*brightness_mean)/(brightness_standard_deviation*
184        brightness_standard_deviation*brightness_standard_deviation*
185        brightness_standard_deviation)-3.0;
186    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_kurtosis);
187    (void) SetImageProperty(image,"filter:brightness:kurtosis",text);
188    if (brightness_standard_deviation != 0)
189      brightness_skewness=(brightness_sum_x3/area-3.0*brightness_mean*
190        brightness_sum_x2/area+2.0*brightness_mean*brightness_mean*
191        brightness_mean)/(brightness_standard_deviation*
192        brightness_standard_deviation*brightness_standard_deviation);
193    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_skewness);
194    (void) SetImageProperty(image,"filter:brightness:skewness",text);
195    saturation_mean=saturation_sum_x/area;
196    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_mean);
197    (void) SetImageProperty(image,"filter:saturation:mean",text);
198    saturation_standard_deviation=sqrt(saturation_sum_x2/area-(saturation_sum_x/
199      area*saturation_sum_x/area));
200    (void) FormatMagickString(text,MaxTextExtent,"%g",
201      saturation_standard_deviation);
202    (void) SetImageProperty(image,"filter:saturation:standard-deviation",text);
203    if (saturation_standard_deviation != 0)
204      saturation_kurtosis=(saturation_sum_x4/area-4.0*saturation_mean*
205        saturation_sum_x3/area+6.0*saturation_mean*saturation_mean*
206        saturation_sum_x2/area-3.0*saturation_mean*saturation_mean*
207        saturation_mean*saturation_mean)/(saturation_standard_deviation*
208        saturation_standard_deviation*saturation_standard_deviation*
209        saturation_standard_deviation)-3.0;
210    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_kurtosis);
211    (void) SetImageProperty(image,"filter:saturation:kurtosis",text);
212    if (saturation_standard_deviation != 0)
213      saturation_skewness=(saturation_sum_x3/area-3.0*saturation_mean*
214        saturation_sum_x2/area+2.0*saturation_mean*saturation_mean*
215        saturation_mean)/(saturation_standard_deviation*
216        saturation_standard_deviation*saturation_standard_deviation);
217    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_skewness);
218    (void) SetImageProperty(image,"filter:saturation:skewness",text);
219  }
220  return(MagickImageFilterSignature);
221}
Note: See TracBrowser for help on using the browser.