Как создать арифметику с элементами 2 разных матриц с помощью numpy?

#python #arrays #image #numpy #opencv

#python #массивы #изображение #numpy #opencv

Вопрос:

Я работаю с компьютерным зрением и хочу вычислить координаты хроматической диаграммы изображения, в которой используется формула:

r = R / (R G B)

Я работаю с массивами numpy и создал двумерный массив для хранения всех значений r .

Я не хочу использовать матричное умножение, потому что я хочу умножать только элементы двух матриц, которые находятся в одном и том же положении (т.Е. finalmatrix[1][1] = matrix[1][1] * othermatrix[1][1] , finalmatrix[1][1] = matrix[2][2] * othermatrix [2][2]...finalmatrix[n][n] = matrix[n][n] * othermatrix [n][n] ).

Код, который я пробовал:

 fruta2 = np.ones((720,1280), dtype= np.uint8)
frutar = np.ones((720, 1280), dtype= np.uint8)
for i in fruta2:
    for j in i:
        frutar[i][j] =  fruta2[i][j] * ((fruta[i][j][0])/(fruta[i][j][0]   fruta[i][j][1]   fruta[i][j][2]))
  

Он вернул ошибку:

 ValueError: operands could not be broadcast together with shapes (1280,) (3,)
  

Переменная fruta представляет собой RGB-изображение фрукта.

Я понимаю, что это не работает, потому что один массив имеет 2 измерения, а другой — 3 измерения. Но я пытаюсь получить доступ к элементам и выполнить с ними арифметику. Что я могу сделать?

Комментарии:

1. Является fruta трехмерным массивом? Если это так, вы можете получить весь красный канал с помощью fruta[:,:,0] , весь зеленый канал с помощью fruta[:,:,1] и синий канал с помощью fruta[:,:,2] и просто выполнить операцию.

2. Да, это так. Это изображение RGB, поэтому оно имеет 3 измерения. Я протестирую ваше предложение, большое вам спасибо.

3. i в вашем цикле находится строка fruta2 , а не индекс. Так fruta2[i] неправильно. Аналогично, j это элемент этой строки, элемент fruta2 2d-массива.

4. Если вы создаете правильные индексы, например, for i in range(fruta2.shape[0]): , используйте frutar[i,j] стиль индексации. Это понятнее, чем [i][j] и более идиоматично для numpy.