Какую цель здесь имеет .astype("uint8")?

(score,diff)= structural_similarity(original_gray,tempered_gray,full=True)

diff = (diff*255).astype("uint8")
print("SSIM:{}".format(score))

Вышеупомянутый код представляет собой фрагмент программы, которая сопоставляет два изображения, используя их оценку SSIM. Чего я здесь не понимаю, так это функции .astype("uint8"), и почему мы умножаем diff на 255?

Он преобразует все, что вы ему даете, в 8-битное целое число (от 0 до 255) с помощью операции по модулю 256. Поскольку 255 и -1 конгруэнтны по модулю 256, это эквивалентно взятию "симметричного" числа в диапазоне 0-255 (0 возвращает 0, 1 возвращает 255, 2 возвращает 254...). Почему? Никто не может сказать вам без контекста

Mateo Vial 04.05.2022 17:25

@MateoVial Я думаю, более вероятно, что исходный диапазон составляет 0,0–1,0, и они хотят преобразовать его в 0–255.

Mark Ransom 04.05.2022 17:38

Действительно, я не подумал об этом

Mateo Vial 05.05.2022 09:39
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Представьте себе двумерный массив, представляющий изображение в оттенках серого (одноканальное). Как правило, данные изображения могут поступать к вам одним из двух способов:

  1. Значения пикселей представляют собой числа с плавающей запятой в диапазоне от 0 до 1 или...
  2. Значения пикселей — это целые числа в диапазоне от 0 до 255.

Иногда вы также можете увидеть уровни, выраженные в процентах от 0 до 100, но в основном это то же самое, что и (1) выше. Обратите внимание, что (2) может выражать только 255 уровней серого, тогда как (1) имеет почти произвольную точность.

Иногда вам нужно (1), но есть (2), или наоборот. Потому что программное обеспечение или предпочтение или что-то еще.

Чтобы преобразовать из (1) в (2), вы должны умножить на 255 и убедиться, что у вас есть целые числа. Чтобы использовать наименьший объем памяти, вам нужны только 8-битные целые числа, но они бывают двух видов: со знаком (int8, в диапазоне от -128 до +127) и без знака (uint8, в диапазоне от 0 до 255). Для изображений вам всегда нужен неподписанный вид.

Чтобы преобразовать из (2) в (1), вы можете просто разделить на 255, убедившись, что результат может содержать числа с плавающей запятой желаемой точности.

Итак, в вашем коде diff преобразуется из изображения с плавающей запятой в 8-битное.

Лучше умножать на 255,999, чем на 255, чтобы выровнять распределение конечных значений. Если вы этого не сделаете, 0,999999 будет отображаться на 254, что не является оптимальным.

Mark Ransom 06.05.2022 17:04

Хм... интересный момент, но я не уверен. Может быть, это то, что вы хотите... В какой-то момент вам просто нужно принять решение о том, как вы хотите округлить данные, в зависимости от распределения ваших данных. Например, у вас также могут быть значения в полуоткрытом интервале, например, из np.random.random().

kwinkunks 06.05.2022 18:13

Ваш пример со случайными числами идеально подходит для иллюстрации проблемы, которую я пытаюсь избежать. Скорее всего, в вашем результате не будет ни одного пикселя со значением 255, потому что итоговая полоса слишком мала, а все остальные значения будут распределены равномерно.

Mark Ransom 06.05.2022 18:39

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