Хотя @ анонимный ответ превосходен и, по крайней мере, должен быть проголосован, я хочу поближе взглянуть на некоторые конкретные вещи, которые вы делаете, чтобы вы знали, где искать в следующий раз.
Начиная с вашего первого беспокойства по поводу конвертации в double
в imaged = double(image)/255
. Что происходит, когда вы делите значение uint8
, которое составляет от 0 до 255 на 255? Вы получите значение от 0 до 1, конечно. Но что, если выходные данные все еще равны uint8
, например, потому что входной массив равен uint8
? Ну, тогда значение не будет между нулем или единицей. Это будет или ноль или единица (также, конечно), и при правильной настройке динамического диапазона вы увидите чисто черно-белое изображение. Преобразование в double
позволяет получить значения от нуля до единицы.
Практически все остальные ваши вопросы связаны с тем, что MATLAB понимает два формата отображаемых изображений: double
s в диапазоне [0, 1] и uint8
в диапазоне [0, 255].
Ваше преобразование ожидает число в диапазоне [0, e-1], чтобы произвести вывод в диапазоне [0, 1]. Фактический логарифм оказывается за числами в диапазоне [1, 2]. Это потенциальная ошибка в вашем коде. Вы должны либо сделать
imaged = (e-1) * double(image)/255
или эквивалентно
new_image = log(1 + (e-1) * imaged)
или еще лучше
new_image = log2(1 + imaged)
Любая из этих опций предотвратит ненужное усечение динамического диапазона ввода.
Если вы все еще задаетесь вопросом, почему вам нужно нормализовать на 255, посмотрите, что происходит с 255, когда вы проходите, ненормально ли оно через преобразование.
Ваше преобразование обратно в uint8
завершается неудачей, потому что вы делаете это не так, как в «другом» коде. Другой код правильно отображает диапазон [0, 1] в [0, 255]. Ваш текущий код просто конвертирует значения. Как обсуждалось ранее, uint8
может быть только нулем или единицей, а не чем-то промежуточным.
В «другом» коде вы сначала расширили свой динамический диапазон до 255 с помощью оператора new_image = ((imaged-minI)./max(imaged-minI))*255;
. Помните, что, поскольку imaged
- это double
, в этом случае, new_image
. Однако двойные значения корректно отображаются только в диапазоне [0, 1]. После преобразования в uint8
диапазон [0, 255] станет подходящим для отображения.