Это результат того, что ваше новое изображение (типа double
, которое zeros
создает по умолчанию) не имеет тот же тип, что и исходное изображение (обычно тип uint8
). Это можно исправить, инициализировав новое изображение так, чтобы оно имело тот же тип данных, что и исходный, используя функцию class
и передав дополнительный аргумент zeros
:
imgTemp = zeros(rows, columns, class(img));
Причина, по которой он работает правильно, когда вы не инициализируете imgTemp
, заключается в том, что MATLAB инициализирует переменную для вас, используя тип данных img
по умолчанию при выполнении первого индексированного присваивания.
Утилита imshow
ожидает один из стандартных типов изображений в MATLAB . Предполагается, что изображение типа double
будет иметь значения в диапазоне [0 1]
, а изображения типа uint8
будут иметь значения в диапазоне [0 255]
. В вашем примере вы, вероятно, имеете матрицу imgTemp
, которая имеет тип double
, но имеет значения, охватывающие [0 255]
. Еще один способ исправить вашу проблему - явно указать imshow
, какой диапазон значений использовать для отображения (поскольку по умолчанию [0 1]
не работает):
imshow(imgTemp, [0 255]);
Всегда помните о типе данных при манипулировании или обработке изображений. Возможно, вам придется масштабировать или конвертировать туда и обратно, используя тип double
для вычислений (так как целые числа насыщаются) и тип uint8
для отображения и чтения / записи в файлы.