Изображение MATLAB imread bmp неверно

У меня есть изображение в градациях серого.

Когда я загружаю его в MATLAB, я обнаружил, что уровни серого не соответствуют исходному изображению. Изображение, прочитанное в MATLAB, ярче, чем исходное изображение. Что я делаю неправильно? Как я могу это решить?

Слева прочитанный матлаб, справа оригинал

введите описание изображения здесь

Исходный файл bmp можно скачать здесь.


person ShineZero    schedule 02.11.2015    source источник


Ответы (1)


Оказывается, с вашим изображением связана цветовая карта. Когда вы делаете X = imread('Lena.bmp');, вы читаете индексированное изображение. Это означает, что каждое значение является индексом в цветовой карте — это не то же самое, что сами фактические интенсивности.

Поэтому считывайте изображение с картой цветов, а затем преобразуйте проиндексированное изображение с картой цветов в фактическое изображение. Вам нужно будет вызвать два варианта вывода imread, затем соответствующим образом преобразуйте проиндексированное изображение с помощью ind2rgb:

[X,map] = imread('Lena.bmp');
im = ind2rgb(X,map);
imshow(im);

Я получаю это изображение, которое соответствует вашему правильному изображению:

введите здесь описание изображения


В будущем, если вы не уверены, есть ли у вашего изображения карта цветов или нет, вызовите вариант с двумя выходами, а затем проверьте, не является ли второй выход, содержащий карту цветов, непустым. Если это так, то вызовите ind2rgb соответственно:

[im, map] = imread('...'); %// Place your input image location here
if ~isempty(map)
    im = ind2rgb(im,map);
end

Поскольку ваше изображение имеет оттенки серого, если вы хотите преобразовать его в одноканальный, используйте либо rgb2gray или извлечь любой канал из изображения. Оттенки серого работают таким образом, что каждый канал в изображении RGB точно такой же.

Следовательно:

im = rgb2gray(im); 
%// Or
%im = im(:,:,1);

Изображение также будет иметь тип double, поэтому для преобразования в uint8 (наиболее распространенный тип) просто выполните:

im = im2uint8(im);
person rayryeng    schedule 02.11.2015
comment
После карты, как мне изменить таблицу rgb на единую таблицу уровней серого? - person ShineZero; 02.11.2015
comment
@ShineZero Это все оттенки серого, поэтому вы можете либо использовать im = rgb2gray(im);, либо просто извлечь один канал: im = im(:,:,1);. В любом случае, это будет то же самое. Я отредактировал свой ответ соответственно. Дайте мне знать, если это сработает! - person rayryeng; 02.11.2015
comment
Еще одна небольшая проблема, могу ли я изменить значение таблицы на 0 ~ 255? - person ShineZero; 02.11.2015
comment
Просто сделайте im = uint8(255*im);. Или, если вам лень, используйте im = im2uint8(im);. - person rayryeng; 02.11.2015