resizing and changing to gray scale

761 Views Asked by At

I'm trying to take a jpg photo, and make it grayscale and resize it to 48x48 for my model, I tried this but it doesn't work:

let image = require("../assets/angry.jpg");
      const imageAssetPath = Image.resolveAssetSource(image);
      const response = await fetch(imageAssetPath.uri, {}, { isBinary: true });
      const imageData = await response.arrayBuffer();
      let imageTensor = imageToTensor(imageData);
      const imageResize = tf.image.resizeBilinear(imageTensor, [48, 48], true);



  const imageToTensor = (rawData: ArrayBuffer) => {
    const { width, height, data } = jpeg.decode(rawData, true);
    const buffer = new Uint8Array(width * height * 3);
    let offset = 0;
    for (let i = 0; i < buffer.length; i += 3) {
      buffer[i] = data[offset]; //red
      buffer[i + 1] = data[offset + 1]; //green
      buffer[i + 2] = data[offset + 2]; //blue
      offset += 4; //skips Alpha value
    }
    return tf.tensor4d(buffer, [1, height, width, 3]);
  };

the image is resizing to 48x48 but how do I make it grayscale? I tried in imageToTensor function to change the array to [height,width,1] but it only messed up the picture, any suggestions?

1

There are 1 best solutions below

4
On BEST ANSWER

I didn't know there are so many methods missing! You can look at the source of rgb_to_grayscale in python and you'll see, how they convert rgb images to grayscale.

I tried to implement it the same way in javascript, but there is no function called tf.tensordot.

Here's how you can do it.

image = tf.ones([224, 224, 3])
rgb_weights = [0.2989, 0.5870, 0.1140]
image = tf.mul(image, rgb_weights)
image = tf.sum(image, axis=-1)
image = tf.expandDims(image, axis=-1)