| #include <stdio.h> |
| #include <stdlib.h> |
| #include <math.h> |
| #include <wand/MagickWand.h> |
| |
| int main(int argc,char **argv) |
| { |
| #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange) |
| #define SigmoidalContrast(x) \ |
| (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503) |
| #define ThrowWandException(wand) \ |
| { \ |
| char \ |
| *description; \ |
| \ |
| ExceptionType \ |
| severity; \ |
| \ |
| description=MagickGetException(wand,&severity); \ |
| (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \ |
| description=(char *) MagickRelinquishMemory(description); \ |
| exit(-1); \ |
| } |
| |
| MagickBooleanType |
| status; |
| |
| MagickPixelPacket |
| pixel; |
| |
| MagickWand |
| *contrast_wand, |
| *image_wand; |
| |
| PixelIterator |
| *contrast_iterator, |
| *iterator; |
| |
| PixelWand |
| **contrast_pixels, |
| **pixels; |
| |
| register ssize_t |
| x; |
| |
| size_t |
| width; |
| |
| ssize_t |
| y; |
| |
| if (argc != 3) |
| { |
| (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]); |
| exit(0); |
| } |
| /* |
| Read an image. |
| */ |
| MagickWandGenesis(); |
| image_wand=NewMagickWand(); |
| status=MagickReadImage(image_wand,argv[1]); |
| if (status == MagickFalse) |
| ThrowWandException(image_wand); |
| contrast_wand=CloneMagickWand(image_wand); |
| /* |
| Sigmoidal non-linearity contrast control. |
| */ |
| iterator=NewPixelIterator(image_wand); |
| contrast_iterator=NewPixelIterator(contrast_wand); |
| if ((iterator == (PixelIterator *) NULL) || |
| (contrast_iterator == (PixelIterator *) NULL)) |
| ThrowWandException(image_wand); |
| for (y=0; y < (ssize_t) MagickGetImageHeight(image_wand); y++) |
| { |
| pixels=PixelGetNextIteratorRow(iterator,&width); |
| contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width); |
| if ((pixels == (PixelWand **) NULL) || |
| (contrast_pixels == (PixelWand **) NULL)) |
| break; |
| for (x=0; x < (ssize_t) width; x++) |
| { |
| PixelGetMagickColor(pixels[x],&pixel); |
| pixel.red=SigmoidalContrast(pixel.red); |
| pixel.green=SigmoidalContrast(pixel.green); |
| pixel.blue=SigmoidalContrast(pixel.blue); |
| pixel.index=SigmoidalContrast(pixel.index); |
| PixelSetMagickColor(contrast_pixels[x],&pixel); |
| } |
| (void) PixelSyncIterator(contrast_iterator); |
| } |
| if (y < (ssize_t) MagickGetImageHeight(image_wand)) |
| ThrowWandException(image_wand); |
| contrast_iterator=DestroyPixelIterator(contrast_iterator); |
| iterator=DestroyPixelIterator(iterator); |
| image_wand=DestroyMagickWand(image_wand); |
| /* |
| Write the image then destroy it. |
| */ |
| status=MagickWriteImages(contrast_wand,argv[2],MagickTrue); |
| if (status == MagickFalse) |
| ThrowWandException(image_wand); |
| contrast_wand=DestroyMagickWand(contrast_wand); |
| MagickWandTerminus(); |
| return(0); |
| } |