выдаёт разные результаты при одинаковых аргументах
Моя задача была проста, открыть цветное изображение через 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 шт):
Покажу, как можно получить такой же результат:
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]
При работе с данными всегда смотрите не только на сами данные, но и на их тип, это важно.