выдаёт разные результаты при одинаковых аргументах

Моя задача была проста, открыть цветное изображение через OPENCV(cv2) и для каждого пикселя посчитать разницу между значениями B, G, R(RGB). Насколько я знаю, при открытии через 'cv2.imread' изображение сразу становится многомерным массивом, аналогичным массиву 'numpy'.

Но когда я использую метод из 'numpy' - np.diff() и пытаюсь получить разницу между каналами для отдельного пикселя, вот так: np.diff(IMG[0][0]) выводится неверный результат. То же и при попытке полностью обработать массив вот так: = np.diff(IMG).

Ради эксперимента, позже попытался добавить оси (axis=), но это ни на что не повлияло.

import cv2

import numpy as np

IMG = cv2.imread("IMAGE_PRIMER.png")#Открываю изображение

pix1 = IMG[0][0]#-----------------Пиксель взятый из массива 'IMG'
pix2 = np.array([158, 43, 37])#---Сгенерированный такой-же

#одинаковые пиксели
print("пиксель-1:", pix1) #[158  43  37]
print("пиксель-2:", pix2) #[158  43  37]

#но разные дифференты
print("дифферент-1:", np.diff(IMG[0][0]))   #[141 250]
print("дифферент-2:", np.diff(pix2))        #[-115   -6]

Как видите, сгенерированный пиксель [158 43 37] обработался верно: [-115 -6]

Но аналогичный, взятый с изображения дал результат: [141 250]


Ответы (1 шт):

Автор решения: CrazyElf

Покажу, как можно получить такой же результат:

import numpy as np

pix1 = np.array([158, 43, 37], dtype=np.uint8)
pix2 = np.array([158, 43, 37])

print("дифферент-1:", np.diff(pix1))
print("дифферент-2:", np.diff(pix2)) 

Вывод:

дифферент-1: [141 250]
дифферент-2: [-115   -6]

По умолчанию массивы numpy имеют знаковый тип, например np.int32. А тип массивов с картинками обычно np.uint8, потому что значения пикселов обычно лежат в диапазоне [0, 255]. У вас массивы разных типов. Результаты всех операций над массивом приводятся обратно к его типу. Хотите одинаковый результат - приведите массивы к одному типу.

print(np.diff(pix1.astype(np.int32)))

Вывод:

[-115   -6]

При работе с данными всегда смотрите не только на сами данные, но и на их тип, это важно.

→ Ссылка