Почему умножение матриц с матрицей изображений в оттенках серого дает неверный вывод?

#python #opencv #matrix-multiplication #grayscale

Вопрос:

Я загрузил изображение с помощью cv2.imread() Colab и преобразовал его в изображение в оттенках серого. У меня есть матрица B , которую я извлек из того же изображения в оттенках серого. Но когда я пытаюсь умножить его сам по себе, то есть когда я оцениваю B@B , то результат получается матрицей , но его записи не такие, как мы получим при умножении BxB :

 print("Required matrix is:n", b)
print("BxB is:n", b*b)
 

Как я доберусь BxB ?

Ответ №1:

Для массивов NumPy * оператор выполняет поэлементное умножение:

 result[0, 0] = b[0, 0] * b[0, 0]
 

В вашем случае, скорее всего , так и есть dtype=np.uint8 , например, вы столкнулись с переполнением целых чисел:

 result[0, 0] = b[0, 0] * b[0, 0] = 234 * 234 = 54576
 

Поскольку np.uint8 он ограничен диапазоном значений [0, ..., 255] , вам нужно будет получить 54576 % 256 = 228 , который является вашим result[0, 0] .

Итак, если вы действительно хотите иметь поэлементное умножение без переполнения целых чисел, преобразуйте b np.int , например, в.

Или, если вы действительно хотите иметь реальное матричное умножение, также преобразуйте b в np.int , но также используйте соответствующий @ оператор.

Вот несколько кодов для различных вариантов использования:

 import numpy as np

b = np.array([[234, 229], [129, 11]], np.uint8)

print('Matrix b:n', b, 'n')
# Matrix b:
#  [[234 229]
#  [129  11]] 

print('Element-wise multiplication b * b (np.uint8):n',
      b * b, 'n')
# Element-wise multiplication b * b (np.uint8):
#  [[228 217]
#  [  1 121]] 

print('Element-wise multiplication b * b (np.int):n',
      np.int_(b) * np.int_(b), 'n')
# Element-wise multiplication b * b (np.int):
#  [[54756 52441]
#  [16641   121]] 

print('Element-wise multiplication b * b (np.int) % 256:n',
      (np.int_(b) * np.int_(b)) % 256, 'n')
# Element-wise multiplication b * b (np.int) % 256:
#  [[228 217]
#  [  1 121]] 

print('Actual matrix multiplication b @ b (np.int):n',
      (np.int_(b) @ np.int_(b)), 'n')
# Actual matrix multiplication b @ b (np.int):
#  [[84297 56105]
#  [31605 29662]] 
 
 ----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
PyCharm:       2021.1.1
NumPy:         1.20.2
----------------------------------------
 

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

1. Большое спасибо!