(score,diff)= structural_similarity(original_gray,tempered_gray,full=True)
diff = (diff*255).astype("uint8")
print("SSIM:{}".format(score))
Вышеупомянутый код представляет собой фрагмент программы, которая сопоставляет два изображения, используя их оценку SSIM. Чего я здесь не понимаю, так это функции .astype("uint8")
, и почему мы умножаем diff
на 255?
@MateoVial Я думаю, более вероятно, что исходный диапазон составляет 0,0–1,0, и они хотят преобразовать его в 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, что не является оптимальным.
Хм... интересный момент, но я не уверен. Может быть, это то, что вы хотите... В какой-то момент вам просто нужно принять решение о том, как вы хотите округлить данные, в зависимости от распределения ваших данных. Например, у вас также могут быть значения в полуоткрытом интервале, например, из np.random.random()
.
Ваш пример со случайными числами идеально подходит для иллюстрации проблемы, которую я пытаюсь избежать. Скорее всего, в вашем результате не будет ни одного пикселя со значением 255, потому что итоговая полоса слишком мала, а все остальные значения будут распределены равномерно.
Он преобразует все, что вы ему даете, в 8-битное целое число (от 0 до 255) с помощью операции по модулю 256. Поскольку 255 и -1 конгруэнтны по модулю 256, это эквивалентно взятию "симметричного" числа в диапазоне 0-255 (0 возвращает 0, 1 возвращает 255, 2 возвращает 254...). Почему? Никто не может сказать вам без контекста