packages feed

hopfield-0.1.0.0: src/Hopfield/Images/convertImage.c

#include "convertImage.h"
#include <assert.h>
#include <wand/magick_wand.h>

void ThrowWandException(MagickWand *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);
  }

/* converts a list of doubles to binary + flattens the matrix to a vector */
binary_pattern_t *
mapToBinary(double** pattern, int width, int height){
  binary_pattern_t* binaryPattern = (binary_pattern_t *) malloc(sizeof(*binaryPattern));
  const int size = width * height;
  binaryPattern->size = size;
  binaryPattern->pattern = (uint32_t *) malloc(sizeof(*binaryPattern->pattern) * size);

  int i=0;

  for(int h = 0; h < height; h++)
    for(int w = 0; w < width; w++)
    {
      binaryPattern->pattern[i] = pattern[w][h] < 0.5 ? 0 : 1;
      i++;
    }

  return binaryPattern;
}

/* loads a picture from the inputImg filepath, scales it to the specified 
   width and height, and then converts it to a binary pattern, usable by 
   the Hopfield Network */
binary_pattern_t *
load_picture(char* inputImg, size_t width, size_t height)
{
  /* load a picture in the "wand" */
  MagickWand *mw = NULL;

  MagickWandGenesis();

  /* Create a wand */
  mw = NewMagickWand();

  /* Read the input image */
 MagickBooleanType retVal = MagickReadImage(mw, inputImg);

   if (retVal == MagickFalse)
     ThrowWandException(mw);

  PixelWand** pixels;
  /* rescale the image */
  int resizeSuccess = MagickResizeImage(mw, height, width, LanczosFilter, 0);

  if (!resizeSuccess)
  {
    printf("resize failed\n");
    exit(1);
  }

  PixelIterator* pixelIt = NewPixelIterator(mw);
  double** outputPattern = (double**) malloc (sizeof(double*) * width);
  for(size_t i=0; i < width; i++)
  {
    outputPattern[i] = (double*) malloc(sizeof(double) * height);
  }

  long y;
  /* get pixel grayscale values */
  for (y=0; y < (long) height; y++)
  {
    size_t iter_width;
    pixels=PixelGetNextIteratorRow(pixelIt,&iter_width);
    assert (iter_width == width);
    for (long x=0; x < (long) iter_width; x++) {
      outputPattern[x][y] = (PixelGetRed(pixels[x]) +
        PixelGetGreen(pixels[x]) + PixelGetBlue(pixels[x]))/3;
    }
  }

  /* Tidy up */
  if(mw) mw = DestroyMagickWand(mw);

  MagickWandTerminus();
  
  /* since outputPattern is a list of doubles, convert it to a list of
     binary values */
  return mapToBinary(outputPattern, width, height);
}