Проблема в том, что ваше изображение имеет тип uint8
. Следующая строка:
r = 255*((img-mn)/(mx-mn));
выполняет вычисления с использованием 8-битных целых чисел. img-mn
должно быть в порядке, но затем вы делите на mx-mn
, в результате чего все ваши пиксели становятся равными 0 или 1 (любое нецелое значение округляется в меньшую сторону). Наконец, умножение на 255 приводит к значениям 0 или 255. Для всех ваших пикселей.
Самое простое решение - выполнить операции с использованием операций с плавающей запятой:
function r = rozciaganie(img);
img = double(img); % convert to double so all arithmetic is floating-point arithmetic
mn = min(img(:)); % better than min(min(img))
mx = max(img(:));
r = 255*((img-mn)/(mx-mn));
r = uint8(r); % convert back to uint8 so the display works as expected
end
Просто переупорядочить целое число арифметика c также не работает должным образом, например, (255*(img-mn))/(mx-mn)
переполняет значения в умножении, все результаты, превышающие 255, становятся 255. При делении после этого эти значения не восстанавливаются. (img-mn)*(255/double(mx-mn))
является наилучшим приближением, но может привести к появлению артефактов округления. Вы можете попробовать это, чтобы увидеть, достаточно ли хороши результаты.