2016-10-18 3 views
4

Я хочу преобразовать изображение с серой шкалой с формой (height,width) в изображение с 3 каналами с формой (height,width,nchannels). Работа выполнена с for-loop, но должен быть аккуратный способ. Вот фрагмент кода в программе, может кто-нибудь дать подсказку. пожалуйста посоветуй.конвертировать изображение в оттенках серого в 3-канальное изображение

30   if img.shape == (height,width): # if img is grayscale, expand 
31    print "convert 1-channel image to ", nchannels, " image." 
32    new_img = np.zeros((height,width,nchannels)) 
33    for ch in range(nchannels): 
34     for xx in range(height): 
35      for yy in range(width): 
36       new_img[xx,yy,ch] = img[xx,yy] 
37    img = new_img 
+1

В чем вопрос? Если вы просто хотите изменить размеры, это простое изменение формы. Если вы хотите воссоздать цвета, это невозможно без какой-либо модели/предположений. Ваше изображение в оттенках серого не имеет цветовой информации, и все, что вы можете сделать, - это угадывать цвета (которые могут быть простыми и плохими и сложными и не так уж плохими, ограничений нет). – sascha

+0

@sascha Я хочу скопировать изображение с серой шкалой 3 раза, поэтому он согласуется с формой цветного изображения, тогда моя программа может обрабатывать изображения одинаково. Но я хочу иметь лучшую реализацию без петли – Dylan

ответ

12

Вы можете использовать np.stack для достижения этой цели гораздо более сжато:

img = np.array([[1, 2], [3, 4]]) 
stacked_img = np.stack((img,)*3, -1) 
print(stacked_img) 
# array([[[1, 1, 1], 
#   [2, 2, 2]], 
#  [[3, 3, 3], 
#   [4, 4, 4]]]) 
+0

Я думаю, что OP ожидает '[[[1 1 1] [2 2 2]] [[3 3 3] [4 4 4]]]' – furas

+1

@furas Yep ! использование 'axis = -1' достигает этого (создание 3-х каналов) – liamzebedee

2
height, width = 256, 256 
img = np.zeros((height,width)) 
nchannels = 3 
new_img = np.resize(img, (height, width, nchannels)) 

Здесь вы идете. Использовано np.resize.

+0

Невозможно выполнить downvote, имея только 100 rep (я неактивен), но это неправильно. a = np.array ([[0,1], [2,3]]) np.resize (a, (2,2,3)) возвращает: массив ([[[0, 1, 2] ], [3, 0, 1]], [[2, 3, 0], [1, 2, 3]]]) Вместо того, чтобы массив ([[[0, 1, 2], [3, 0, 1]], [[2, 3, 0], [1, 2, 3]]]) Какая жалость, поскольку питон для петель сумасшедший медленный – user2667976

Смежные вопросы