sebaqu
sebaqu

Reputation: 183

How would you reshape a collection of images from numpy arrays into one big image?

I'm having some trouble reshaping a 4D numpy array to a 2D numpy array. Currently the numpy array is follows, (35280L, 1L, 32L, 32L). The format is number of images, channel, width, height. Basically, I have 35280 image blocks that are 32x32 and I want to combine the image blocks (keeping the indices) to create one big image.

Upvotes: 5

Views: 1373

Answers (2)

B. M.
B. M.

Reputation: 18668

Reshaping is not sufficient, you must carefully rearrange your data with swapaxes.

Sample data :

dims=nbim,_,h,w=np.array([6,1,7,6])
data=arange(dims.prod()).reshape(dims)%256

The images :

figure()
for i in range(nbim):
    subplot(1,nbim,i+1)
    imshow(data[i,0],vmin=0,vmax=255)

enter image description here

and the big image :

#number of images in each dim :
nh = 2 # a choice
nw=nbim // nh

bigim=data.reshape(nh,nw,h,w).swapaxes(1,2).reshape(nh*h,nw*w)
figure()    
imshow(bigim)

enter image description here

Upvotes: 3

John Zwinck
John Zwinck

Reputation: 249444

You have an array like this:

images = np.random.randint(0,256,(35280, 1, 32, 32))

The first thing you need is to figure out (somehow) what the width of the final image is supposed to be. Let's say for this example that it's (441 * 32, 80 * 32).

Then you can do:

image = images.swapaxes(0,2).reshape((441 * 32, -1))

This gives you almost what you need, except the rows are interleaved, so you have:

AAABBBCCC
DDDEEEFFF
GGGHHHIII
AAABBBCCC
DDDEEEFFF
GGGHHHIII

You can then use "fancy indexing" to rearrange the rows:

image[np.array([0,3,1,4,2,5])]

Now you have:

AAABBBCCC
AAABBBCCC
DDDEEEFFF
DDDEEEFFF
GGGHHHIII
GGGHHHIII

I will leave as an exercise the part where you generate the fancy indexing sequence.

Upvotes: 1

Related Questions