Home > Back-end >  numpy.resize throws valueError despite image matrix product equaling the total image size
numpy.resize throws valueError despite image matrix product equaling the total image size

Time:01-29

I am trying to resize a grayscale image into a numpy array like so:

return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)

and getting this error:

ValueError: cannot reshape array of size 1909760 into shape (1024,1865,3)

I've read that the product of an images columns and rows (1024 x 1865) is supposed to equal the size of the array being reshaped - (1909760) which it does. I've also tried the same code on images with three channels and it works.

CodePudding user response:

If you're using the PIL module for your image, you could try converting it to an RGB before getting the data. Something like this should work:

image = image.convert("RGB")
return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)

This works because when you convert from a grayscale to an RGB, PIL automatically sets each pixel to have three values, an R, G, and B.

CodePudding user response:

Do not use .getdata(). That's pointless and a waste of effort. What'll happen is that a python list of integers is constructed as an intermediate. Directly converting to a numpy array is much more efficient.

Just use this:

# image = Image.open(...)
image_array = np.array(image)

Secondly you need to handle the conversion from grayscale to RGB, which you seem to want. Your PIL image appears to be grayscale, yet you want a numpy array with three channels (third dimension sized 3). You can either use PIL to convert, or you can use OpenCV.

PIL: image = image.convert("RGB") before converting to numpy (thanks Timmy Diehl, I don't use PIL that often)

OpenCV: image_array = cv.cvtColor(image_array, cv.COLOR_GRAY2BGR) after converting to numpy

Also note the order of color channels. PIL prefers RGB. OpenCV prefers BGR. What you need depends on what you'll do with the numpy array.

  •  Tags:  
  • Related