Question: I want to convert an image to 2D array with 5 columns where each row is of the form `[r, g, b, x, y]`. x, y is the position of the pixel and r,g,b are the pixel values. (I will be using this array as input to a machine learning model). Is there a more efficient implementation than this in python?

```
import Image
import numpy as np

im = Image.open("farm.jpg")
col,row =  im.size
data = np.zeros((row*col, 5))
pixels = im.load()
for i in range(row):
    for j in range(col):
        r,g,b =  pixels[i,j]
        data[i*col + j,:] = r,g,b,i,j

```

Answer: 
I had to write this recently and ended up with

```
indices = np.dstack(np.indices(im.shape[:2]))
data = np.concatenate((im, indices), axis=-1)

```

Where `im` is a numpy array. You are probably better off reading the images straight into numpy arrays with

```
from scipy.misc import imread
im = imread("farm.jpg")

```

Or, better still if you have Scikit Image installed

```
from skimage.io import imread
im = imread("farm.jpg")

```
steps are :

1. convert images to grayscale (opencv)
2. convert grayscale to binary image (opencv)
3. convert to binary 2D matrix (scipy , pillow, numpy)

```py
from scipy.ndimage import zoom
from PIL import Image
import numpy as np

srcImage = Image.open("image_in_binary_color.jpg")
grayImage = srcImage.convert('L')
array = np.array(grayImage)
array = zoom(array, 310/174)

np.savetxt("binarized.txt", array<128, fmt="%d")
print("\n\n Output Stored to binarized.txt.......#")

```

4. store it in a file named binarized.txt

This is how i did it : <https://github.com/jithi22/Imagery.git>