Я пытаюсь получить журнал изображения для дальнейшей обработки, минимальное значение пикселя в изображении равно нулю, и, следовательно, я пытаюсь взять журнал (1 + изображение), но даже после добавления 1 к каждому элементу минимальное значение массив по-прежнему отображается как 0, и, следовательно, np.log бросает деление на ноль, встречающееся в журнале, и устанавливает значение -inf, что вызывает у меня проблемы в будущем.
import numpy as np
import skimage.io as io
image = io.imread('./PET_image.tif')
image_2 = image + 1
print(np.amin(image))
print(np.amin(image_2))
np.log(image)
оба оператора print np.amin() выводят 0.
0
0
error.py:8: RuntimeWarning: divide by zero encountered in log
np.log(image_2)
Но после добавления 1 в массив минимальное значение не должно быть 1? Я почти уверен, что упускаю что-то очень глупое, но это раскалывает мою голову, и любая помощь очень ценится.
Скорее всего, из-за того, что image.dtype
не имеет знака (например, uint8
), что имеет смысл, поскольку значения пикселей всегда положительные. Из-за типа данных пиксели со значением 255 будут переполнены, когда вы добавите единицу и измените значение на ноль.
image = io.imread('./PET_image.tif').astype(np.uint64)
для чтения в массив 64-битных целых чисел, который не будет переполняться (так легко).
Упс, тут я немного запутался. На самом деле это проблема переполнения. Я отредактировал ответ.
Вместо того, чтобы добавлять 1 к изображению, а затем применять log
. Вы можете просто сделать
np.log1p(image)
что, по сути, делает то же самое, чего вы пытаетесь достичь с помощью этого +1
.
Ошибка, с которой вы столкнулись при использовании +1
, вызвана типом массива dtype=uint8
. Добавление 1 ко всем пикселям превратит пиксели со значением 255 в 0.
Или вы можете добавить 1 только к пикселям, где значение равно 0.
image[np.where(image == 0)] = 1
О, теперь я понял. Спасибо!
О, это сработало. Спасибо. Но я так и не понял в чем проблема? даже если это uint8, он все равно должен хранить все значения от 0 до 255, верно? и при добавлении 1 все нулевые значения должны стать 1, оставив минимум 1? Не могли бы вы немного уточнить? Обновлено: ответ @MatusDubrava развеял мои сомнения. Спасибо, в любом случае.