np.diff () дает неправильный вывод при использовании в массиве из изображения - PullRequest
0 голосов
/ 03 августа 2020

У меня есть np.array, созданный при чтении изображения. Я заинтересован в создании разницы между альтернативными значениями пикселей. Поэтому я сделал нарезку, как показано ниже.

roi_pixels = np.array(cropped_image[-250:, -1280:])
roi_pixels_even = roi_pixels[::,::2]
roi_pixels_odd = roi_pixels[::,1::2]

Однако, когда я выполняю np.diff для этих массивов, я не улавливаю разницу должным образом. Различия рассчитываются огромными числами, когда разница i отрицательна (pi c разницы, показанной ниже). Я выделил только 3 значения, но их гораздо больше (все значения выше 60K).

Однако, когда я создаю новый массив с этими значениями, как показано ниже, и использую метод np.diff (), все хорошо !!! может ли кто-нибудь помочь, почему я не получаю его должным образом в массиве, который я создаю из изображения?

x = np.array([1545, 1661, 1782, 1992, 1899, 1981, 1980, 1974, 2049, 2033, 2059,
        2049, 2009, 1925, 1710, 1725, 1715, 1643, 1454, 1289,  979,  676,
         649,  637,  715,  763,  787,  769,  788,  822])

If I use abs(np.diff(x)), output is as below
array([116, 121, 210,  93,  82,   1,   6,  75,  16,  26,  10,  40,  84,
       215,  15,  10,  72, 189, 165, 310, 303,  27,  12,  78,  48,  24,
        18,  19,  34]

If I use np.diff(x), output is as below
array([ 116,  121,  210,  -93,   82,   -1,   -6,   75,  -16,   26,  -10,
        -40,  -84, -215,   15,  -10,  -72, -189, -165, -310, -303,  -27,
        -12,   78,   48,   24,  -18,   19,   34])

введите описание изображения здесь

1 Ответ

1 голос
/ 03 августа 2020

np.diff возвращает массив того же dtype, что и входной массив. Если это беззнаковый тип dtype, битовый шаблон отрицательных целых чисел будет преобразован в uint dtype, в результате чего будут получены высокие целые числа.

import numpy as np

np.random.seed(100)
arr = np.random.randint( 2000, size = 10, dtype = np.uint16)

arr
# array([1544,  796,  792,  976, 1859, 1859, 1895,  379, 1879, 1197], dtype=uint16)

np.diff(arr)  # arr has dtype uint16
# array([64788, 65532,   184,   883,     0,    36, 64020,  1500, 64854], dtype=uint16)
# The result has dtype uint16 

signed = arr.astype( np.int16 )  # signed has dtype int16 ( a signed type )
np.diff( signed )
# array([ -748,    -4,   184,   883,     0,    36, -1516,  1500,  -682], dtype=int16)
# The result has dtype int16

Отношения между подписанными и беззнаковыми версиями int16 можно увидеть ниже.

# Take dif as int32 of np.diff( signed )
dif = np.diff( signed ).astype( np.int32 )
dif[ dif < 0 ] += 0x10000  # 2 ** 16 in hex
# Add 2 ** 16 to any negative results
dif
# array([64788, 65532,   184,   883,     0,    36, 64020,  1500, 64854])

# dif == np.diff( arr )
( dif == np.diff(arr) ).all()
# True
...