1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include <wand/MagickWand.h>
5
SigmoidalContrast(WandView * contrast_view,const ssize_t y,const int id,void * context)6 static MagickBooleanType SigmoidalContrast(WandView *contrast_view,
7 const ssize_t y,const int id,void *context)
8 {
9 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
10 #define SigmoidalContrast(x) \
11 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
12
13 RectangleInfo
14 extent;
15
16 MagickPixelPacket
17 pixel;
18
19 PixelWand
20 **pixels;
21
22 register ssize_t
23 x;
24
25 extent=GetWandViewExtent(contrast_view);
26 pixels=GetWandViewPixels(contrast_view);
27 for (x=0; x < (ssize_t) (extent.width-extent.x); x++)
28 {
29 PixelGetMagickColor(pixels[x],&pixel);
30 pixel.red=SigmoidalContrast(pixel.red);
31 pixel.green=SigmoidalContrast(pixel.green);
32 pixel.blue=SigmoidalContrast(pixel.blue);
33 pixel.index=SigmoidalContrast(pixel.index);
34 PixelSetMagickColor(pixels[x],&pixel);
35 }
36 return(MagickTrue);
37 }
38
main(int argc,char ** argv)39 int main(int argc,char **argv)
40 {
41 #define ThrowViewException(view) \
42 { \
43 description=GetWandViewException(view,&severity); \
44 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
45 description=(char *) MagickRelinquishMemory(description); \
46 exit(-1); \
47 }
48 #define ThrowWandException(wand) \
49 { \
50 description=MagickGetException(wand,&severity); \
51 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
52 description=(char *) MagickRelinquishMemory(description); \
53 exit(-1); \
54 }
55
56 char
57 *description;
58
59 ExceptionType
60 severity;
61
62 MagickBooleanType
63 status;
64
65 MagickPixelPacket
66 pixel;
67
68 MagickWand
69 *contrast_wand;
70
71 WandView
72 *contrast_view;
73
74 if (argc != 3)
75 {
76 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
77 exit(0);
78 }
79 /*
80 Read an image.
81 */
82 MagickWandGenesis();
83 contrast_wand=NewMagickWand();
84 status=MagickReadImage(contrast_wand,argv[1]);
85 if (status == MagickFalse)
86 ThrowWandException(contrast_wand);
87 /*
88 Sigmoidal non-linearity contrast control.
89 */
90 contrast_view=NewWandView(contrast_wand);
91 if (contrast_view == (WandView *) NULL)
92 ThrowWandException(contrast_wand);
93 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
94 if (status == MagickFalse)
95 ThrowWandException(contrast_wand);
96 contrast_view=DestroyWandView(contrast_view);
97 /*
98 Write the image then destroy it.
99 */
100 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
101 if (status == MagickFalse)
102 ThrowWandException(contrast_wand);
103 contrast_wand=DestroyMagickWand(contrast_wand);
104 MagickWandTerminus();
105 return(0);
106 }
107