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