Минимальный элемент в массиве numpy остается нулевым даже после добавления единицы к каждому элементу поточечно

Я пытаюсь получить журнал изображения для дальнейшей обработки, минимальное значение пикселя в изображении равно нулю, и, следовательно, я пытаюсь взять журнал (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? Я почти уверен, что упускаю что-то очень глупое, но это раскалывает мою голову, и любая помощь очень ценится.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
174
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Скорее всего, из-за того, что image.dtype не имеет знака (например, uint8), что имеет смысл, поскольку значения пикселей всегда положительные. Из-за типа данных пиксели со значением 255 будут переполнены, когда вы добавите единицу и измените значение на ноль.

image = io.imread('./PET_image.tif').astype(np.uint64)

для чтения в массив 64-битных целых чисел, который не будет переполняться (так легко).

О, это сработало. Спасибо. Но я так и не понял в чем проблема? даже если это uint8, он все равно должен хранить все значения от 0 до 255, верно? и при добавлении 1 все нулевые значения должны стать 1, оставив минимум 1? Не могли бы вы немного уточнить? Обновлено: ответ @MatusDubrava развеял мои сомнения. Спасибо, в любом случае.

Merlin11 11.12.2020 14:09

Упс, тут я немного запутался. На самом деле это проблема переполнения. Я отредактировал ответ.

Jussi Nurminen 11.12.2020 14:18
Ответ принят как подходящий

Вместо того, чтобы добавлять 1 к изображению, а затем применять log. Вы можете просто сделать

np.log1p(image)

что, по сути, делает то же самое, чего вы пытаетесь достичь с помощью этого +1.

Ошибка, с которой вы столкнулись при использовании +1, вызвана типом массива dtype=uint8. Добавление 1 ко всем пикселям превратит пиксели со значением 255 в 0.

Или вы можете добавить 1 только к пикселям, где значение равно 0.

image[np.where(image == 0)] = 1

О, теперь я понял. Спасибо!

Merlin11 11.12.2020 14:11

Другие вопросы по теме