What is the correct way to change image channel ordering between channels first and channels last?

拈花ヽ惹草 提交于 2019-12-03 10:56:59

问题


I can not for the life of me figure out how to switch the image ordering. images are read in (x,x,3) format, theano requires it to be in (3,x,x) format. I tried changing the order with numpy.array([img[:,:,i] for i in range(3)])

which i guess gets the job done, but it is both ugly and i can't figure out how to reverse it to get the original image back.


回答1:


To reorder data

You can use numpy.rollaxis to roll the axis 3 to position 1 (considering you have the batch size as dimension 0).

np.rollaxis(imagesArray, 3, 1)  

But, if you're using keras, you might want to change its configuration or define it per layer. Theano doesn't require anything from you if you're using Keras.

Keras can be configured with channels first or channels last, besides allowing you to define it in every individual layer, so you don't have to change your data.

To configure keras

Find the keras.json file and change it. The file is usually installed in C:\Users\yourusername\.keras or ~/.keras depending on your OS.

Change "image_data_format": "channels_last" to "channels_first" or vice-versa, as you wish.

Usually, working with "channels_last" is less troublesome because of a great amount of other (non convolutional) functions that work only on the last axis.

Defining channel order in layers.

The Keras documentation has all information about parameters for layers, including the data_format parameter.




回答2:


I agree with @Qualia 's comment, np.moveaxis(a, source, destination) is easier to understand. This does the job:

x = np.zeros((12, 12, 3))
x.shape
#yields: 
(12, 12, 3)

x = np.moveaxis(x, -1, 0)
x.shape
#yields: 
(3, 12, 12)



回答3:


x = np.zeros((12, 12, 3))
y = np.rollaxis(x, 2, 0)
y.shape

(3, 12, 12)


来源:https://stackoverflow.com/questions/43829711/what-is-the-correct-way-to-change-image-channel-ordering-between-channels-first

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!